| Autor |
Nachricht |
braco91
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.04.2012
Beiträge: 19
|
braco91 Mitglied
16:30:43 16.04.2012 Titel: |
Zwei Rückgabewerte in einer Funktion |
Zitieren |
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!!! |
|
|
|
 |
marvNN
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.03.2012
Beiträge: 35
|
marvNN Mitglied
16:45:31 16.04.2012 Titel: |
|
Zitieren |
Herzlich willkommen :-),
Für Code kannst du auch Tags benutzen, damit es lesbarer wird. Ungefähr so:
| C++: | 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.de/forum/39482
Aber 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. |
_________________ "Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen." - Sokrates
|
|
 |
braco91
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.04.2012
Beiträge: 19
|
braco91 Mitglied
16:48:06 16.04.2012 Titel: |
|
Zitieren |
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 |
Zuletzt bearbeitet von braco91 am 16:49:02 16.04.2012, insgesamt 1-mal bearbeitet |
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
16:50:41 16.04.2012 Titel: |
|
Zitieren |
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 *
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | 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. |
|
|
|
 |
icarus2
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1359
|
icarus2 Mitglied
16:52:25 16.04.2012 Titel: |
|
Zitieren |
Ungefaehr so:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #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);
} | | |
|
|
|
 |
braco91
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.04.2012
Beiträge: 19
|
braco91 Mitglied
16:56:58 16.04.2012 Titel: |
|
Zitieren |
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 =) |
|
|
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
17:25:27 16.04.2012 Titel: |
|
Zitieren |
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.de/forum/p1146014#1146014 |
|
|
|
 |
braco91
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.04.2012
Beiträge: 19
|
braco91 Mitglied
18:25:51 16.04.2012 Titel: |
|
Zitieren |
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:
| Code: | 1 2 3 4 5 6 7 8 | /* 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. |
|
|
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
18:44:39 16.04.2012 Titel: |
|
Zitieren |
scanf liefert als Rückgabewert die Anzahl der gelesenen Parameter zurück.
(scanf kann mehr als einen Wert auf einmal einlesen)
| C++: | if(1!=scanf(%lf",a) { // Das ist eine Eins
// Fehlerbehandlung
} | | |
|
|
|
 |
braco91
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.04.2012
Beiträge: 19
|
braco91 Mitglied
19:10:54 16.04.2012 Titel: |
|
Zitieren |
das habe ich gerade rausgefunden
hab jetzt
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* 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. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|