Mehrere Ergebnisse mit einer Funktion

Gray

Erfahrenes Mitglied
Ich habe 4 funktionen die jeweils 2 Werte berechnen a und b.

Ich will das über den aufruf einer extra funktion die Werte der ersten 4 Funktionen ausgegeben werden.

Code:
#include <iostream.h>
int a,b,typ;
int addition(x,y)
    {
    return (x+y);
    }

int division(x,y)
    {
    return (x-y);
    }

int multiplikation(x,y)
    {
    return (x*y);
    }

int subtraktion(x,y)
    {
    return (x/y);
    }

int gesamt(x,y)
    {
    ?
    }

void main()

    {
    cout <<"Bitte erste Zahl eingeben."<<endl;
    cin >>a;
    cout <<"Bitte geben Sie fuer die Addition \"1\","<<endl;
    cout <<"fuer die Division \"2\","<<endl;
    cout <<"fuer die Multiplikation \"3\","<<endl;
    cout <<"fuer die Subtraktion \"4\" ein."<<endl;
    cout <<"und fuer alle Operatoren \"5\" ein."<<endl;
    cin >>typ;
    cout <<"Bitte zweite Zahl eingeben."<<endl;
    cin >>b;

    if(typ == 1){
    cout <<"Das ergebniss ist "<<addition(a,b)<<endl;
    }

    if(typ== 2){
    cout <<"Das ergebniss ist "<<division(a,b)<<endl;
    }

    if(typ== 3){
    cout <<"Das ergebniss ist "<<multiplikation(a,b)<<endl;
    }

    if(typ== 4){
    cout <<"Das ergebniss ist "<<subtraktion(a,b)<<endl;
    }

    if(typ== 5){
    cout <<"Das ergebniss ist "<<gesamt(a,b)<<endl;
    }

char p[50];
cin.getline(p,50);
cin.getline(p,50);
}

Und bei der Funktion gesamt, hab ich mein Problem, es müsste mir 4 ergebnisse Zurückliefern, aber wie mach ich das?
 

Gray

Erfahrenes Mitglied
Oh, das hat mir jetzt...

...garnicht geholfen, es wäre toll, wenn du mir eventuel ein kleines Beispiel geben könntest, vielen dank.
 

Kachelator

Peter Jerz
Er meint vermutlich sowas ähnliches, nur mit Pointern statt Referenzen:
Code:
void tuwas( int& k, int& l )
{
  // tuwas() erhält seine Parameter als REFERENZEN, nicht als WERT
  // und kann dadurch den Wert der Variablen in der aufrufenden Funktion 
  // ändern, was bei Übergabe per Wert (==Kopie) nicht möglich ist
  k = 1;
  l = 2;
}

int main()
{
  int a = 0;
  int b = 0;
  // a und b sind 0;
  tuwas( a, b ); // tuwas ändert den wert von a und b
  // a und b sind jetzt 1 und 2
  return 0;
}
Du kannst hier k und l als Rückgabewerte der "Funktion" tuwas() ansehen.

Eine andere Möglichkeit, mehrere Werte zurückzugeben, sind std::pair (2 Werte) sowie boost::tuple (n Werte), am besten in Kombination mit tie(). Man kann damit sehr elegant arbeiten. Wenn du möchtest, erkläre ich das später.
 

Tobias K.

Erfahrenes Mitglied
moin


Code:
#include <iostream>
#include <tchar.h>

using namespace std;

int gesamt( int x, int y,  int *erstes, int *zweites, int *drittes, int *viertes)
{
     * erstes = x + y;
     * zweites = x - y;
     * drittes = x * y;
     * viertes = x / y;

	 return 0;
}


int main()
{
     int x=5;
     int y=6;

     int add_erg, sub_erg, mul_erg, div_erg;

     gesamt( x, y, &add_erg, &sub_erg, &mul_erg, &div_erg);

     cout<<add_erg <<"  "<< sub_erg <<"  "<< mul_erg <<"  "<< div_erg;

     return 0;
}

So, diese Funktion "gesamt" rechnet 4 Ergebnisse aus und speichert sie in den Variablen add_erg, sub_erg, mul_erg, div_erg.

Du hast in deinem Code die Subtraktion und die Division vertauscht!
Wenn du noch fragen hast, ich hab Zeit.


mfg
umbrasaxum
 

Dudadida

Erfahrenes Mitglied
Ein Array wäre auch möglich:

Code:
#include <iostream>
#include <tchar.h>

using namespace std;

int* gesamt( int x, int y)
{
     int *res = new int[4];     
     res[0] = x + y;
     res[1] = x - y;
     res[2] = x * y;
     res[3] = x / y;

     return res;
}


int main()
{
     int x=5;
     int y=6;

     int* erg = gesamt( x, y);

     cout << erg[0] <<"  "<< erg[1] <<"  "<< erg[2] <<"  "<< erg[3];

     delete [] erg;
     return 0;
}
 

Kachelator

Peter Jerz
@umbrasaxum:
Da würde ich deine Lösung lieber mit Referenzen umsetzen statt mit Pointern. Das hat erstens den Vorteil, das die Syntax einfacher ist, und zweitens kann es nicht passieren, dass ungültige Pointer übergeben werden:
Code:
#include <iostream>
#include <tchar.h>

using namespace std;

int gesamt( int x, int y,  int &erstes, int &zweites, int &drittes, int &viertes)
{
     erstes = x + y;
     zweites = x - y;
     drittes = x * y;
     viertes = x / y;

     return 0;
}


int main()
{
     int x=5;
     int y=6;

     int add_erg, sub_erg, mul_erg, div_erg;

     gesamt( x, y, add_erg, sub_erg, mul_erg, div_erg);

     cout<<add_erg <<"  "<< sub_erg <<"  "<< mul_erg <<"  "<< div_erg;

     return 0;
}

@Dudadida:
Das mit dem Array ist leider sehr unanschaulich. Wozu auf benannte Variablen verzichten, wenn es anders geht?
 

Gray

Erfahrenes Mitglied
Erstmal vielen dank, für die Hilfe, mein Script sieht jetzt so aus:

Code:
/*################################################################

Einsendeaufgabe 3.5    aufgabe3_5.cpp

################################################################*/

#include <iostream.h>
#include <tchar.h>

using namespace std;

int a,b,typ;
int addition(int x,int y)
    {
    return (x+y);
    }

int division(int x,int y)
    {
    return (x-y);
    }

int multiplikation(int x,int y)
    {
    return (x*y);
    }

int subtraktion(int x,int y)
    {
    return (x/y);
    }

int gesamt(int x,int y,int &add,int &div,int &mul,int &sub)
    {
    add = x+y;
    div = x-y;
    mul = x*y;
    sub = x/y;
    return 0;
    }

void main()

    {
    cout <<"Bitte erste Zahl eingeben."<<endl;
    cin >>a;
    cout <<"Bitte geben Sie fuer die Addition \"1\","<<endl;
    cout <<"fuer die Division \"2\","<<endl;
    cout <<"fuer die Multiplikation \"3\","<<endl;
    cout <<"fuer die Subtraktion \"4\" ein."<<endl;
    cout <<"und fuer alle Operatoren \"5\" ein."<<endl;
    cin >>typ;
    cout <<"Bitte zweite Zahl eingeben."<<endl;
    cin >>b;

    if(typ == 1){
    cout <<"Das ergebniss ist "<<addition(a,b)<<endl;
    }

    if(typ== 2){
    cout <<"Das ergebniss ist "<<division(a,b)<<endl;
    }

    if(typ== 3){
    cout <<"Das ergebniss ist "<<multiplikation(a,b)<<endl;
    }

    if(typ== 4){
    cout <<"Das ergebniss ist "<<subtraktion(a,b)<<endl;
    }

    if(typ== 5){
    int  add_erg,div_erg,mul_erg,sub_erg;
    (a,b,add_erg,div_erg,mul_erg,sub_erg);
    cout <<"Das ergebniss der Addition ist "<<add_erg<<endl;
    cout <<"Das ergebniss der Division ist "<<div_erg<<endl;
    cout <<"Das ergebniss der Multiplikation ist "<<mul_erg<<endl;
    cout <<"Das ergebniss der Subtraktion ist "<<sub_erg<<endl;
    }

char p[50];
cin.getline(p,50);
cin.getline(p,50);
}

Allerdings kommen beim Test total sinnlose Werte raus.
 

Tobias K.

Erfahrenes Mitglied
moin


Nochmal!
Du hast die Subtraktion und die Division vertauscht!

Außerdem verstehe ich nciht warum du die Funktion "gesamt" nicht benutzt?!

mfg
umbrasaxum
 
Zuletzt bearbeitet:

Thomas Kuse

Erfahrenes Mitglied
Die vorgestellten Lösungen hier sind zwar alle durchführbar und auch praktikable Sachen.
Wenn Du aber mehrere "Ergebnisse" mit einer Funktion zurückgeben willst, dann solltest Du das nicht mit den Übergabe-Parametern einer Funktion machen. Diese Vorangehensweise macht nur Sinn, wenn vorhandene Werte durch eine Funktion angepasst oder verändert werden sollen.

Willst Du mehrere Ergebnisse zurückgeben dann solltest Du Dir eine Struktur basteln, in der deine Ergebnisse gespeichert werden.
Du gibst dann halt nur nur noch einen Zeiger auf eine Struktur zurück. (geht auch mit Referenzen)
 

Neue Beiträge