74 lines
3.7 KiB
C
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
|
||
|
}
|