pvjc22/du5/program.c

81 lines
3.9 KiB
C
Raw Normal View History

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