This commit is contained in:
Bora Zuenbuelkoek 2025-05-16 07:17:22 +02:00
parent 0d2d19d0db
commit 4d9f0b6e84
2 changed files with 76 additions and 52 deletions

View File

@ -2,63 +2,87 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define MAX 100 // Maximale Anzahl an Zahlen #define MAX 100 // Maximale Anzahl an Zahlen
// Struktur zur Speicherung einer Zahl mit Vorkomma- und Nachkommateil // Struktur zur Speicherung einer Zahl mit Vorkomma- und Nachkommateil
typedef struct { typedef struct {
int vorkomma; // Ganzzahliger Teil vor dem Komma int vorkomma; // Ganzzahliger Teil vor dem Komma
int nachkomma; // Nachkommateil als ganze Zahl int nachkomma; // Nachkommateil als ganze Zahl
int nachstellen; // Anzahl der Nachkommastellen int nachstellen; // Anzahl der Nachkommastellen
} Kommazahl; } Kommazahl;
int main() {
Kommazahl zahlen[MAX]; // Array zur Speicherung aller eingegebenen Zahlen // Funktion zur Einlesung der Zahlen
char eingabe[100]; // Eingabepuffer int einlesen(Kommazahl zahlen[], int max) {
int anzahl = 0; // Zähler für Anzahl der eingegebenen Zahlen char eingabe[100];
// Eingabephase int anzahl = 0;
printf("Gib Deine Kommazahlen ein (Abschluss mit Leerzeile)\n"); printf("Gib Deine Kommazahlen ein (Abschluss mit Leerzeile)\n");
while (fgets(eingabe, sizeof(eingabe), stdin)) { while (fgets(eingabe, sizeof(eingabe), stdin)) {
if (eingabe[0] == '\n') break; // Abbruch bei Leerzeile if (eingabe[0] == '\n') break; // Abbruch bei Leerzeile
Kommazahl z; Kommazahl z;
char *komma = strchr(eingabe, ','); // Suche Komma char *komma = strchr(eingabe, ','); // Suche Komma
if (komma) { if (komma) {
*komma = '\0'; // Trenne Vorkommateil ab *komma = '\0'; // Trenne Vorkommateil ab
z.vorkomma = atoi(eingabe); // Umwandlung Vorkomma z.vorkomma = atoi(eingabe); // Umwandlung Vorkomma
char *nachkommaStr = komma + 1; char *nachkommaStr = komma + 1;
// Entferne evtl. Zeilenumbruch // Entferne evtl. Zeilenumbruch
nachkommaStr[strcspn(nachkommaStr, "\n")] = '\0'; nachkommaStr[strcspn(nachkommaStr, "\n")] = '\0';
z.nachstellen = strlen(nachkommaStr); // Anzahl der Nachkommastellen merken z.nachstellen = strlen(nachkommaStr); // Anzahl der Nachkommastellen merken
z.nachkomma = atoi(nachkommaStr); // Nachkomma als ganze Zahl z.nachkomma = atoi(nachkommaStr); // Nachkomma als ganze Zahl
} else { } else {
// Falls kein Komma, dann ist es eine ganze Zahl // Falls kein Komma, dann ist es eine ganze Zahl
z.vorkomma = atoi(eingabe); z.vorkomma = atoi(eingabe);
z.nachkomma = 0; z.nachkomma = 0;
z.nachstellen = 0; z.nachstellen = 0;
} }
zahlen[anzahl++] = z; // Speichern der Zahl zahlen[anzahl++] = z; // Speichern der Zahl
} if (anzahl >= max) break;
// Maximal vorkommende Anzahl von Nachkommastellen finden }
int max_nachstellen = 0; return anzahl;
for (int i = 0; i < anzahl; i++) { }
if (zahlen[i].nachstellen > max_nachstellen) {
max_nachstellen = zahlen[i].nachstellen; // Funktion zur Bestimmung der maximalen Nachkommastellen
} int max_nachkommastellen(const Kommazahl zahlen[], int anzahl) {
} int max_nachstellen = 0;
// Aufaddieren mit Skalierung for (int i = 0; i < anzahl; i++) {
int summe_vorkomma = 0; if (zahlen[i].nachstellen > max_nachstellen) {
long long summe_nachkomma = 0; max_nachstellen = zahlen[i].nachstellen;
for (int i = 0; i < anzahl; i++) { }
summe_vorkomma += zahlen[i].vorkomma; }
// Nachkomma auf gemeinsame Basis (z.B. 1.000.000 für 6 Stellen) skalieren return max_nachstellen;
int faktor = 1; }
for (int j = 0; j < max_nachstellen - zahlen[i].nachstellen; j++) {
zahlen[i].nachkomma *= 10; // Funktion zur Addition der Zahlen mit Skalierung
} void addiere(const Kommazahl zahlen[], int anzahl, int max_nachstellen, int *summe_vorkomma, long long *summe_nachkomma) {
summe_nachkomma += zahlen[i].nachkomma; *summe_vorkomma = 0;
} *summe_nachkomma = 0;
// Nachkommaübertrag berechnen for (int i = 0; i < anzahl; i++) {
int basis = 1; *summe_vorkomma += zahlen[i].vorkomma;
for (int i = 0; i < max_nachstellen; i++) basis *= 10; // Nachkomma auf gemeinsame Basis (z.B. 1.000.000 für 6 Stellen) skalieren
summe_vorkomma += summe_nachkomma / basis; int nachkomma = zahlen[i].nachkomma;
summe_nachkomma = summe_nachkomma % basis; for (int j = 0; j < max_nachstellen - zahlen[i].nachstellen; j++) {
// Ausgabe nachkomma *= 10;
printf("= %d,%0*lld\n", summe_vorkomma, max_nachstellen, summe_nachkomma); }
return 0; *summe_nachkomma += nachkomma;
}
}
// Funktion zur Berechnung des Übertrags und Ausgabe
void ausgabe(int summe_vorkomma, long long summe_nachkomma, int max_nachstellen) {
// Nachkommaübertrag berechnen
int basis = 1;
for (int i = 0; i < max_nachstellen; i++) basis *= 10;
summe_vorkomma += summe_nachkomma / basis;
summe_nachkomma = summe_nachkomma % basis;
// Ausgabe
printf("= %d,%0*lld\n", summe_vorkomma, max_nachstellen, summe_nachkomma);
}
int main() {
Kommazahl zahlen[MAX]; // Array zur Speicherung aller eingegebenen Zahlen
int anzahl = einlesen(zahlen, MAX); // Eingabephase
int max_nachstellen = max_nachkommastellen(zahlen, anzahl); // Maximal vorkommende Anzahl von Nachkommastellen finden
int summe_vorkomma;
long long summe_nachkomma;
addiere(zahlen, anzahl, max_nachstellen, &summe_vorkomma, &summe_nachkomma); // Aufaddieren mit Skalierung
ausgabe(summe_vorkomma, summe_nachkomma, max_nachstellen); // Ausgabe
return 0;
} }

BIN
a.exe

Binary file not shown.