From ced22cc6fc25593fbef593cb8ff1aa35814d1da0 Mon Sep 17 00:00:00 2001 From: alexchilab Date: Thu, 15 May 2025 14:30:29 +0200 Subject: [PATCH] Program: 28.5.2.c --- 28.2.2.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 28.2.2.c diff --git a/28.2.2.c b/28.2.2.c new file mode 100644 index 0000000..160d6e8 --- /dev/null +++ b/28.2.2.c @@ -0,0 +1,117 @@ +#include +#include +#include +#include //power +#include +#define MAX_LEN 100 + +struct Zahl +{ + int vorkomma; + int nachkomma; + int len; +}; + +int EingabeKomma(struct Zahl *i) //die Funktion gibt einen ganzzahligen Wert zurück (0 für Erfolg, 1 für Abbruch); struct Zahl *i – Erwartet einen Zeiger auf eine Zahl-Struktur +{ + char str[MAX_LEN]; //Reserviert einen Zeichenarray mit der Länge MAX_LEN + fgets(str, MAX_LEN, stdin); //fgets() liest eine ganze Zeile vom Standard-Input (stdin) ein; str – Der Puffer, in den der Text geschrieben wird + + if (str[0] == '\n') + { + return 1; + } + + sscanf(str, "%d,%d", &i->vorkomma, &i->nachkomma); + + char *str2 = strtok(str, ","); + str2 = strtok(NULL, ","); //strtok() verändert den Original-String direkt + + i->len = strlen(str2); ////strlen() – Bestimmt die Länge des Nachkommateils (str2) + if (str2[i->len - 1] == '\n') //i->len - 1: Der letzte Buchstabe hat den Index Länge - 1 + { + i->len--; //Wenn '\n' gefunden wird, wird die Länge um 1 reduziert + } + + return 0; +} + +void Kommaaddieren(struct Zahl *sum, struct Zahl *summand) //Diese Funktion addiert eine neue Kommazahl (summand) zur bestehenden Summe (sum) +{ + if (summand->len > sum->len) + { + for (int i = 0; i < (summand->len - sum->len); i++) //Multipliziert den Nachkommateil der Summe so oft mit 10, bis beide die gleiche Anzahl an Nachkommastellen haben + { + sum->nachkomma *= 10; + } + sum->len = summand->len; //Passt die Länge der Summe an die des Summanden an, damit die Addition korrekt funktioniert + } + else if (summand->len < sum->len) //Prüft, ob die Nachkommastellen des Summanden länger sind als die der aktuellen Summe + { + for (int i = 0; i < (sum->len - summand->len); i++) + { + summand->nachkomma *= 10; + } + } + + sum->nachkomma += summand->nachkomma; + + int power_of_ten = 1; + for (int i = 0; i < sum->len; i++) + { + power_of_ten *= 10; + } + + if (sum->nachkomma >= power_of_ten) // Wenn die Nachkommastellen größer oder gleich 10^len sind: + { + sum->nachkomma -= power_of_ten; + sum->vorkomma += 1; + } + + sum->vorkomma += summand->vorkomma; +} + +void AusgabeKomma(struct Zahl *sum) +{ + printf("Ergebnis:\n%d,", sum->vorkomma); + printf("%0*d", sum->len, sum->nachkomma); +} + +int AnzahlNachkommastellen(struct Zahl *i) +{ + int temp = i->nachkomma; + int len = 0; + + if (temp == 0) + { + return 1; + } + + while (temp > 0) + { + len++; + temp /= 10; + } + return len; +} + +int main() +{ + struct Zahl sum = {0, 0, 0}; + struct Zahl summand = {0, 0, 0}; + + bool abbruch = false; + printf("Bitte gib eine deutsche Kommazahl ein:\n"); + + while (!abbruch) + { + abbruch = EingabeKomma(&summand); + if (!abbruch) + { + Kommaaddieren(&sum, &summand); + } + } + + AusgabeKomma(&sum); + return 0; +} \ No newline at end of file