Info2/28.2.2.c
2025-05-15 14:30:29 +02:00

117 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h> //power
#include <stdbool.h>
#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;
}