diff --git a/cv10/program.c b/cv10/program.c index ab02652..57ef575 100644 --- a/cv10/program.c +++ b/cv10/program.c @@ -2,89 +2,57 @@ #include #include -// Porovnávací funkcia pre qsort +#define SIZE 100 + int porovnaj_mena(const void *a, const void *b) { - return strcmp(*(const char **)a, *(const char **)b); + const char *s1 = *((const char **)a); + const char *s2 = *((const char **)b); + return strcmp(s1, s2); } int main() { - int pocet_prijatych; - // Načítanie počtu študentov na prijatie - if (scanf("%d", &pocet_prijatych) != 1 || pocet_prijatych <= 0) { - puts("Nespravny vstup"); - return 1; - } + char *pole_smernikov[SIZE]; + memset(pole_smernikov, 0, SIZE * sizeof(char *)); + int pocet_mien_v_poli = 0; - // Pole pre zoznam mien študentov - char **zoznam = malloc(pocet_prijatych * sizeof(char *)); - if (zoznam == NULL) { - puts("Chyba alokacie pamäte"); - return 1; - } - - int pocet_prihlasok = 0; - // Načítanie zoznamu prihlášok - while (1) { - char meno[101]; - if (scanf("%100s", meno) != 1) { - puts("Chyba pri citani vstupu"); - free(zoznam); - return 1; + char riadok[SIZE]; + char *r = fgets(riadok, SIZE, stdin); + while (r != NULL && riadok[0] != '\n') { + int pocet_znakov = strlen(riadok) - 1; // Odstránenie konca riadka + // Kontrola, či sa meno už nachádza v poli smerníkov + int najdene = 0; + for (int i = 0; i < pocet_mien_v_poli; i++) { + if (memcmp(pole_smernikov[i], riadok, pocet_znakov) == 0) { + najdene = 1; + break; + } } - // Koniec zoznamu prihlášok - if (meno[0] == '\0') { - break; - } - // Zmena veľkosti poľa, ak už nie je dosť miesta - if (pocet_prihlasok >= pocet_prijatych) { - pocet_prijatych *= 2; - char **nove_zoznam = realloc(zoznam, pocet_prijatych * sizeof(char *)); - if (nove_zoznam == NULL) { - puts("Chyba alokacie pamäte"); - free(zoznam); + // Ak sa meno nenachádza v poli, pridáme ho + if (!najdene) { + pole_smernikov[pocet_mien_v_poli] = malloc(pocet_znakov + 1); + if (pole_smernikov[pocet_mien_v_poli] == NULL) { + puts("Chyba alokacie pamate"); return 1; } - zoznam = nove_zoznam; + memcpy(pole_smernikov[pocet_mien_v_poli], riadok, pocet_znakov); + pole_smernikov[pocet_mien_v_poli][pocet_znakov] = '\0'; // Nulový ukončovač reťazca + pocet_mien_v_poli++; } - // Uloženie mena do zoznamu - zoznam[pocet_prihlasok] = strdup(meno); - if (zoznam[pocet_prihlasok] == NULL) { - puts("Chyba alokacie pamäte"); - free(zoznam); - return 1; - } - pocet_prihlasok++; + r = fgets(riadok, SIZE, stdin); } - // Kontrola, či boli prihlásení nejakí študenti - if (pocet_prihlasok == 0) { - puts("Ziadne prihlasky"); - free(zoznam); - return 1; - } + // Triedenie zoznamu mien + qsort(pole_smernikov, pocet_mien_v_poli, sizeof(char *), porovnaj_mena); - // Usporiadanie zoznamu mien podľa abecedy - qsort(zoznam, pocet_prihlasok, sizeof(char *), porovnaj_mena); - - // Vypísanie prijatých študentov - puts("Prijati studenti:"); - for (int i = 0; i < pocet_prijatych && i < pocet_prihlasok; i++) { - printf("%s\n", zoznam[i]); - } - - // Vypísanie neprijatých študentov - if (pocet_prihlasok > pocet_prijatych) { - puts("Neprijati studenti:"); - for (int i = pocet_prijatych; i < pocet_prihlasok; i++) { - printf("%s\n", zoznam[i]); - } + // Vypísanie zotriedených mien + for (int i = 0; i < pocet_mien_v_poli; i++) { + printf("%s\n", pole_smernikov[i]); } // Uvoľnenie pamäte - for (int i = 0; i < pocet_prihlasok; i++) { - free(zoznam[i]); + for (int i = 0; i < pocet_mien_v_poli; i++) { + free(pole_smernikov[i]); } - free(zoznam); return 0; }