Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Zwei Rückgabewerte in einer Funktion  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
braco91
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.04.2012
Beiträge: 19
Beitrag 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
Beitrag 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. :D

_________________
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen." - Sokrates
braco91
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.04.2012
Beiträge: 19
Beitrag 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




Beitrag 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
Beitrag 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
Beitrag 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




Beitrag 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
Beitrag 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




Beitrag 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
Beitrag braco91 Mitglied 19:10:54 16.04.2012   Titel:              Zitieren

das habe ich gerade rausgefunden :D

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.
c++.de :: C (C89, C99 und C11) ::  Zwei Rückgabewerte in einer Funktion  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.