pvjc26/du2/program.c

92 lines
2.5 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
#define SIZE 128
int compare(const void* p1, const void* p2);
struct student {
int pocetHlasov;
char meno[SIZE];
char priezvisko[SIZE];
};
int main() {
//citanie vstupu
char line[SIZE];
memset(line,0, sizeof(line));
char* r = fgets(line,SIZE,stdin);
if (r == NULL)
{
printf("Chyba: Zlyhalo nacitavanie vstupu.\n");
}
//helper/pomocne lok. premeny
char najdMeno [32];
char najdPriezvisko [32];
int najdPocetHlasov = 0;
//array instancii struktur studentov
struct student DBStudenti[20];
//prednastavenie pamati
memset(DBStudenti, 0, sizeof(DBStudenti));
//pomocny index
int x = 0;
//spracovanie inputu, vycitavanie najdenych mien a najdenych poctov hlasov z retazca
while (sscanf(line, "%d %s %s", &najdPocetHlasov, najdMeno, najdPriezvisko) != -1)
{
//prekopiruje najdene priezviska
strcpy(DBStudenti[x].meno, najdMeno);
strcpy(DBStudenti[x].priezvisko, najdPriezvisko);
DBStudenti[x].pocetHlasov = najdPocetHlasov;
x += 1;
//reset nacitanych hodnot na konci kazdeho cyklu
// memset(najdMeno, 0, SIZE);
najdPocetHlasov = 0;
}
//zoradenie zoznamu, resp. arrayu
qsort(DBStudenti, 20, sizeof(struct student), compare);
//vypis vysledkov
printf("Vysledky:\n");
for (int i = 0; i < 20; i++)
{
//20 je nahodne cislo, resp. realne budeme vypisovat userov
//, pokial nenarazime na prazdny student ID zaznam
if (DBStudenti[i].meno == '\0')
{
break;
}
//malo by vypisovat zaznamy takto:
//10_Tomas_Vlcek
printf("%d %s %s", DBStudenti[i].pocetHlasov, DBStudenti[i].meno, DBStudenti[i].priezvisko);
}
return 0;
}
int compare(const void* p1, const void* p2)
{
//casting, resp. premena dat. typu pointerov na ich spravny typ
//nakolko qsort() pozaduje od porovnavaciej funkcie, aby akceptovala pointery s lubovolnym dat. typom (const void*)
struct student *s1 = (struct student *)p1;
struct student *s2 = (struct student *)p2;
if (s1->pocetHlasov == s2->pocetHlasov)
{
//vrati lexikograficky zorad. instancie v poli (podla mena, NIE priezviska)
return strcmp(s2->meno, s1->meno);
}
//vrati zaznamy zorad. zostupne
return s2->pocetHlasov - s1->pocetHlasov;
}