81 lines
3.9 KiB
C
81 lines
3.9 KiB
C
#include <stdio.h> //pripojím si potrebné knižnice
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#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;
|
|
}
|