#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; }