From f0606db4f5240eeaf9454719777ce9412fc714b3 Mon Sep 17 00:00:00 2001 From: Bora Date: Fri, 16 May 2025 07:44:11 +0200 Subject: [PATCH] halo --- 28.2_kommaadd.c | 87 ++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/28.2_kommaadd.c b/28.2_kommaadd.c index f31972e..6427e6c 100644 --- a/28.2_kommaadd.c +++ b/28.2_kommaadd.c @@ -12,77 +12,74 @@ typedef struct { // Funktion zur Einlesung der Zahlen int einlesen(Kommazahl zahlen[], int max) { - char eingabe[100]; - int anzahl = 0; + char eingabe[100]; // Puffer für die Eingabezeile + int anzahl = 0; // Zählt, wie viele Zahlen eingegeben wurden printf("Gib Deine Kommazahlen ein (Abschluss mit Leerzeile)\n"); - while (fgets(eingabe, sizeof(eingabe), stdin)) { - if (eingabe[0] == '\n') break; // Abbruch bei Leerzeile - Kommazahl z; - char *komma = strchr(eingabe, ','); // Suche Komma - if (komma) { - *komma = '\0'; // Trenne Vorkommateil ab - z.vorkomma = atoi(eingabe); // Umwandlung Vorkomma - char *nachkommaStr = komma + 1; - // Entferne evtl. Zeilenumbruch - nachkommaStr[strcspn(nachkommaStr, "\n")] = '\0'; - z.nachstellen = strlen(nachkommaStr); // Anzahl der Nachkommastellen merken - z.nachkomma = atoi(nachkommaStr); // Nachkomma als ganze Zahl - } else { - // Falls kein Komma, dann ist es eine ganze Zahl - z.vorkomma = atoi(eingabe); - z.nachkomma = 0; - z.nachstellen = 0; + while (fgets(eingabe, sizeof(eingabe), stdin)) { // Lies eine Zeile ein + if (eingabe[0] == '\n') break; // Wenn die Zeile leer ist, beende die Eingabe + Kommazahl z; // Neue Kommazahl-Struktur + char *komma = strchr(eingabe, ','); // Suche das Komma in der Eingabe + if (komma) { // Wenn ein Komma gefunden wurde + *komma = '\0'; // Setze das Komma auf Stringende, trennt Vorkomma ab + z.vorkomma = atoi(eingabe); // Wandelt den Vorkommateil in int um + char *nachkommaStr = komma + 1; // Zeiger auf den Nachkommateil + nachkommaStr[strcspn(nachkommaStr, "\n")] = '\0'; // Entfernt Zeilenumbruch am Ende + z.nachstellen = strlen(nachkommaStr); // Zählt die Nachkommastellen + z.nachkomma = atoi(nachkommaStr); // Wandelt Nachkommateil in int um + } else { // Wenn kein Komma gefunden wurde + z.vorkomma = atoi(eingabe); // Ganze Zahl, Vorkomma ist die Zahl + z.nachkomma = 0; // Nachkomma ist 0 + z.nachstellen = 0; // Keine Nachkommastellen } - zahlen[anzahl++] = z; // Speichern der Zahl - if (anzahl >= max) break; + zahlen[anzahl++] = z; // Speichere die Zahl im Array + if (anzahl >= max) break; // Wenn Maximum erreicht, abbrechen } - return anzahl; + return anzahl; // Gibt die Anzahl der eingegebenen Zahlen zurück } // Funktion zur Bestimmung der maximalen Nachkommastellen int max_nachkommastellen(const Kommazahl zahlen[], int anzahl) { - int max_nachstellen = 0; - for (int i = 0; i < anzahl; i++) { - if (zahlen[i].nachstellen > max_nachstellen) { - max_nachstellen = zahlen[i].nachstellen; + int max_nachstellen = 0; // Startwert für Maximum + for (int i = 0; i < anzahl; i++) { // Gehe alle Zahlen durch + if (zahlen[i].nachstellen > max_nachstellen) { // Wenn mehr Nachkommastellen gefunden + max_nachstellen = zahlen[i].nachstellen; // Speichere neues Maximum } } - return max_nachstellen; + return max_nachstellen; // Gibt das Maximum zurück } // Funktion zur Addition der Zahlen mit Skalierung void addiere(const Kommazahl zahlen[], int anzahl, int max_nachstellen, int *summe_vorkomma, long long *summe_nachkomma) { - *summe_vorkomma = 0; - *summe_nachkomma = 0; - for (int i = 0; i < anzahl; i++) { - *summe_vorkomma += zahlen[i].vorkomma; - // Nachkomma auf gemeinsame Basis (z. B. 1.000.000 für 6 Stellen) skalieren - int nachkomma = zahlen[i].nachkomma; + *summe_vorkomma = 0; // Setze Summe Vorkomma auf 0 + *summe_nachkomma = 0; // Setze Summe Nachkomma auf 0 + for (int i = 0; i < anzahl; i++) { // Gehe alle Zahlen durch + *summe_vorkomma += zahlen[i].vorkomma; // Addiere Vorkomma-Anteil + int nachkomma = zahlen[i].nachkomma; // Hole Nachkomma-Anteil + // Skaliere Nachkomma auf die maximale Stellenzahl (z.B. 3 -> 300 bei 2 Nachkommastellen) for (int j = 0; j < max_nachstellen - zahlen[i].nachstellen; j++) { nachkomma *= 10; } - *summe_nachkomma += nachkomma; + *summe_nachkomma += nachkomma; // Addiere skalierten Nachkomma-Anteil } } // Funktion zur Berechnung des Übertrags und Ausgabe void ausgabe(int summe_vorkomma, long long summe_nachkomma, int max_nachstellen) { - // Nachkommaübertrag berechnen - int basis = 1; + int basis = 1; // Basis für Nachkommastellen (z.B. 1000 für 3 Stellen) for (int i = 0; i < max_nachstellen; i++) basis *= 10; - summe_vorkomma += summe_nachkomma / basis; - summe_nachkomma = summe_nachkomma % basis; - // Ausgabe + summe_vorkomma += summe_nachkomma / basis; // Übertrag von Nachkomma zu Vorkomma + summe_nachkomma = summe_nachkomma % basis; // Rest bleibt als Nachkomma + // Ausgabe der Summe, Nachkomma wird mit führenden Nullen ausgegeben printf("= %d,%0*lld\n", summe_vorkomma, max_nachstellen, summe_nachkomma); } int main() { - Kommazahl zahlen[MAX]; // Array zur Speicherung aller eingegebenen Zahlen - int anzahl = einlesen(zahlen, MAX); // Eingabephase - int max_nachstellen = max_nachkommastellen(zahlen, anzahl); // Maximal vorkommende Anzahl von Nachkommastellen finden + Kommazahl zahlen[MAX]; // Array für alle eingegebenen Zahlen + int anzahl = einlesen(zahlen, MAX); // Lies Zahlen ein, gibt Anzahl zurück + int max_nachstellen = max_nachkommastellen(zahlen, anzahl); // Finde maximale Nachkommastellen int summe_vorkomma; long long summe_nachkomma; - addiere(zahlen, anzahl, max_nachstellen, &summe_vorkomma, &summe_nachkomma); // Aufaddieren mit Skalierung - ausgabe(summe_vorkomma, summe_nachkomma, max_nachstellen); // Ausgabe - return 0; + addiere(zahlen, anzahl, max_nachstellen, &summe_vorkomma, &summe_nachkomma); // Addiere alle Zahlen + ausgabe(summe_vorkomma, summe_nachkomma, max_nachstellen); // Gib das Ergebnis aus + return 0; // Programmende } \ No newline at end of file