WinFuture-Forum.de: C++ Werte Zurückgeben - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

C++ Werte Zurückgeben 2 Werte mit return zurückgeben (array)?


#1 Mitglied ist offline   smite 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.199
  • Beigetreten: 08. Januar 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:127.0.0.1

  geschrieben 09. Juni 2008 - 08:28

Hallo Winfuturianer,
ist es möglich in C++ zwei Werte aus einer Funktion zurückgeben zu lassen, bzw. ein ganzes Array?

Hintergrund ist, dass ich aus einer Funktion zwei Werte in die main zurückgeben will. Ist es dafür möglich ein ganzes Array zurückzugeben?
Das ganze soll ohne Zeiger funktionieren.

Das Programm soll die PQ-Formel ausrechnen und dafür sollen die Eingabe von P und Q sowie die Ausgabe der fertigen Ergebnisse in der main-Funktion realisiert werden und sämtliche Berechnungen in einer extra Funktion, dafür muss ich jedoch zwei Werte aus der extra Funktion zurückgeben.

Vielen Dank schon einmal im vor raus.
Gruß smite

Edit:
Mein aktueller Code:
// Funktion_5.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include 
#include 

using namespace std;

double berechnung (double, double);
bool wurzel (float, float);

int main(int argc, char* argv[])
{
	double p, q, xeins, xzwei;

	cout<<"PQ-Formel loesen"<
	cout<<"(x*x)+px+q\n"<

	cout<<"Bitte p eingeben:\t";
	cin>>p;
	cout<<"\nBitte q eingeben:\t";
	cin>>q;

	xeins=berechnung (p, q);
	xzwei=berechnung (p, q);

	cout<<"Xeins:\t"<<
	cout<<"Xzwei:\t"<<




	system ("pause");
	return 0;
}


//Berechnung es gesamten Ausdrucks
double berechnung (double p, double q)
{

	float xeins, xzwei;
	int i=0;
	bool tmp=wurzel (p, q);
		//die komplette Funktion sollte eigentlich in einen IF und einen Else Teil eingeteilt werden
		//beim ersten Durchlauf soltle i auf 1 gesetzt werden und beim folgenden Durchlauf soltle sofort
		//in den Else Teil gesprungen werden
		//Fehler ist, dass i bei jedem Aufruf der Funktion auf 0 gesetzt wird
		if (i==0)
		{
			i++;
			
			//Testausgabe ohne Bedeutung für das Programm
			cout<<"i:\t"<[i]<

			cout<<"IF-TEIL"<

			if (tmp==true)
			{
				xeins=(-(p/2))+ sqrt (((p/2)*(p/2))-q);
				
				return xeins;
			}
			else
			{
				cout<<"Gleichung nicht Loesbar, da die Wurzel negativ ist"<
			}
		
		}

	else
	{
		
		//Testausgabe ohne Bedeutung für das Programm		
		cout<<"ELSE-TEIL"<
				
		xzwei=(-(p/2))- sqrt (((p/2)*(p/2))-q);
	
		return xzwei;
	}

}


//überprüft ob die wurzel positiv (>=0) ist (true), sonst false
bool wurzel (float p, float q)
{
	float tmp=((p/2)*(p/2))-q;
	bool wahr;

		
	if (tmp >=0)
	{
		wahr=true;		
	}
	else
	{
		wahr=false;
	}
	
	return wahr;

}


[/i]
Bitte die Kommentare beachten

Dieser Beitrag wurde von smite bearbeitet: 09. Juni 2008 - 08:41

Eingefügtes BildEingefügtes Bild
0

Anzeige



#2 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 09. Juni 2008 - 22:42

naja ein array ist ja nix anderes als n zeiger aufs erste Element - wenn mans also genau nimmt gehts nich anders

aber man kann auch n array als Rückgabewert angeben wenn ich richtig liege. Is zwar intern nix andres als n Pointer aber vom Quelltext her dürftest dann nix mit pointern zu tun haben
0

#3 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 09. Juni 2008 - 22:47

Auch wenn es für diese Anwendung nicht besonders sinnvoll ist, habe ich dir mal ein Beispiel mit einem Struct gemacht. Aber vorher solltest du dir die quadratische Lösungsformel nochmal genau anschauen und vor allem deinen C++ Code. Die Syntax stimmt meistens hinten und vorne nicht.

#include <iostream>
#include <math.h>

using namespace std;

struct loesung {
        unsigned char count; //Für Anzahl der Lösungen
        double x1;
        double x2;
};

struct loesung berechnung (double, double);

int main(int argc, char* argv[])
{
        double p, q;
        struct loesung loes;

        cout << "PQ-Formel loesen\n\n";
        cout << "x^2 + px + q = 0\n\n";

        cout << "Bitte p eingeben:\t";
        cin >> p;
        cout << "Bitte q eingeben:\t";
        cin >> q;

        loes = berechnung(p, q);

        if (loes.count == 0) {
                cout << "Gleichung nicht reell loesbar, da die Determinante negativ ist.";
        } else if (loes.count == 1) {
                cout << "x1=x2=\t" << loes.x1;
        } else {
                cout << "x1=\t" << loes.x1 << "\t";
                cout << "x2=\t" << loes.x2;
        }

        cout << "\n";

        return 0;
}

//Berechnung der Lösungen
struct loesung berechnung (double p, double q)
{
        struct loesung loes;
        double determinante = p*p - 4*q;

        //Determinante prüfen
        if (determinante > 0) {
                loes.x1 = (-p + sqrt(determinante)) / 2.0;
                loes.x2 = (-p - sqrt(determinante)) / 2.0;
                loes.count = 2;
        } else if (determinante == 0) {
                loes.x1 = -p / 2.0;
                loes.count = 1;
        } else {
                loes.count = 0;
        }

        return loes;
}



Gruß,
Stefan

Dieser Beitrag wurde von Diewie bearbeitet: 09. Juni 2008 - 23:10

0

#4 Mitglied ist offline   smite 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.199
  • Beigetreten: 08. Januar 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:127.0.0.1

geschrieben 09. Juni 2008 - 23:01

Danke für die Antworten. Den Quellcode gucke ich mir morgen genau an, geh gleich schlafen^^.
Hintergrund ist der, dass wir in der Schule noch keine Zeiger hatten und die Aufgabe eigentlich war, ein Programm zu schreiben, dass die PQ-Formel errechnet und das nur wenn der Wert unter der Wurzel >=0 ist.
Ich habe mich vor der Rückgabe der Werte gedrückt, indem ich die Ausgabe einfach in der Funktion Berechnung gemacht habe, jedoch sollten die Werte in die main zurückgegeben und dort ausgegeben werden.
Der Lehrer hat uns nur noch gesagt, dass wir die Funktion Berechnung 2x aufrufen sollen, daher auch meine Idee mit der IF-Else. Meine Nachfolgende Idee wäre gewesen, den Wert von i in der Funktion Berechnen in einer Datei Zwischenzuspeichern.

Ist es möglich mit Hilfe von return ein ganzes Array zurückzugeben, indem ich return nur 1x aufrufe? Weil afaik ist es ja so, dass die Funktion beendet wird, sobald ein return aufgerufen wird und zurück zum Aufruf der Funktion gesprungen wird.

Dass es für das Programm bessere, schnellere Lösungen gibt ist mir bewusst, jedoch spielt das erstmal keine Rolle da meine Aufgabenstellung anders lautet. Das ist so zusagen eine Zusatzaufgabe, das ganze mit einer Funktion zu berechnen

@Stefan, was meinst du mit die Syntax stimmt meist nicht? In der Schule schreiben wir zwar in C++, aber verwenden noch keine Objektorientierung, etc.
Ich bin halt noch ein Anfänger im Thema Programmierung.

Vielen Dank für eure Antworten.
Gruß smite
Eingefügtes BildEingefügtes Bild
0

#5 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 09. Juni 2008 - 23:14

Ja ich meinte nur, dass z.B. oft < oder << am Ende von Ausgaben standen, und so kleine Sachen.
Einfacher wäre es, du übergibst i auch an berechnen, also z.b. berechnen(p, q, i) und für i halt dann 1 bzw. 2. Dann kannst du mit If zwischen x1 und x2 unterscheiden.

Gruß,
Stefan
0

#6 Mitglied ist offline   smite 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.199
  • Beigetreten: 08. Januar 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:127.0.0.1

geschrieben 09. Juni 2008 - 23:17

@Diewie,
Danke, bei mir saß einer auf der Leitung, genau die Sache mit i einfach in der main nach dem ersten Durchlauf hochlaufen lassen und anschl. neu übergeben wollte ich machen. Irgendwie saß bei mir einer auf der Leitung, damned.
Mit meinen Fehlern, vll. kamen manche Fehler durch das Kopieren, ich konnte das Programm bei mir Fehlerfrei kompilieren, etc. Ich guck morgen mal drüber.
Gn8 und jetzt weiß ich wie ichs machen kann *glaub ich*.
Viele Grüße smite

Edit:
Hier ist die funktionierende Version:
// Funktion_5.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

double berechnung (double, double, bool);

int main(int argc, char* argv[])
{
    double p, q, xeins, xzwei;
    bool durchlauf=false;
    float ergwurzel;

    cout<<"PQ-Formel loesen"<<endl;
    cout<<"(x*x)+px+q\n"<<endl;

    cout<<"Bitte p eingeben:\t";
    cin>>p;
    cout<<"\nBitte q eingeben:\t";
    cin>>q;

    
    ergwurzel=((p/2)*(p/2))-q;
        
    if (ergwurzel >=0)
    {
        xeins=berechnung (p, q, durchlauf);

        durchlauf=true;

        xzwei=berechnung (p, q, durchlauf);

        cout<<"Xeins:\t"<<xeins<<endl;
        cout<<"Xzwei:\t"<<xzwei<<endl;
    
    }
    else
    {
        cout<<"Gleichung nicht Loesbar, da die Wurzel negativ ist"<<endl;        
    }    
    
    system ("pause");
    return 0;
}



//Berechnung es gesamten Ausdrucks
double berechnung (double p, double q, bool durchlauf)
{

    float xeins, xzwei;

        if (durchlauf==false)
        {                            
                xeins=(-(p/2))+ sqrt (((p/2)*(p/2))-q);                
                return xeins;            
        }

        else
        {                        
            xzwei=(-(p/2))- sqrt (((p/2)*(p/2))-q);    
            return xzwei;
        }

}



Ich habe einfach eine Variable des Typs bool nach dem ersten Aufruf der Funktion von false auf true gesetzt und jetzt funktionert alles so wie es soll.
Danke noch einmal für den Tipp.
Gruß smite

Dieser Beitrag wurde von smite bearbeitet: 10. Juni 2008 - 09:01

Eingefügtes BildEingefügtes Bild
0

#7 Mitglied ist offline   Nighthawk 

  • Gruppe: aktive Mitglieder
  • Beiträge: 73
  • Beigetreten: 28. Dezember 03
  • Reputation: 0
  • Wohnort:CH

geschrieben 13. Juni 2008 - 18:34

Beitrag anzeigenZitat (Diewie: 09.06.2008, 23:47)

...da die Determinante...

Bei quadratischen Funktionen ist es aber die Diskriminante und nicht die Determinante.
0

#8 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 14. Juni 2008 - 09:46

Beitrag anzeigenZitat (Nighthawk: 13.06.2008, 19:34)

Bei quadratischen Funktionen ist es aber die Diskriminante und nicht die Determinante.


Oh stimmt natürlich. Habe ich wohl im Eifer der Nacht verwechselt. 4 Semester Höhere Mathematik hinterlassen scheinbar ihre Spuren :imao:
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0