From a46ed29cd2076c96dc885fc4f69cb7c3197e1598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ka=C4=8Dm=C3=A1r?= Date: Fri, 21 Mar 2025 11:02:48 +0000 Subject: [PATCH] Update du4/program.c --- du4/program.c | 54 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/du4/program.c b/du4/program.c index 757e820..bc13c83 100644 --- a/du4/program.c +++ b/du4/program.c @@ -3,77 +3,91 @@ #include #include -#define MAX_NAME 100 -#define MAX_ENTRIES 100 +#define MAX_NAME 100 // Maximalna dlzka mena studenta +#define MAX_ENTRIES 100 // Maximalny pocet studentov +// Struktura reprezentujuca studenta a jeho pocet hlasov typedef struct { - char *name; - int votes; + char *name; // Meno studenta + int votes; // Pocet hlasov } Student; +// Pole ukazatelov na studentov a pocitadlo studentov Student *students[MAX_ENTRIES]; int student_count = 0; +// Funkcia na najdenie existujuceho studenta alebo pridanie noveho Student *find_or_add(const char *name) { + // Hladanie studenta v existujucom zozname for (int i = 0; i < student_count; i++) { if (strcmp(students[i]->name, name) == 0) { - return students[i]; + return students[i]; // Ak student existuje, vratime jeho ukazatel } } + // Ak student nie je v zozname a je miesto, pridame ho if (student_count < MAX_ENTRIES) { - Student *new_student = (Student *)malloc(sizeof(Student)); - new_student->name = strdup(name); - new_student->votes = 0; - students[student_count++] = new_student; + Student *new_student = (Student *)malloc(sizeof(Student)); // Alokacia pamate pre noveho studenta + new_student->name = strdup(name); // Kopia mena + new_student->votes = 0; // Inicializacia hlasov na 0 + students[student_count++] = new_student; // Pridanie do pola return new_student; } - return NULL; + return NULL; // Ak uz nie je miesto, vratime NULL } +// Funkcia na zoradenie studentov podla hlasov a mena (ak maju rovnaky pocet hlasov) int compare(const void *a, const void *b) { Student *s1 = *(Student **)a; Student *s2 = *(Student **)b; return (s2->votes != s1->votes) ? (s2->votes - s1->votes) : strcmp(s1->name, s2->name); } +// Funkcia na uvolnenie alokovanej pamate void free_memory() { for (int i = 0; i < student_count; i++) { - free(students[i]->name); - free(students[i]); + free(students[i]->name); // Uvolnenie pamate mena + free(students[i]); // Uvolnenie pamate studenta } } int main() { - char line[MAX_NAME + 10]; - int votes; - char name[MAX_NAME]; - int has_data = 0; + char line[MAX_NAME + 10]; // Buffer na citanie riadkov zo vstupu + int votes; // Pocet hlasov + char name[MAX_NAME]; // Meno studenta + int has_data = 0; // Indikator ci boli nacitane nejake data + // Citanie vstupu zo standardneho vstupu (stdin) while (fgets(line, sizeof(line), stdin)) { - // Preskočí prázdne riadky + // Preskoci prazdne riadky if (strlen(line) <= 1) continue; - if (sscanf(line, "%d %[^\n]", &votes, name) != 2 || votes < 0) { - continue; // Namiesto prerušenia len ignoruje neplatné riadky + // Parsovanie vstupu: ocakava sa format "pocet_hlasov meno" + if (sscanf(line, "%d %[^"]n", &votes, name) != 2 || votes < 0) { + continue; // Ak format nesedi alebo su zaporne hlasy, ignorujeme riadok } + // Najdenie alebo pridanie studenta a pridanie hlasov Student *student = find_or_add(name); if (student) student->votes += votes; - has_data = 1; + has_data = 1; // Nastavenie flagu, ze mame platne data } + // Ak neboli nacitane platne data, vypise sa sprava a ukonci program if (!has_data) { printf("Nepodarilo nacitat nic\n"); return 1; } + // Zoradenie studentov podla poctu hlasov a mena qsort(students, student_count, sizeof(Student *), compare); + // Vypis vysledkov printf("Vysledky:\n"); for (int i = 0; i < student_count; i++) { printf("%d %s\n", students[i]->votes, students[i]->name); } + // Uvolnenie alokovanej pamate free_memory(); return 0; }