Wie kann man in C einen Parameter für einen Taschenrechner programmieren, dass heisst das man beliebig viele Zahlen miteinander rechnen kann?

2 Antworten

Das ist für einen Anfänger eine nicht ganz so triviale Aufgabe. Du müsstest einen genügend großen String definieren, die Eingabe komplett einlesen und dann mit String-Funktionen auseinander nehmen, die Zahlen in Zahlwerte umwandeln und dann addieren.

Etwas einfacher wäre es, wenn die Eingabe nicht durch ein Wort, sondern eine bestimmte Zahl (zum Beispiel 0) beendet werden soll. Dann könntest du in einer Schleife Zahl nach Zahl einlesen, direkt in einer Variablen "summe" aufaddieren und bei Eingabe von 0 die Schleife beenden.

Dann würde das Programm zwar nur dann richtig funktionieren, wenn der Benutzer auch wirklich nur Zahlen eingibt - das wäre also nicht sehr robust. Aber für eine Anfängerübung wäre das der bessere Weg.

Also auf die Schnelle geht das evtl. so:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFSZ 1024

int main(void) {
char buf[BUFSZ] = {};
char *ptr = buf;

puts("Werte eingeben:");
fgets(buf, BUFSZ, stdin);

long sum = 0L;

for (long cur = 0L; *ptr; ++ptr) {
char c = *ptr;

if (isdigit(c)) {
cur *= 10L;
cur += c - '0';
} else {
sum += cur;
cur = 0L;
}
}

printf("Summe: %ld\n", sum);

return EXIT_SUCCESS;
}

Das liest alle zusammenhängenden Ziffern als Zahlen ein, und addiert diese. Separiert werden die einzelnen Zahlen durch alles, was keine Zahl ist (Leerzeichen, Zeilentrenner, Buchstaben, etc.).

Als Eingabe funktioniert also ...

12 345 6789

... genauso, wie ...

Lieber Computer, bitte addiere 10 und 20, OK?

... wobei du vermutlich eher die erste Methode anstrebst. :)

Für dich persönlich dürfte das OK sein, aber wenn du es ernst meinst, würde ich a) einen dynamischen alloziierten Puffer verwenden, b) Rückgabewerte auf Fehler überprüfen, c) auf Integer-Überläufe bei sum und cur achten, d) Vorzeichen beachten und e) die Locale-spezifische isdigit()-Funktion durch eine eigene ersetzen.

Drei von den genannten fünf Punkten sind übrigens gängige Sicherheitslücken! Also nimm die nicht auf die leichte Schulter, und setze mein Snippet auf keinen Fall in Produktivcode ein!

Es ging mir nur darum einen Ansatz zu demonstrieren, mehr nicht! Also wenn dir deine Urananreicherungsanlage deswegen um die Ohren fliegt, schieb bitte nicht mir die Schuld in die Schuhe. :)

Wie "Spaghetticode" bereits geschrieben hat, ist es nicht trivial, eine Funktion zu schreiben, die Integer einliest, und auf Überläufe prüft, wobei der gesamte mögliche Bereich von z. B. INT_MIN bis INT_MAX abgedeckt wird, und natürlich Vorzeichen beachtet werden. So eine Funktion ist zwar relativ kompakt, aber wie gesagt, nicht trivial - vor allem nicht für Anfänger.

(Deshalb am besten atoi() und möglichst noch besseres verwenden, und nicht selber entwickeln!)

Also dann, viel Spaß! :)


FedeBrew 
Beitragsersteller
 09.12.2015, 13:24

Endlich ein Beispiel, das funktioniert. Hab vielen Dank. Du bist meine Rettung!