diff --git a/28.4.3_romzahl.c b/28.4.3_romzahl.c index dde097c..4df0e06 100644 --- a/28.4.3_romzahl.c +++ b/28.4.3_romzahl.c @@ -1,60 +1,48 @@ #include -// 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; } \ No newline at end of file diff --git a/28.4.3_romzahl2.c b/28.4.3_romzahl2.c new file mode 100644 index 0000000..ad03eed --- /dev/null +++ b/28.4.3_romzahl2.c @@ -0,0 +1,54 @@ +#include + +// 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; +} \ No newline at end of file diff --git a/28.4.4_notenverw.c b/28.4.4_notenverw.c new file mode 100644 index 0000000..be1d1f0 --- /dev/null +++ b/28.4.4_notenverw.c @@ -0,0 +1,88 @@ +#include +#include +#include + +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; +} \ No newline at end of file