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