pvjc22/du5/program.c
2022-04-26 19:39:24 +02:00

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;
}