From 4d9f0b6e847b3b096cd2cfb9dbb259b19a57e390 Mon Sep 17 00:00:00 2001 From: Bora Date: Fri, 16 May 2025 07:17:22 +0200 Subject: [PATCH] halo --- 28.2_kommaadd.c | 128 ++++++++++++++++++++++++++++-------------------- a.exe | Bin 258377 -> 258377 bytes 2 files changed, 76 insertions(+), 52 deletions(-) diff --git a/28.2_kommaadd.c b/28.2_kommaadd.c index f8b855d..f31972e 100644 --- a/28.2_kommaadd.c +++ b/28.2_kommaadd.c @@ -2,63 +2,87 @@ #include #include #define MAX 100 // Maximale Anzahl an Zahlen + // Struktur zur Speicherung einer Zahl mit Vorkomma- und Nachkommateil typedef struct { int vorkomma; // Ganzzahliger Teil vor dem Komma int nachkomma; // Nachkommateil als ganze Zahl int nachstellen; // Anzahl der Nachkommastellen } Kommazahl; + +// Funktion zur Einlesung der Zahlen +int einlesen(Kommazahl zahlen[], int max) { + char eingabe[100]; + int anzahl = 0; + 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; + } + zahlen[anzahl++] = z; // Speichern der Zahl + if (anzahl >= max) break; + } + return anzahl; +} + +// 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; + } + } + return max_nachstellen; +} + +// 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; + for (int j = 0; j < max_nachstellen - zahlen[i].nachstellen; j++) { + nachkomma *= 10; + } + *summe_nachkomma += nachkomma; + } +} + +// 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; + for (int i = 0; i < max_nachstellen; i++) basis *= 10; + summe_vorkomma += summe_nachkomma / basis; + summe_nachkomma = summe_nachkomma % basis; + // Ausgabe + printf("= %d,%0*lld\n", summe_vorkomma, max_nachstellen, summe_nachkomma); +} + int main() { - Kommazahl zahlen[MAX]; // Array zur Speicherung aller eingegebenen Zahlen - char eingabe[100]; // Eingabepuffer - int anzahl = 0; // Zähler für Anzahl der eingegebenen Zahlen - // Eingabephase - 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; - } - zahlen[anzahl++] = z; // Speichern der Zahl - } - // Maximal vorkommende Anzahl von Nachkommastellen finden - int max_nachstellen = 0; - for (int i = 0; i < anzahl; i++) { - if (zahlen[i].nachstellen > max_nachstellen) { - max_nachstellen = zahlen[i].nachstellen; - } - } - // Aufaddieren mit Skalierung - int summe_vorkomma = 0; - long long 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 faktor = 1; - for (int j = 0; j < max_nachstellen - zahlen[i].nachstellen; j++) { - zahlen[i].nachkomma *= 10; - } - summe_nachkomma += zahlen[i].nachkomma; - } - // Nachkommaübertrag berechnen - int basis = 1; - for (int i = 0; i < max_nachstellen; i++) basis *= 10; - summe_vorkomma += summe_nachkomma / basis; - summe_nachkomma = summe_nachkomma % basis; - // Ausgabe - printf("= %d,%0*lld\n", summe_vorkomma, max_nachstellen, summe_nachkomma); - return 0; + 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 + 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; } \ No newline at end of file diff --git a/a.exe b/a.exe index 56a7cb16d989b3a873b453236fb5ca7106f8ad4c..dc4b3b15bbc9a1ab5b520f060401c7b03cce94f9 100644 GIT binary patch delta 31 pcmV+)0O0@0;t$E<50HohNXjOWi%kO0w}IM)+5v^y0=3!$Z}9rC55@oh delta 31 ncmX^4i2vjx{s|q-2W;dgcKb3pXf@tyy~Wsii)rgE=KK!;=(i4y