Zwei Rückgabewerte in einer Funktion
-
Hallo zusammen!
Hab mich gerade angemeldet und hätte gleich mal ein Problem bei meinem aktuellen Programm bei dem ich eure kompetente Hilfe benötigen würde.
Ich habe einen Taschenrechner programmiert, bei dem mit Hilfe von getchar (Operator) und switch-case Anweisung eine Rechenoperation vom Benutzer eingegeben wird und das Programm dann in die jeweilige Zeile springt und die Rechnung durchführt.
Ich würde nun aber gerne den Programmtext soweit vereinfachen, dass ich das Einlesen der beiten Zahlen die z.b. für eine Addition notwendig sind nicht komplett aufschreiben muss, sondern das ganze in einer Funktion schreibe und dann im jeweiligen case '+' nur noch die Funktion aufrufe und mit ergebnis = a + b; das Ergebnis der Rechnung in die Variable ergebnis schreibe.
Bsp:
case '+':
printf("Zahl1:\n");
scanf("%lf", &a);
printf("Zahl2:\n");
scanf("%lf", &b);
ergebnis = a + b; // berechnung
break;Das wäre das case für die Addition. Wie zu sehen ist, werden zwei Werte vom Typ double eingelesen und dann mit ergebnis = a + b; berechnet.
Gibt es eine Möglichkeit, die Eingabe der Zahlen (also die zwei printf's und die zwei scanf's) in einer eigenen Funktion zu schreiben, um diese dann einfach aufzurufen und für jedes jeweilige case nur noch die Operation im ergebnis verändern zu müssen?
Idee:
case '+':
double werte_einlesen(double a, double b)
ergebnis = a + b; // berechnung
break;für jeden einzelnen case müsste ich dann nur noch das + durch ein - oder / oder * ersetzen usw.
Bei einer normalen Funktion kann man ja nur einen Rückgabewert zurückgeben. Wie kann ich es nun realisieren, dass ich die über scanf eingelesenen Werte für a und b an die Funktion so zurückgebe, dass mein main() aus der Funktion die richtigen Werte herausliest und sie weiterverarbeiten kann?
Ich hoffe, ich habe mich deutlich genug ausgedrückt, da ich erst Anfänger auf dem Gebiet der C-Programmierung bin. Bitte habt Nachsicht.
Danke für eure Hilfe!!!
-
Herzlich willkommen :-),
Für Code kannst du auch Tags benutzen, damit es lesbarer wird. Ungefähr so:int main() { return 0; }
Also: Funktionen haben die Eigenschaft genau einen Wert zurückzugeben.
Ich meine über Umwege (Zeiger) kriegt man es trotzdem hin.
Hier wurde es z.B. erklärt: http://www.c-plusplus.net/forum/39482Aber in deinem Fall wäre das glaube ich nicht einmal Sinnvoll beziehungsweise Nötig. Was genau ist denn jetzt deine Frage oder dein Problem?
Meinst du, du willst die einzelnen Rechnungen in Funktionen schreiben, oder willst du ein Operator Zeichen "+, -, *" einlesen und übergeben, und dieses dann je nach Eingabe in einer Funktion "Austauschen", sodass der richtige Wert raus kommt?
Ich hab das nicht so ganz verstanden.
-
Danke
werde ich in Zukunft verwenden.
Ich möchte im Prinzip einfach den Programmumfang was die Zeilenanzahl angeht verringern, indem ich die 4 Zeilen mit printf,scanf,printf,scanf für das Einlesen der beiden Zahlen durch eine Funktion ersetze, in der dieses einlesen der Zahlen halt passiert. (mir ist schon klar, dass der Code in Maschinensprache übersetzt trotzdem alle Zeilen beinhaltet, auch wenn die 4 zeilen in einer Funktion sind)
D.h. die zwei Zahlen sollen in einer Funktion eingelesen werden, die ich dann einfach in jedem case der Switch-Anweisung aufrufe, und nach dem Funktionsaufruf einfach mit ergebnis = a + b bzw ergebnis = a - b und so weiter das Ergebnis berechne.
Mein Programm funktioniert einwandfrei, ich würde es nur gerne "vereinfachen" und übersichtlicher machen
-
Du musst die Adressen der Variablen an die Funktion übergeben. Dies wird mit dem & vor der Variablen gemacht
Das tust du ja auch schon bei scanf.In der Funktion musst du allerdings die Adressen dereferenzieren. Das machst du mit dem *
int werte_einlesen(double *a, double *b) { printf(":"); scanf("%lf", a); printf(":"); scanf("%lf", b); return 0 } //Aufruf mit werte einlesen(&a, &b);
Du brauchst das ganze doch aber eh nur einmal, indem du die Zahlen vor dem switch einliest.
-
Ungefaehr so:
#include <stdio.h> void read_input( double* a, double* b ) { printf("First number: "); scanf("%lf", a); printf("Second number: "); scanf("%lf", b); } int main() { double a, b; read_input(&a,&b); printf("%lf\n", a); printf("%lf\n", b); }
-
Wow, so schnell solche Top-Antworten! Danke an alle!
DirkB:
Deine Idee ist natürlich sehr logisch, aber da ich noch einige andere Funktionen zum Programm hinzufügen will, fahre ich mit einer Eingabefunktion die ich in den cases aufrufe besser.
Danke aber für den Tipp
-
Du solltest dir aber durchaus überlegen einen int Rückabewert zu nehmen.
Dort kannst du anzeigen, ob der User überhaupt Werte eingegeben hat.
Dazu kannst du den Rückgabewert von scanf auswerten.Wenn der User Fehleingaben macht (z.B. Buchstaben) musst du Eingabepuffer leeren.
Dazu kannst du da schauen: http://www.c-plusplus.net/forum/p1146014#1146014
-
das ist eine gute Idee,
heisst das, dass ich nach dem einlesen der beiden werte über if überprüfe ob es entweder end of file oder escape-sequenz beinhaltet?
meine Eingabefunktion lautet:
/* Werte einlesen */ void werte_einlesen(double *a, double *b) { printf("Zahl1:\n"); scanf("%lf", a); printf("Zahl2:\n"); scanf("%lf", b); } // end einlesen_ganz
und es stimmt, bei den Operatoren (durch switch-case und default) wird natürlich eine fehlermeldung bei falscher eingabe zurückgeliefert, aber nicht bei den werten, also wenn da ein buchstabe kommt ist das programm nur verwirrt.
-
scanf liefert als Rückgabewert die Anzahl der gelesenen Parameter zurück.
(scanf kann mehr als einen Wert auf einmal einlesen)if(1!=scanf(%lf",a) { // Das ist eine Eins // Fehlerbehandlung }
-
das habe ich gerade rausgefunden
hab jetzt
/* Werte einlesen */ void werte_einlesen(double *a, double *b) { printf("Zahl1:\n"); if (scanf("%lf", a) != 1) { printf("FEHLER!\n"); exit(0); } printf("Zahl2:\n"); if (scanf("%lf", b) != 1) { printf("FEHLER!\n"); exit(0); } } // end werte_einlesen
wie kann ich implementieren, dass ich statt exit(0), also das programm bei falscher eingabe zu beenden, die werteabfrage einfach zu wiederholen? also z.b. bei der eingabe von a ist ja !=1 true, dann soll das programm den wert neu abfragen.
-
braco91 schrieb:
wie kann ich implementieren, dass ich statt exit(0), also das programm bei falscher eingabe zu beenden, die werteabfrage einfach zu wiederholen? also z.b. bei der eingabe von a ist ja !=1 true, dann soll das programm den wert neu abfragen.
Mit einer Schleife.
-
/* Funktion LeereEingabepuffer */ void LeereEingabepuffer() { while (getchar() != '\n'); } // end LeereEingabepuffer
void werte_einlesen(double *a, double *b) { printf("Zwei Zahlen eingeben\n"); if ((scanf("%lf", a) != 1) || (scanf("%lf", b) != 1)) { LeereEingabepuffer(); printf("FEHLER!\n"); werte_einlesen(a,b); } } // end werte_einlesen
mit dieser Eingabefunktion wird jetzt überprüft, ob die beiden eingegebenen Zahlen auch Zahlen sind, wenn nein, dann tritt das if in erscheinung und leert erstmal dein eingabepuffer, gibt FEHLER aus und ruft die Funktion erneut auf, bis Zahlen eingegeben werden.
TOP
-
braco91 schrieb:
mit dieser Eingabefunktion wird jetzt überprüft, ob die beiden eingegebenen Zahlen auch Zahlen sind
TOP
Du überprüfst aber, ob die eingegebenen Zahlen ungleich 1 sind. d.H. du kannst nur 1 eingeben, ansonsten Fehler, oder seh ich das jetzt falsch?
-
marvNN:
Die Überprüfung mit !=1 überprüft, wenn ich das jetzt richtig verstanden habe nur, ob die Aussage
((scanf("%lf", a)
richtig ist, also, ob ein Wert vom Typ %lf eingelesen wurde. Wenn z.b. 'a' eingegeben wird, ist das scanf ja Falsch (weil char -> %c), also im logischen Sinne !=1 bzw. == 0 und somit tritt dann meine Fehlermeldung auf.
Also das Programm funktioniert einwandfrei, für alle Eingaben von double-Zahlen (%lf), wenn ich für a oder b ein char eingebe, springt er in die Fehlermeldung.
-
Will man mehrere Elemente durch eine Funktion zurückgeben lassen, kann man auch mit Strukturen arbeiten:
typedef struct {double a,b;} Typ2D; Typ2D einlesen(void) { Typ2D x={0}; printf("1.wert: ");scanf("%lf",&x.a); printf("2.wert: ");scanf("%lf",&x.b); while( '\n'!=getchar() ); return x; } int main() { Typ2D x=einlesen(); printf("%f %f",x.a,x.b); return 0; }
-
Dankeschön
das Forum ist