#include #include #include #include #define SIZE 100 struct student { char name[SIZE]; int votes; }; // Porovnávacia funkcia pre qsort int compare_students(const void *a, const void *b) { const struct student *student_a = (const struct student *)a; const struct student *student_b = (const struct student *)b; if (student_a->votes == student_b->votes) { return strcmp(student_a->name, student_b->name); } return (student_b->votes - student_a->votes); } // Definícia ukazovateľa na vlastný chybový výstup #define MY_ERROR_OUTPUT stderr // Funkcia na kontrolu formátu riadku a načítanie údajov int check_and_parse_line(char *line, int *votes, char *name) { // Nájdenie prvej medzery v reťazci char *space_pos = strchr(line, ' '); // Kontrola, či sa našla medzera if (space_pos == NULL) { return 0; // Neplatný formát riadku } // Konverzia počtu hlasov zo substringu reťazca do celého čísla char *end; *votes = strtol(line, &end, 10); if (*votes == 0) { return 0; // Konverzia sa nepodarila } // Nastavenie ukazovateľa name na miesto za prvou medzerou char *name_start = space_pos + 1; // Načítanie mena memset(name, 0, SIZE); // Vynulovanie pomocného poľa pre meno int name_size = strlen(name_start) - 1; // Veľkosť mena (bez konca riadka) if (name_size > 0) { memcpy(name, name_start, name_size); } else { return 0; // Nepodarilo sa načítať meno } return 1; // Platný formát riadku } // Funkcia na vyhľadanie položky 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; // Ak nájde študenta } } return -1; } int main() { struct student databaza[SIZE]; int size = 0; char line[SIZE]; int votes; // Premenná pre počet hlasov char name[SIZE]; // Pole pre meno bool chyba = false; // Načítanie a kontrola formátu vstupu while (1) { char* r = fgets(line,SIZE,stdin); if (r == NULL){ printf("Nepodarilo nacitat nic\n"); chyba = true; break; } if(line[0] == '\n'){ break; } if (check_and_parse_line(line, &votes, name) == 0) { printf("Neplatny format"); continue; // Preskoč tento riadok a načítaj ďalší } // Kontrola, či sa študent už nachádza v databáze int id = find_student(databaza, size, name); if (id < 0) { // Ak študent nie je v databáze, pridaj ho if (size < SIZE) { strcpy(databaza[size].name, name); databaza[size].votes = votes; size++; } else { printf("Databaza je plna\n"); break; // Ukonči načítavanie, keď je databáza plná } } else { // Ak študent už existuje v databáze, aktualizuj počet hlasov databaza[id].votes += votes; } } // Triedenie študentov pomocou qsort qsort(databaza, size, sizeof(struct student), compare_students); if (chyba == false){ // Výpis výsledkov printf("Vysledky:\n"); for (int i = 0; i < size; i++) { printf("%d %s\n", databaza[i].votes, databaza[i].name); } } return 0; }