pvjc22/du6/program.c
2022-04-26 19:39:46 +02:00

74 lines
3.7 KiB
C

#include <stdio.h> //pripojím si potrebné knižnice
#include <stdlib.h>
#include <string.h>
#define DLZKA_RETAZCA 100 //zadefinujem si potrebnú konštantu
int zotriedeniePodlaAbecedy(const void *retazec1, const void *retazec2); //nainicializujem vlastné funkcie
int kontrolaDatabazy(int pocetRetazcov, char** zoznamRetazcov, char* vstup);
int main() {
int pocetMien = 1, i; //nainicializujem si potrebné premenné
char vstup[DLZKA_RETAZCA];
char** zoznamMien;
if (fgets(vstup, DLZKA_RETAZCA, stdin) == NULL) { //načítam počet prijatých žiakov a ak načítanie zlyhá,
printf("Nespravny vstup\n"); //tak vypíšem chybovú hlášku
return 0; //a program ukončím
}
int pocetPrijatychZiakov = (int) strtol(vstup, NULL, 10); //zadané číslo prevediem zo znaku na matematické číslo
if (pocetPrijatychZiakov == 0) { //ak je prevod neúspešný, alebo ak zadané číslo je 0,
printf("Ziadne prihlasky\n"); //tak vypíšem chybovú hlášku
return 0; //a program ukončím
}
zoznamMien = (char**) malloc(sizeof(char*)); //dynamicky alokujem potrebnú časť pamäte počítača
zoznamMien[0] = (char*) malloc(DLZKA_RETAZCA * sizeof(char)); //dynamicky alokujem bunku dvojrozmerného poľa
while (1) {
if (fgets(vstup, DLZKA_RETAZCA, stdin) == NULL) return 0; //načítam meno uchádzača a ak zlyhá načítanie vstupu, tak program ukončím
else if (strcmp(vstup, "\n") == 0) break; //ak bude vstupom iba prázdny riadok, tak program ukončím
if (kontrolaDatabazy(pocetMien, zoznamMien, vstup) == EXIT_SUCCESS) continue; //ak sa už meno v databáze nachádza, tak ho už znova do databázy nezaradím
memcpy(zoznamMien[pocetMien - 1], vstup, DLZKA_RETAZCA); //meno žiaka skopírujem do databázy
pocetMien++; //zvýšim množstvo alokovanej pamäte pre zaznamenívanie hlásiacich sa študentov
zoznamMien = realloc(zoznamMien, pocetMien * sizeof(char*)); //realokujem (zväčším) pamäť
zoznamMien[pocetMien - 1] = (char*) malloc(DLZKA_RETAZCA * sizeof(char)); //následne dynamicky alokujem novovytvorenú pamäťovú bunku
}
qsort(zoznamMien, pocetMien, sizeof(char**), zotriedeniePodlaAbecedy); //vytvorený zoznam zotriedim podľa abecedy
//vypíšem kompletný menný zoznam prihlásených študentov
printf("Prijati studenti:\n"); //najprv prijatých
for (i = 0; i < pocetMien; i++) {
printf("%s", zoznamMien[i]); //vypíšem jednotlivé mená
if (pocetMien > pocetPrijatychZiakov + 1) { //ak je prihládených viac študentov, než je prijatých,
if (i == pocetPrijatychZiakov) printf("Neprijati studenti:\n"); //tak vypíšem aj mená neprijatýách študentov (funkcia na tomto riadku v skutočnosti iba vypíše oznam, že študenti v pokračujúcom výpise nie sú prijatí)
}
}
for (i = 0; i < pocetMien; i++) free(zoznamMien[i]);
free(zoznamMien); //vyčistím dynamicky alokovanú pamäť
return 0;
}
int kontrolaDatabazy(int pocetRetazcov, char** zoznamRetazcov, char* vstup) { //funkcia skontroluje výskyt rovnakých reťazcov v databáze
int j; //nainicializujem potrebnú premennú
for (j = 0; j < pocetRetazcov - 1; j++) { //porovnám všetky reťazce
if (strcmp(zoznamRetazcov[j], vstup) == 0) return EXIT_SUCCESS; //ak som našiel zhodný reťazec, tak vrátim hodnotu EXIT_SUCCESS
}
return EXIT_FAILURE; //inak vrátim hodnotu EXIT_FAILURE
}
int zotriedeniePodlaAbecedy(const void *retazec1, const void *retazec2) { //vytvorím funkciu pre zotriedenie reťazcov podľa abecedy (logika pre qsort)
char** vstupnyRetazec1 = (char**) retazec1; //prevediem neutrálne vstupy na polia s reťazcami
char** vstupnyRetazec2 = (char**) retazec2;
return strcmp(*vstupnyRetazec1, *vstupnyRetazec2); //a následne porovnám jednotlivé reťazce
}