diff --git a/du5/program b/du5/program new file mode 100755 index 0000000..06f1c87 Binary files /dev/null and b/du5/program differ diff --git a/du5/program.c b/du5/program.c new file mode 100644 index 0000000..dfd0f1e --- /dev/null +++ b/du5/program.c @@ -0,0 +1,80 @@ +#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; +}