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