This commit is contained in:
Bora Zuenbuelkoek 2025-05-30 07:56:59 +02:00
parent 1d16bb3625
commit 3408eeeb49
3 changed files with 173 additions and 43 deletions

View File

@ -1,60 +1,48 @@
#include <stdio.h>
// Struktur zur Abbildung von arabisch → römisch
typedef struct Roemisch {
int wert; // Der arabische Zahlenwert (z.B. 1000)
const char *zeichen; // Das zugehörige römische Zeichen (z.B. "M")
} Roemisch_t;
// Struktur für eine römische Ziffer und ihren Wert
typedef struct {
int wert; // Der Wert der Ziffer (z.B. 1)
const char *roemisch; // Das römische Zeichen (z.B. "I")
} RoemZahl;
// Tabelle in absteigender Reihenfolge
// Jede Zeile enthält einen Wert und das zugehörige römische Zeichen
Roemisch_t roemischTabelle[] = {
{1000, "M"},
{900, "CM"},
{500, "D"},
{400, "CD"},
{100, "C"},
{90, "XC"},
{50, "L"},
{40, "XL"},
{10, "X"},
{9, "IX"},
{5, "V"},
{4, "IV"},
{1, "I"}
};
// Hauptfunktion
int main() {
// Tabelle der römischen Ziffern, aufsteigend sortiert (klein nach groß)
RoemZahl ziffern[] = {
{1, "I"},
{4, "IV"},
{5, "V"},
{9, "IX"},
{10, "X"},
{40, "XL"},
{50, "L"},
{90, "XC"},
{100, "C"},
{400, "CD"},
{500, "D"},
{900, "CM"},
{1000, "M"}
};
const int n = sizeof(ziffern) / sizeof(ziffern[0]);
int zahl;
// Benutzer nach einer Zahl fragen
// Zahl vom Benutzer einlesen
printf("Zu wandelnde Zahl: ");
scanf("%d", &zahl);
// Überprüfen, ob die Zahl im erlaubten Bereich liegt (1 bis 3999)
if (zahl <= 0 || zahl > 3999) {
printf("Nur Zahlen zwischen 1 und 3999 erlaubt!\n");
return 1; // Programm mit Fehlercode beenden
}
// Die eingegebene Zahl ausgeben
printf("... %d = ", zahl);
// Über die Tabelle iterieren, um die römische Zahl zu erzeugen
// sizeof(roemischTabelle) / sizeof(Roemisch) berechnet die Anzahl der Einträge in der Tabelle
for (int i = 0; i < sizeof(roemischTabelle) / sizeof(Roemisch_t); i++) {
// Solange der aktuelle Wert in die Zahl "passt"
while (zahl >= roemischTabelle[i].wert) {
// Das zugehörige römische Zeichen ausgeben
printf("%s", roemischTabelle[i].zeichen);
// Den Wert von der Zahl abziehen
zahl -= roemischTabelle[i].wert;
// Über die Ziffern von groß nach klein iterieren (von hinten nach vorne)
for (int i = n - 1; i >= 0; i--) {
// So oft wie möglich die aktuelle Ziffer abziehen und ausgeben
for (int j = 0; j < zahl / ziffern[i].wert; j++) {
printf("%s", ziffern[i].roemisch);
}
zahl %= ziffern[i].wert;
}
// Zeilenumbruch am Ende
printf("\n");
return 0; // Erfolgreiches Programmende
return 0;
}

54
28.4.3_romzahl2.c Normal file
View File

@ -0,0 +1,54 @@
#include <stdio.h>
// Struktur für eine römische Ziffer und ihren Wert
typedef struct {
int wert;
const char *roemisch;
} RoemZahl;
int main() {
// Array aufsteigend sortiert (klein nach groß), inkl. Super-Subtraktionsregeln
RoemZahl ziffern[] = {
{1, "I"},
{4, "IV"},
{5, "V"},
{9, "IX"},
{10, "X"},
{40, "XL"},
{49, "IL"}, // 50 - 1
{50, "L"},
{90, "XC"},
{99, "IC"}, // 100 - 1
{100, "C"},
{400, "CD"},
{499, "ID"}, // 500 - 1
{500, "D"},
{900, "CM"},
{990, "XM"}, // 1000 - 10
{999, "IM"}, // 1000 - 1
{1000, "M"}
};
const int n = sizeof(ziffern) / sizeof(ziffern[0]);
int zahl;
printf("Zu wandelnde Zahl: ");
scanf("%d", &zahl);
if (zahl <= 0 || zahl > 3999) {
printf("Bitte eine Zahl zwischen 1 und 3999 eingeben.\n");
return 1;
}
printf("... %d = ", zahl);
// Von groß nach klein durch das aufsteigende Array
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j < zahl / ziffern[i].wert; j++) {
printf("%s", ziffern[i].roemisch);
}
zahl %= ziffern[i].wert;
}
printf("\n");
return 0;
}

88
28.4.4_notenverw.c Normal file
View File

@ -0,0 +1,88 @@
#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;
}