diff --git a/cv5/program.c b/cv5/program.c index d361e67..349ef5b 100644 --- a/cv5/program.c +++ b/cv5/program.c @@ -1,17 +1,25 @@ -#include -#include -#include -#include +#include +#include +#include #define SIZE 100 -#define ERROR_OUTPUT stderr - struct student { - char name[SIZE]; - int votes; + 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; + 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, ' '); @@ -22,115 +30,87 @@ int check_and_parse_line(char *line, int *votes, char *name) { } // Konverzia počtu hlasov zo substringu reťazca do celého čísla - *votes = atoi(line); + 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; - // Kopírovanie mena zo zvyšku reťazca (za prvou medzerou) do poľa name - strcpy(name, name_start); - - // Odstránenie konca riadka zo záznamu mena (ak je prítomný) - char *newline_pos = strchr(name, '\n'); - if (newline_pos != NULL) { - *newline_pos = '\0'; + // 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 } -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 najde studenta +// 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 + + // Načítanie a kontrola formátu vstupu + while (1) { + + char* r = fgets(line,SIZE,stdin); + if (r == NULL){ + break; } - } - //printf("nenaslo studenta\n"); // ak nenajde studenta - return -1; -} - - -/*int compare(const void* p1, const void* p2){ - const struct student* s1 = (const struct student*)p1; - const struct student* s2 = (const struct student*)p2; - return strcmp(s2->name, s1->name); -} -*/ - -int main(){ - - struct student databaza[SIZE]; - memset(databaza, 0, SIZE*sizeof(struct student)); //inicializujem pamat, vynulujem - - int size = 0; - char line[SIZE]; - int votes; - char name[SIZE]; - - //nacitanie vstupu - while (fgets(line, SIZE, stdin) != NULL){ - if (!check_line(line, &votes, name)){ - printf(ERROR_OUTPUT, "chybny format vstupu: %s\n", line); - continue; + + if(line[0] == '\n'){ + break; } - - - -/* - memset(line,0,SIZE); - char* r = fgets(line,SIZE,stdin); - if (r == NULL){ - return -1; -} + + if (check_and_parse_line(line, &votes, name) == 0) { + printf("Neplatný formát"); + continue; // Preskoč tento riadok a načítaj ďalší + } -//nacitanie celeho cisla, premiena kym nepride na znak ktory nieje cislo - char* end = NULL; - int value = strtol(line,&end,10); - if (value == 0){ - return 1; -} -// pomocné pole - char name[SIZE]; -// vynulujeme - memset(name,0,SIZE); -// Vypocitame zaciatok mena -// Jedno miesto za medzerou - char* start_name = end + 1; //urcenie zaciatku mena -// Velkost mena je pocet znakov do konca retazca -// minus koniec riadka - int name_size = strlen(start_name) - 1; //urcenie konca mena - if (name_size > 0){ -// nakopirujeme - memcpy(name,start_name,name_size); -// Na konci je v poli name ulozeny retazec s menom -// bez konca riadka a s nulou na konci -} -else { -printf( "nepodarilo sa nacitat meno \n"); -return 1; -} -*/ -//prejde vsetky polozky v databaze + // 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("Databáza je plná\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; + } + } -int id = find_student(databaza,size,name); -if (id< 0){ - if (size < SIZE){ - memcpy(databaza[size].name,name,name_size); - databaza[size].votes = value; - size++; - } - else{ - printf("databaza je plna\n"); - return 1; - } -} -else { - databaza[id].votes = value; -} + // Triedenie študentov pomocou qsort + qsort(databaza, size, sizeof(struct student), compare_students); - printf("Vysledky:\n"); - for (int i = 0; i < size; i++){ - printf ("%d %s\n", databaza[i].votes, databaza[i].name); - } - return 0; + // Výpis výsledkov + printf("Výsledky:\n"); + for (int i = 0; i < size; i++) { + printf("%d %s\n", databaza[i].votes, databaza[i].name); + } + + return 0; } \ No newline at end of file