Info2P5/28.4.4_notenverw.c
2025-05-30 07:56:59 +02:00

88 lines
2.7 KiB
C

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