Program: 28.5.2.c
This commit is contained in:
parent
188c47585b
commit
ced22cc6fc
117
28.2.2.c
Normal file
117
28.2.2.c
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
#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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user