#include //pripojím si potrebné knižnice #include #include #define POCET_PRIHLASENYCH_STUDENTOV 100 //zadefinujem potrebné konštanty #define MAXIMALNA_DLZKA_RIADKU 80 typedef struct { //vytvorím štruktúru pre prihlásených súťažiacich char meno[MAXIMALNA_DLZKA_RIADKU]; int pocetHlasov; } PRIHLASENY; int nacitanieSutaziacich(int maximalnaDlzkaRiadku, char riadok[maximalnaDlzkaRiadku]); //inicializujem vlastné funkcie int skontrolujDatabazu(int velkostDatabazy, PRIHLASENY databaza[POCET_PRIHLASENYCH_STUDENTOV], char* vstup); int zotriedenieZaznamov(const void *prvok1, const void *prvok2); int main() { PRIHLASENY databaza[POCET_PRIHLASENYCH_STUDENTOV]; //nainicializujem databázu prihlásených memset(databaza, 0, POCET_PRIHLASENYCH_STUDENTOV * sizeof(struct PRIHLASENY*)); //načítam do nej nulové hodnoty char riadok[MAXIMALNA_DLZKA_RIADKU]; //nainicializujem potrebné premenné char* sutaziaci; int i, stavNacitania, pocetNacitanychHlasov, kontrolaDatabazy = -2, pocetHlasov; for (i = 0; i < POCET_PRIHLASENYCH_STUDENTOV; i++) { //v cykle načítam mená súťažiacich a počty hlasov stavNacitania = nacitanieSutaziacich(MAXIMALNA_DLZKA_RIADKU, riadok); if (stavNacitania == -1) return 0; //ak načítanie vstupu zlyhá, tak program ukončím else if (stavNacitania == 0) break; //ak načítam prázdny riadok, tak vyskočím z cyklu (ukončím načítavanie vstupu) pocetHlasov = strtof(riadok, &sutaziaci); kontrolaDatabazy = skontrolujDatabazu(i - 1, databaza, sutaziaci); //skontrolujem, či sa súťažiaci nachádza v databáze prihlásených if (kontrolaDatabazy == -1) { //ak sa nenachádza, tak ho pridám do databázy databaza[i].pocetHlasov = pocetHlasov; //oddelím od seba počet hlasov od mena súťažiaceho a počet hlasov uložím do pamäte strcpy(databaza[i].meno, sutaziaci); //meno súťažiaceho uložím do databázy } else { //ak je súťažiaci už prihlásený (nachádza sa v databáze), databaza[kontrolaDatabazy].pocetHlasov += pocetHlasov; //tak iba pripočítam počet zadaných hlasov } } pocetNacitanychHlasov = i; //počet načítaných hlasov si uložím do pamäte qsort(databaza, pocetNacitanychHlasov, sizeof(PRIHLASENY), zotriedenieZaznamov); //zotriedim súťažiacich podľa počtu hlasov a ak saa počet hlasov bude zhodovať, tak ich zotriedim lexikograficky (podľa abecedy) printf("Vysledky:\n"); for (i = 0; i <= pocetNacitanychHlasov - 1; i++) { if (databaza[i].pocetHlasov == 0) continue; //ak je daná pozícia prázdna, tak ju nevypíšem printf("%d%s\n", databaza[i].pocetHlasov, databaza[i].meno); //vypíšem zotriedený zoznam súťažiacich } return 0; } int nacitanieSutaziacich(int maximalnaDlzkaRiadku, char riadok[maximalnaDlzkaRiadku]) { //funkcia načíta počet hlasov a meno účastníka char* stav_vstupu = fgets(riadok, maximalnaDlzkaRiadku, stdin); //načítam údaje zo vstupu if (stav_vstupu == NULL) return -1; //ak načítanie zlyhá, tak vrátim NULL else if (strcmp(riadok, "\n") == 0) return 0; //ak načítam prázdny riadok, tak vrátim 0 riadok[strlen(riadok) - 1] = '\0'; return 1; //inak vrátim 1 } int skontrolujDatabazu(int velkostDatabazy, PRIHLASENY databaza[POCET_PRIHLASENYCH_STUDENTOV], char* vstup) { //funkcia skontroluje výskyt mena v databáze int j; for (j = 0; j <= velkostDatabazy; j++) { //preskúmam celú databázu if (strcmp(databaza[j].meno, vstup) == 0) return j; //ak nájdem zhodu, tak vrátim index, na ktorom sa nájdené meno nachádza } return -1; //inak vrátim -1 } int zotriedenieZaznamov(const void *prvok1, const void *prvok2) { //vytvorím triediacu funkciu pre funkciu qsort PRIHLASENY* zaznam1 = (PRIHLASENY*) prvok1; //beztypové prvky prevediem na prvky príslušného typu PRIHLASENY* zaznam2 = (PRIHLASENY*) prvok2; if (zaznam1->pocetHlasov < zaznam2->pocetHlasov) return 1; //vykonám porovnanie prvkov pre ich zotriedenie else if(zaznam1->pocetHlasov == zaznam2->pocetHlasov) return strcmp(zaznam1->meno, zaznam2->meno); else return -1; }