This commit is contained in:
Džubara 2024-04-26 01:41:14 +02:00
parent 40a85c9f89
commit 1c4bcb18c1

View File

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