Prosek učenika¶
Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>
Razredni starešina unosi ocene učenika na kraju godine u đačku knjižicu. Napisati program koji pomaže pri računanju proseka i deskriptivne ocene učenika.
Podaci sa tastature se unose u string maksimalne veličine 30 karaktera. Ocene se unose kao jedan string, gde su zarezom i proizvoljnim brojem razmaka razdvojene pojedinačne ocene, koje mogu imati vrednost između 1 i 5. Ocene se iz stringa prebacuju u niz celobrojnih vrednosti maksimalne veličine 10 elemenata. Ukoliko se u stringu pojavi karakter koji nije cifra od 1 do 5, zarez ili razmak, kao i ukoliko je broj ocena veći od zadate veličine celobrojnog niza, ispisati poruku o grešci i zaustaviti dalju obradu stringa. Radi jednostavnosti, računati da je string uvek formata jedan karakter (na primer, ocena), pa proizvoljni broj zareza i razmaka, pa drugi karakter, pa opet proizvoljni broj zareza i razmaka itd.
U slučaju uspešne obrade unetog stringa, od dobijenog niza celobrojnih brojeva izračunati srednju vrednost, na osnovu koje se formira deskriptivna ocena (odrediti minimalnu dimenziju stringa u koji mogu da stanu sve navedene vrednosti):
Od 4.50, uključujući i 4.50, do 5.00, učenik je
odlican
Od 3.50, uključujući i 3.50, do 4.50, učenik je
vrlo dobar
Od 2.50, uključujući i 2.50, do 3.50, učenik je
dobar
Od 1.50, uključujući i 1.50, do 2.50, učenik je
dovoljan
Za sve pozitivne vrednosti manje od 1.50, učenik je
nedovoljan
Program treba da ispisuje celobrojni niz ocena, prosek učenika i deskriptivnu ocenu.
Primer rada programa:
Upisati ocene ucenika: 5,3,4,3,5,2,5
Ocene ucenika: 5, 3, 4, 3, 5, 2, 5
Prosek ucenika: 3.86 vrlo dobar
Primer rada programa u slučaju nevalidnog unosa sa tastature:
Upisati ocene ucenika: 5,3,a,a,6,1
Karakter 'a' u unosu nije validan!
Primer rada programa u slučaju unosa više od dozvoljenog broja ocena:
Upisati ocene ucenika: 5,3,5,2,4,4,4,3,2,1,3,5,5
Moguce je uneti maksimalno 10 ocena!
Primer rada programa u slučaju unosa samo zareza i razmaka:
Upisati ocene ucenika: ,,, ,, ,
Ocene ucenika:
Prosek ucenika: 0.00 nedovoljan
Primer rešenja¶
1#include <stdio.h>
2#include <string.h>
3
4#define MAX_STR_OCENE 31
5#define MAX_STR_DESK_OCENA 11
6#define MAX_OCENE 10
7
8int main() {
9 char ocene_str[MAX_STR_OCENE];
10 int ocene[MAX_OCENE], i, n = 0, validan_unos = 1;
11
12 printf("Upisati ocene ucenika: ");
13 fgets(ocene_str, MAX_STR_OCENE, stdin);
14 int duzina_ocene_str = strlen(ocene_str);
15 if(duzina_ocene_str < MAX_STR_OCENE - 1) ocene_str[duzina_ocene_str - 1] = '\0';
16
17 for(i = 0;i < strlen(ocene_str);i++) {
18 if(ocene_str[i] == ',' || ocene_str[i] == ' ') {
19 continue;
20 } else if(ocene_str[i] >= '1' && ocene_str[i] <= '5') {
21 ocene[n] = ocene_str[i] - '0';
22
23 if(n == MAX_OCENE) {
24 printf("Moguce je uneti maksimalno %d ocena!\n", MAX_OCENE);
25 validan_unos = 0;
26 break;
27 }
28
29 n++;
30 } else {
31 printf("Karakter '%c' u unosu nije validan!\n", ocene_str[i]);
32 validan_unos = 0;
33 break;
34 }
35 }
36
37 if(validan_unos) {
38 printf("Ocene ucenika: ");
39 for(i = 0;i < n;i++) {
40 if(i > 0) {
41 printf(", ");
42 }
43 printf("%d", ocene[i]);
44 }
45 printf("\n");
46
47 int suma_ocena = 0;
48 for(i = 0;i < n;i++) {
49 suma_ocena += ocene[i];
50 }
51
52 double prosek = n != 0 ? (double)suma_ocena / n : 0;
53 char deskriptivna_ocena[MAX_STR_DESK_OCENA];
54
55 if(prosek >= 4.50 && prosek <= 5.00) {
56 strcpy(deskriptivna_ocena, "odlican");
57 } else if(prosek >= 3.50 && prosek < 4.50) {
58 strcpy(deskriptivna_ocena, "vrlo dobar");
59 } else if(prosek >= 2.50 && prosek < 3.50) {
60 strcpy(deskriptivna_ocena, "dobar");
61 } else if(prosek >= 1.50 && prosek < 2.50) {
62 strcpy(deskriptivna_ocena, "dovoljan");
63 } else {
64 strcpy(deskriptivna_ocena, "nedovoljan");
65 }
66
67 printf("Prosek ucenika: %.2lf %s\n", prosek, deskriptivna_ocena);
68 }
69
70 return 0;
71}
72