From a99412436b40df72742b5d41ca700c8f2370d012 Mon Sep 17 00:00:00 2001 From: st529yr Date: Wed, 20 Mar 2024 16:42:19 +0100 Subject: [PATCH] funguje --- cv5/program.c | 80 +++++++++++++++++++-------------------------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/cv5/program.c b/cv5/program.c index 8322d7e..ba4a8fd 100644 --- a/cv5/program.c +++ b/cv5/program.c @@ -3,79 +3,59 @@ #include #define SIZE 100 -#define MAX_NAME_LENGTH 20 -// Definícia štruktúry pre uloženie jednej položky databázy +// Definícia štruktúry pre uchovanie informácií o študentovi struct student { - char name[MAX_NAME_LENGTH]; + char name[SIZE]; int votes; }; -// Funkcia pre porovnanie dvoch záznamov študentov -int compare(const void *p1, const void *p2) { - const struct student *s1 = (const struct student *)p1; - const struct student *s2 = (const struct student *)p2; +// Funkcia pre porovnanie dvoch záznamov +int compare(const void* p1, const void* p2){ + struct student* s1 = (struct student*)p1; + struct student* s2 = (struct student*)p2; - // Porovnanie počtu hlasov + // Porovnávanie podľa počtu hlasov, ak sú rovnaké, potom podľa abecedy if (s1->votes != s2->votes) { return s2->votes - s1->votes; // Zoradenie zostupne podľa počtu hlasov } else { - // Ak majú rovnaký počet hlasov, zoradíme lexikograficky podľa mena - return strcmp(s1->name, s2->name); + return strcmp(s1->name, s2->name); // Zoradenie abecedne } } -// Funkcia na vyhľadanie študenta v databáze -int find_student(struct student *students, int size, const char *name) { - for (int i = 0; i < size; i++) { - if (strcmp(students[i].name, name) == 0) { - return i; // Študent nájdený - } - } - return -1; // Študent nenájdený -} - int main() { - struct student database[SIZE]; - memset(database, 0, SIZE * sizeof(struct student)); - int size = 0; + struct student database[SIZE]; // Databáza študentov + memset(database, 0, SIZE * sizeof(struct student)); // Inicializácia pamäte + int size = 0; // Aktuálny počet študentov v databáze - // Vlastný vstup mien a počtu hlasov - char *input[] = { - "2 Bardos Mrtakrys", - "1 Rita Umhi", - "1 Prylenn Alak", - "10 Lak'hi Elavorg", - "3 Prylenn Alak", - "3 Prylenn Alak", - "3 Prylenn Alak", - "1 Rita Umhi" - }; - int input_size = sizeof(input) / sizeof(input[0]); - - // Spracovanie vstupu - for (int i = 0; i < input_size; i++) { - char name[MAX_NAME_LENGTH]; + // Načítanie vstupu a spracovanie hlasov + char line[SIZE]; + while (fgets(line, SIZE, stdin) != NULL) { + // Rozdelenie riadku na počet hlasov a meno int votes; - sscanf(input[i], "%d %s", &votes, name); + char name[SIZE]; + sscanf(line, "%d %[^\n]", &votes, name); - int idx = find_student(database, size, name); - if (idx == -1) { - // Študent nie je v databáze, pridáme ho - if (size >= SIZE) { - fprintf(stderr, "Prekročený limit databázy\n"); - return 1; + // Hľadanie študenta v databáze + int index = -1; + for (int i = 0; i < size; i++) { + if (strcmp(database[i].name, name) == 0) { + index = i; + break; } + } + + // Aktualizácia databázy + if (index == -1) { // Študent ešte nie je v databáze strcpy(database[size].name, name); database[size].votes = votes; size++; - } else { - // Študent je v databáze, pripočítame hlasy - database[idx].votes += votes; + } else { // Študent je už v databáze + database[index].votes += votes; } } - // Zoradenie databázy + // Zoradenie databázy podľa počtu hlasov a abecedne qsort(database, size, sizeof(struct student), compare); // Výpis výsledkov