Zwei Rückgabewerte in einer Funktion
-
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