#include #include #include #include #include #define SIZE 128 int compare(const void* p1, const void* p2); struct student { int pocetHlasov; char meno[SIZE]; char priezvisko[SIZE]; }; int main() { //nastavenie vstupu char line[SIZE]; memset(line,0, sizeof(line)); //helper/pomocne lok. premeny char najdMeno [32]; char najdPriezvisko [32]; int najdPocetHlasov = 0; int x = 0; //vlastny barebones mechanizmus na vyhadzovanie chyb pri citani bool prvyZaznamReadExceptionThrown = 0; //array instancii struktur studentov struct student DBStudenti[20]; //prednastavenie pamati memset(DBStudenti, 0, sizeof(DBStudenti)); //spracovanie inputu, vycitavanie najdenych mien a najdenych poctov hlasov z retazca //bude citat dovtedy, pokial nedosiahne limit studentDB array-u (20 prvkov max) alebo fgets() sa nedostane na koniec suboru while (x < 20 && fgets(line, SIZE, stdin) != NULL) { //poistka - zacne vyskoci z kodu, ak je prvy char neplatny char* linePtr = line; if (!isdigit(*linePtr)) { if (x == 0) //ak chyba nastala hned pri citani prveho zaznamu { prvyZaznamReadExceptionThrown = true; } linePtr++; break; } if(sscanf(line, "%d %s %s", &najdPocetHlasov, najdMeno, najdPriezvisko) == 3) { int najdDuplikatIndex = -1; //dost neefektivny a predbezny sposob hladania duplikatov.. for (int i = 0; i < x; i++) { if (strcmp(DBStudenti[i].meno, najdMeno) == 0) { najdDuplikatIndex = i; break; } } //prekopiruje udaje najdeneho zaznamu do DB // (LEN ak sscanf() najde vsetky 3 hodnoty a nebol najdeny index duplicitneho zaznamu) if (najdDuplikatIndex < 0) { strcpy(DBStudenti[x].meno, najdMeno); strcpy(DBStudenti[x].priezvisko, najdPriezvisko); DBStudenti[x].pocetHlasov = najdPocetHlasov; x += 1; } else { DBStudenti[najdDuplikatIndex].pocetHlasov += najdPocetHlasov; } //(pravdepodobne redundantne) reset nacitanych hodnot na konci kazdeho cyklu // memset(najdMeno, 0, SIZE); najdPocetHlasov = 0; } } if (x == 0) { prvyZaznamReadExceptionThrown = true; } //zoradenie zoznamu, resp. arrayu qsort(DBStudenti, 20, sizeof(struct student), compare); if (prvyZaznamReadExceptionThrown) { printf("Nepodarilo nacitat nic\n"); return 0; } //vypis vysledkov printf("Vysledky:\n"); for (int i = 0; i < 20; i++) { //20 je nahodne cislo, resp. realne budeme vypisovat userov //, pokial nenarazime na prazdny student ID zaznam if (DBStudenti[i].meno[0] == '\0') { break; } //malo by vypisovat zaznamy takto: //10_Tomas_Vlcek printf("%d %s %s\n", DBStudenti[i].pocetHlasov, DBStudenti[i].meno, DBStudenti[i].priezvisko); } return 0; } int compare(const void* p1, const void* p2) { //casting, resp. premena dat. typu pointerov na ich spravny typ //nakolko qsort() pozaduje od porovnavaciej funkcie, aby akceptovala pointery s lubovolnym dat. typom (const void*) struct student *s1 = (struct student *)p1; struct student *s2 = (struct student *)p2; if (s1->pocetHlasov == s2->pocetHlasov) { //vrati lexikograficky zoradene instancie v poli (podla mena, NIE priezviska) return strcmp(s1->meno, s2->meno); } //vrati zaznamy zorad. zostupne return s2->pocetHlasov - s1->pocetHlasov; }