Schon wieder ein Problem

Schon wieder ein Problem

Beitragvon Cashdogg » 10.07.2010 16:49

Sorry für's spammen, aber ich hab da schon wieder ein Problem. Gefragt war hier eine Klasse für polare Vektoren.

Code: Alles auswählen
#include <iostream>
#include <cmath>
using namespace std;

class polar2d
{
private:
   double Laenge;
   double Winkel;
public:
   polar2d(){};
   polar2d(double, double);
   polar2d operator*=(double);
   polar2d rotate(double);
   void Ausgabe();
   friend double get_x(polar2d);
   friend double get_y(polar2d);
};

polar2d::polar2d(double r, double phi)
{
   Laenge=r;
   Winkel=phi;
}

polar2d polar2d::operator*=(double x)
{
   polar2d erg;

   erg.Laenge*=x;
   erg.Winkel*=x;
   
   return erg;
}

polar2d polar2d::rotate(double alpha)
{
   polar2d erg;

   erg.Laenge=Laenge;
   erg.Winkel= Winkel+alpha;

   return erg;
}

void polar2d::Ausgabe()
{
   cout << "Polarer Vektor ist gegeben zu (r, alpha): (" <<Laenge << "," << Winkel << ")" << endl << endl;
}
   
double get_x(polar2d p)
{
   return(p.Laenge*cos(p.Winkel));
}

double get_y(polar2d p)
{
   return(p.Laenge*sin(p.Winkel));
}

int main()
{
   const double pi=3.141592654;

   polar2d p1(1.0, pi/2);
   p1.Ausgabe();
   p1 *=2.0;
   p1.Ausgabe();
   p1.rotate(-pi/6);
   p1.Ausgabe();
   cout << "Kartesische x-Koordinate:" << get_x (p1) << endl << endl;
   cout << "Kartesische y-Koordinate:" << get_y (p1) << endl << endl;
}


Aber leider wird der eingegebene Vektor durch die Funktionen nicht verändert :? .
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Schon wieder ein Problem

Beitragvon Lone » 10.07.2010 21:31

kann es daran liegen, dass deine Methoden zwar werte mit return ausgeben, du aber die ausgegebenen werte nicht übernimmst ?


also entweder xyz = p1.rotate(-pi/6) , wobei xyz vorher als polar2d definiert wurde ...
oooder du benutzt in deinen methoden kein return sondern nen pointer / ein & , damit du den reingesteckten vektor auch wirklich direkt veränderst ....


... oder ?
Lone
 
Beiträge: 4
Registriert: 10.07.2010 21:27

Re: Schon wieder ein Problem

Beitragvon mabl » 11.07.2010 09:02

Wie Lone schon geschrieben hast erzeugst du ja immer ein neues Objekt, und gibst das zurueck. Du musst allerdings das aktuelle Objekt aendern, z.b. so:
Code: Alles auswählen
polar2d polar2d::operator*=(double x)
{
   Laenge*=x;
   
   return *this;
}


Dabei wird jetzt die Laenge des Objekts direkt veraender. Du musst allerdings noch ein polar2d Objekt zurueck geben, deswegen nutzt man this. this ist ein Zeiger auf das aktuelle Objekt. *this ist also das Aktuelle objekt, was dann mit return zurueck gegeben wird.

Lone hat geschrieben:oooder du benutzt in deinen methoden kein return sondern nen pointer / ein & , damit du den reingesteckten vektor auch wirklich direkt veränderst ....

Das geht natuerlich nicht, denn operator*=(double x) nimmt ja einen Double, und keinen polar2d Parameter
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: Schon wieder ein Problem

Beitragvon Lone » 11.07.2010 10:00

freilich geht das
musst halt den vektor auch noch als argument übergeben

ach ja, statt xyz kannst ja dann einfach den vektor direkt überspeichern, also in der main

p1=p1.rotate(....)

vermutlich die einfachste Lösung wenn man das Programm soweit wie oben schon hat
Lone
 
Beiträge: 4
Registriert: 10.07.2010 21:27

Re: Schon wieder ein Problem

Beitragvon Cashdogg » 11.07.2010 10:13

OK, die main war ja in der Klausur fest und den this-Zeiger hatten wir in der Vorlesung noch nicht, gibt es denn dann noch eine Möglichkeit ausgehend von den Methoden dieses Problem zu beheben?
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Schon wieder ein Problem

Beitragvon Lone » 11.07.2010 11:09

ok, ich bin doof , ich sehs ja ein :

du kannst natürlich in deinen methoden die jeweiligen elemente deines vektors direkt ändern
das problem ist: du änderst in rotate etwa nur dein erg

du machst : erg.Winkel = blablubb
besser : Winkel = blablubb

weil da du die methode später mit p1.rotate aufrufst, nimmt er automatisch p1.Winkel für den Winkel .... und ändert den auch
uuund ich habs grad getestet und es klappt

sorry, is natürlich die einfachste Lösung ^^ Im endeffekt ja wie in deinem Konstruktor da sagst du ja auch Winkel = ... statt irgendwas.winkel = ... und return irgendwas


edit
also, kurz mal nochmal getestet
versuchs mit


class polar2d
{
private:
double Laenge;
double Winkel;
public:
polar2d(){};
polar2d(double, double);
void operator*=(double);
void rotate(double);
void Ausgabe();
friend double get_x(polar2d);
friend double get_y(polar2d);
};

polar2d::polar2d(double r, double phi)
{
Laenge=r;
Winkel=phi;
}

void polar2d::operator*=(double x)
{


Laenge*=x;
// Winkel*=x; ... wird beim multiplizieren wirklich der Winkel geändert ?!


}

void polar2d::rotate(double alpha)
{

Laenge=Laenge;
Winkel= Winkel+alpha;


}


da du ja nixmehr ausgeben musst kannst du die methoden als void lassen, brauchst kein erg mehr ....
Lone
 
Beiträge: 4
Registriert: 10.07.2010 21:27

Re: Schon wieder ein Problem

Beitragvon Cashdogg » 11.07.2010 11:24

Also wenn ich das jetzt richtig verstanden habe mach ich folgenden Denkfehler:

Ich geben den einzelnen Methoden Rückgabewerte, die im Hauptprogramm aber nicht verwendet werden. Gleichzeitig ändere ich nur meine neu eingeführte Größe aber nicht den egentlichen Vektor. Wenn ich jetzt auf den Rückgabewert verzichte und in void übergehe, dann wird der interne Wert geändert.

Falls noch jemand die Musterlösung der ratio-Klasse im Gedächtnis hat, dort wurde es doch eigentlich genau so gemacht wie ich es zu Beginn hatte, warum funktioniert es dann aber dort?
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Schon wieder ein Problem

Beitragvon Lone » 11.07.2010 11:43

Code: Alles auswählen
int main()
{
    Ratio a1(2,25) ;
    Ratio a2(7,5) ;
    Ratio a3(2,5) ;
    Ratio a4(1,4) ;
    Ratio a5(1,3) ;
    Ratio ergebnis = a1/a2 - a3*(-a4+a5) ;
    cout << "Ergebnis als Bruch: " << ergebnis << endl ;
    cout << "Ergebnis als double: " << ergebnis.toDouble() << endl ;

    if (ergebnis==Ratio(2,84)) cout << "... Werte sind gleich!" << endl ;

    // kurzversion:
    cout << Ratio(2,25)/Ratio(7,5) - Ratio(2,5)*(-Ratio(1,4) + Ratio(1,3))
    << endl ;
}


da wird das was die methoden ausgeben entweder direkt ausgegeben oder gespeichert oder verglichen
etwa ergebnis = .....
stünde da einfach nur
a1/a2;
würd auch nichts passieren, genau wie bei dir

PS
in der musterlösung da wird übrigens der *this befehl vorgestellt ... hat mich auch grad gewundert ^^
Lone
 
Beiträge: 4
Registriert: 10.07.2010 21:27

Re: Schon wieder ein Problem

Beitragvon Cashdogg » 11.07.2010 12:09

Ok danke, dann werde ich mich heute nochmal mit der ganzen Problemstellung beschäftigen.
Cashdogg
 
Beiträge: 408
Registriert: 20.12.2008 15:05

Re: Schon wieder ein Problem

Beitragvon phys » 12.07.2010 19:52

mabl hat geschrieben:
Code: Alles auswählen
polar2d polar2d::operator*=(double x)
{
   Laenge*=x;
   
   return *this;
}




Ich verstehe nicht warum durch ein return der Vektor selber verändert wird. kann mir das jemand erklären?
phys
 
Beiträge: 67
Registriert: 14.06.2009 11:26

Nächste

Zurück zu Programmieren

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron