#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Schueler {
    char name[30];
    char vorname[30];
    int note;
} Schueler_t;

int main() {
    Schueler_t *klasse = NULL;      // Dynamisches Array für Schüler
    int anzahl = 0;                 // Aktuelle Anzahl der Schüler
    int kapazitaet = 0;             // Aktuelle Kapazität des Arrays
    int summe = 0;
    int haeufigkeit[6] = {0};       // Notenspiegel

    while (1) {
        // Speicher vergrößern, falls nötig
        if (anzahl >= kapazitaet) {
            kapazitaet = kapazitaet == 0 ? 10 : kapazitaet * 2;
            Schueler_t *tmp = realloc(klasse, kapazitaet * sizeof(Schueler_t));
            if (!tmp) {
                printf("Speicherfehler!\n");
                free(klasse);
                return 1;
            }
            klasse = tmp;
        }

        printf("\n----Eingabe des %d. Schuelers----\n", anzahl + 1);

        printf("Name (oder ENTER zum Beenden): ");
        if (fgets(klasse[anzahl].name, sizeof(klasse[anzahl].name), stdin) == NULL)
            break;
        klasse[anzahl].name[strcspn(klasse[anzahl].name, "\n")] = 0;
        if (klasse[anzahl].name[0] == '\0')
            break;

        printf("Vorname: ");
        if (fgets(klasse[anzahl].vorname, sizeof(klasse[anzahl].vorname), stdin) == NULL)
            break;
        klasse[anzahl].vorname[strcspn(klasse[anzahl].vorname, "\n")] = 0;

        do {
            printf("Note (1-6): ");
            if (scanf("%d", &klasse[anzahl].note) != 1) {
                while (getchar() != '\n');
                printf("Ungültige Eingabe. Abbruch.\n");
                free(klasse);
                return 1;
            }
        } while (klasse[anzahl].note < 1 || klasse[anzahl].note > 6);

        // Eingabepuffer leeren (wegen scanf)
        while (getchar() != '\n');

        summe += klasse[anzahl].note;
        haeufigkeit[klasse[anzahl].note - 1]++;
        anzahl++;
    }

    if (anzahl == 0) {
        printf("Keine Schüler eingegeben.\n");
        free(klasse);
        return 0;
    }

    // Übersicht ausgeben
    printf("\n%-4s %-15s %-15s %-5s\n", "Nr.", "Name", "Vorname", "Note");
    for (int i = 0; i < anzahl; i++) {
        printf("%-4d %-15s %-15s %-5d\n", i + 1, klasse[i].name, klasse[i].vorname, klasse[i].note);
    }
    // Durchschnittsnote
    double durchschnitt = (double)summe / anzahl;
    printf("\n....Durchschnittsnote: %.2f\n", durchschnitt);
    // Notenspiegel
    printf("....Notenspiegel\n");
    for (int i = 0; i < 6; i++) {
        printf("Note %d: ", i + 1);
        for (int j = 0; j < haeufigkeit[i]; j++) {
            printf("*");
        }
        printf("\n");
    }
    free(klasse);
    return 0;
}