Informatik2_Pr/kommaadd.c
2025-05-08 14:53:16 +02:00

85 lines
2.7 KiB
C

#include <stdio.h>
#include <string.h>
#define MAX 100
typedef struct {
int vorkomma;
int nachkomma;
} Kommazahl;
int stringZuInt(char *str) {
int result = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] >= '0' && str[i] <= '9') {
result = result * 10 + (str[i] - '0');
} else {
return -1; // Ungültiges Zeichen
}
}
return result;
}
int nachkommaZuInt(char *str) {
int result = 0;
int i = 0;
for (; str[i] != '\0' && i < 6; i++) {
if (str[i] >= '0' && str[i] <= '9') {
result = result * 10 + (str[i] - '0');
} else {
return -1; // Ungültiges Zeichen
}
}
for (; i < 6; i++) {
result *= 10;
}
return result;
}
int main() {
char eingabe[MAX];
int vor = 0, nach = 0;
Kommazahl zahl;
Kommazahl summe = {0, 0};
printf("Gib Deine Kommazahlen ein (Abschluss mit Leerzeile)\n");
while (1) {
fgets(eingabe, MAX, stdin);
eingabe[strcspn(eingabe, "\n")] = '\0'; //Ersetzt "\n"(Abbruchbedingung) mit '\0', damit das Programm nicht abbricht
if (strlen(eingabe) == 0)
break; // Wenn die Eingabe nach dem Entfernen von "\n" leer ist, wird das Programm abgebrochen
char *kommaPos = strchr(eingabe, ','); // Erstellt einen Zeiger auf den Speicher wo das Komma des Strings liegt
if (kommaPos != NULL) {
*kommaPos = '\0'; // Ersetzt das Komma mit '\0' um den String in zwei Teile zu splitten
char *nachkommateil = kommaPos + 1; // setzt einen Pointer auf den Anfang der Nachkommastellen
zahl.vorkomma = stringZuInt(eingabe); //Wandelt den String in einen Int um und speichert den Wert im Struct
zahl.nachkomma = nachkommaZuInt(nachkommateil);
} else { // Damit bei einer ganzzahligen Zahl nicht die nachkomma Zahl als Fehleingabe deklariert wird, wird hier nur die vorkomma Zahl zum Int konvertiert
zahl.vorkomma = stringZuInt(eingabe);
zahl.nachkomma = 0;
}
if (zahl.vorkomma == -1 || zahl.nachkomma == -1) {
printf("Ungültige Zahl: %s\n", eingabe);
continue;
}
summe.vorkomma += zahl.vorkomma;
summe.nachkomma += zahl.nachkomma;
vor += zahl.vorkomma; // Für die Ausgabe unten, ohne den addierten Überlauf
nach += zahl.nachkomma;
if (summe.nachkomma >= 1000000) { // Addiert den überlauf der nachkomma Zahl auf die Vorkommazahl
summe.vorkomma += 1;
summe.nachkomma -= 1000000;
}
}
printf("= %d,%06d (%d, %d) ..... Kontrollwert: %d.%06d\n",
summe.vorkomma, summe.nachkomma, vor, nach, summe.vorkomma, summe.nachkomma);
}