diff --git a/du6/program b/du6/program new file mode 100755 index 0000000..6b2896e Binary files /dev/null and b/du6/program differ diff --git a/du6/program.c b/du6/program.c new file mode 100644 index 0000000..45108d8 --- /dev/null +++ b/du6/program.c @@ -0,0 +1,73 @@ +#include //pripojím si potrebné knižnice +#include +#include + +#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 +}