diff --git a/cv5/program.c b/cv5/program.c index 5e7a146..408633f 100644 --- a/cv5/program.c +++ b/cv5/program.c @@ -2,75 +2,82 @@ #include #include -// Štruktúra reprezentujúca jedného študenta -typedef struct { - char meno[100]; // Meno študenta - int hlasy; // Počet hlasov -} Student; +#define SIZE 100 -// Funkcia na porovnávanie študentov pre qsort -int porovnaj(const void *a, const void *b) { - const Student *studentA = (const Student *)a; - const Student *studentB = (const Student *)b; +struct student { + char name[SIZE]; + int votes; +}; + +// Funkcia pre porovnanie dvoch študentov pri triedení +int compare(const void* p1, const void* p2) { + const struct student* s1 = (const struct student*)p1; + const struct student* s2 = (const struct student*)p2; - // Ak majú rôzny počet hlasov, zoradíme ich zostupne - if (studentA->hlasy != studentB->hlasy) { - return studentB->hlasy - studentA->hlasy; - } else { - // Ak majú rovnaký počet hlasov, zoradíme ich podľa mena vzostupne - return strcmp(studentA->meno, studentB->meno); + // Porovnanie podľa počtu hlasov + return s2->votes - s1->votes; +} + +// 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; // Nájdený študent + } } + return -1; // Študent nenájdený } int main() { - // Deklarácia poľa študentov - Student studenti[1000]; // Predpokladáme, že môže byť maximálne 1000 študentov - int pocetStudentov = 0; - - // Načítanie hlasov - char riadok[200]; - while (fgets(riadok, sizeof(riadok), stdin) != NULL) { - // Načítanie počtu hlasov a mena študenta z riadka - int hlasy; - char meno[100]; - if (sscanf(riadok, "%d %[^\n]", &hlasy, meno) != 2) { - fprintf(stderr, "Chyba pri nacitani hlasov z riadku.\n"); - return 1; + struct student database[SIZE]; + memset(database, 0, SIZE * sizeof(struct student)); + int size = 0; + + char line[SIZE]; + char name[SIZE]; + int votes; + + while (1) { + + fgets(line, SIZE, stdin); + + // Kontrola ukončenia vstupu + if (strcmp(line, "q\n") == 0 || strcmp(line, "Q\n") == 0) { + break; } - // Prehľadanie existujúcich študentov, či už sme nejakého načítali - int najdeny = 0; - for (int i = 0; i < pocetStudentov; i++) { - // Ak sme našli študenta s rovnakým menom, pridáme k jeho počtu hlasov - if (strcmp(studenti[i].meno, meno) == 0) { - studenti[i].hlasy += hlasy; - najdeny = 1; - break; + // Načítanie mena a počtu hlasov zo vstupu + if (sscanf(line, "%s %d", name, &votes) != 2) { + printf("Invalid input. Please try again.\n"); + continue; + } + + // Vyhľadanie študenta v databáze + int index = find_student(database, size, name); + if (index == -1) { + // Študent nenájdený, pridáme ho do databázy + if (size < SIZE) { + strcpy(database[size].name, name); + database[size].votes = votes; + size++; + } else { + printf("Database is full.\n"); } - } - - // Ak sme nenašli existujúceho študenta s rovnakým menom, pridáme nového - if (!najdeny) { - strcpy(studenti[pocetStudentov].meno, meno); - studenti[pocetStudentov].hlasy = hlasy; - pocetStudentov++; + } else { + // Študent nájdený, zvýšime počet hlasov + database[index].votes += votes; } } - - // Ak sme nedostali žiadne hlasy, vypíšeme chybovú správu - if (pocetStudentov == 0) { - fprintf(stderr, "Neboli zadane ziadne hlasy.\n"); - return 1; + + // Triedenie databázy podľa počtu hlasov + qsort(database, size, sizeof(struct student), compare); + + // Výpis triedenej databázy + printf("\nSorted database:\n"); + for (int i = 0; i < size; i++) { + printf("%s %d\n", database[i].votes, database[i].name); } - - // Zoradenie študentov podľa počtu hlasov a mena - qsort(studenti, pocetStudentov, sizeof(Student), porovnaj); - - // Výpis výsledkov - printf("Vysledky:\n"); - for (int i = 0; i < pocetStudentov; i++) { - printf("%d %s\n", studenti[i].hlasy, studenti[i].meno); - } - + return 0; } + database[i].name, database[i].votes \ No newline at end of file