koodrinatensystem (Konvertierung: kartesisch - polar)
-
Kleiner Tipp: wenn du beim umwandeln von kartesisch in polar bist, dann nimm
atan2(y, x)
anstelle vonatan(x/y)
. Siehe man: atan2, http://en.wikipedia.org/wiki/Atan2
-
#define PI 3.14 typedef enum {kartesisch, polar} v_typ; typedef struct { v_typ typ; float param[2]; } vektor; void convert(vektor *z, v_typ zieltyp) { int x,y,betrag,cos(winkel),sin(winkel); if (p[]==0) { x=betrag*cos(winkel); } if (p[]==1) { y=betrag*sin(winkel); } betrag=sqrt(x*x+y*y); if(x!=0 && y!=0) tan(winkel)=y/x; return (x,y,betrag,tan(winkel)); }
so bin ich auf dem richtigen weg?
-
@DirkB mein prof schafft in einer vorlesung 30 folien..:S sturcts hatten wir letztens..aber keine ahnung..wenn mans nur erklärt bekommt ist es eine sache..:S
-
vnecked schrieb:
so bin ich auf dem richtigen weg?
#define PI 3.14 typedef enum {kartesisch, polar} v_typ; typedef struct { v_typ typ; float param[2]; } vektor; void convert(vektor *z, v_typ zieltyp) { int x,y,betrag,cos(winkel),sin(winkel); // int ist ein bisschen blöd für z.B. PI oder ? sin und cos sind in <math.h> deklariert. if (p[]==0) // was soll den p[] sein? { x=betrag*cos(winkel); // wo kommt betrag und winkel her? } if (p[]==1) // x und y sollten schon im gleichen if Zweig behandelt werden. { y=betrag*sin(winkel); } betrag=sqrt(x*x+y*y); // bisschen spät für betrag if(x!=0 && y!=0) // Überleg mal warum x != 0 sein soll. tan(winkel)=y/x; // du brauchst den Winkel nicht den tan // und was ist bei x == 0? return (x,y,betrag,tan(winkel)); }
Du hast z und zieltyp.
Woher weißt du ob polar oder kartesisch?
Wo stehen x und y im struct?
Wo stehen winkel und betrag im struct?Nimm besser double statt float.
Lies nochmal die Aufgabe, steht eigentlich alles drin.
-
#define PI 3.14 typedef enum {kartesisch, polar} v_typ; typedef struct { v_typ typ; float param[2]; } vektor; void convert(vektor *z, v_typ zieltyp) { float x,y,betrag; if(typ==kartesisch) { betrag = sqrt(x*x+y*y); if(x==0 || y==0) { exit; } else if { atan2=y/x } } if(typ==polar) { if(param[0]) { x=betrag*acos } if(param[1]) { y=betrag*asin } } return (x,y); }
-
kann das mal jemand analysieren
fehlt noch irgendwas..kann man was ergänzen? ist ein fehler drin? ist die aufgabenstellung so schon bearbeitet?
-
@dirkb soll ich denn noch ein scanf einbauen?!
-
Ok nochmal von vorne. Helfen ok aber keine Hausaufgaben machen.
vnecked schrieb:
zeile 1 : aufzählungstyp und darf nur 2 integer variablen annehmen polar und kartesisch ..name des typs v_typ
zeile 4: eine struktur
zeile 6:float feld: 0 für x 1 für yIn der Struktur vektor existiert das float-feld param[]. Dieses Feld enthält je
nach Konvertierungsrichtung param[0]=x bzw. betrag und param[1]=y bzw.
winkel. Die Ergebnisse der Konvertierung schreiben Sie ebenfalls in dieses Feld,
d.h. die alten Werte werden überschrieben.#define PI 3.14 typedef enum {kartesisch, polar} v_typ; typedef struct { v_typ typ; float param[2]; } vektor; void convert(vektor *z, v_typ zieltyp) {
Die Elemente einer struct werden durch . getrennt angesprochen. In der struct vektor mit Namen v steht in
v.typ steht ob poloar oder karte.... v.param[0] ist x oder betrag v.param[1] ist y oder winkel
Wenn du aber einen Zeiger auf eine struct hast nimmst du statt . ->
also z->typ und z->param[0]Jetzt weißt du wo x,y oder betrag/winkel stehen oder auch wieder hingeschrieben werden.
Du sollst die Konvertierungsrichtung ermitteln, und dann die neuen Werte berechnen und wieder in die struct schreiben.
vnecked schrieb:
@dirkb soll ich denn noch ein scanf einbauen?!
Warum?
Um convert zu testen kannst du auch feste Parameter in main() vorgeben.
Wenn das läuft kannst du zum aufhübschen ein Programm drumbauen was Eingaben verarbeitet. Das ist aber nicht die gestellte Aufgabe.
-
dann brauch ich also x und y nicht zu initialisieren und ich nehme einfach v.param[0] für x und v.param[1] für y?
-
#define PI 3.14 typedef enum {kartesisch, polar} v_typ; typedef struct { v_typ typ; float param[2]; } vektor; void convert(vektor *z, v_typ zieltyp) { float x,y,betrag; if(typ==0) { betrag = sqrt(x*x+y*y); if(x==0 || y==0) { exit; } else if { atan2=y/x; } } if(typ==1) { if(vektor.param[0]) { vektor.param[0]=x=betrag*acos; } if(vektor.param[1]) { vektor.param[1]=y=betrag*asin; } } return (x,y); }
ich hab keine ahnung mehr wirklich..ich bin schon den ganzen tag da dran :S
-
Wenn du schon einen enum definierst, dann solltest du auch die definierten Konstanten benutzen.
DirkB hat schon mindestens einmal (hab den Thread nur überflogen) geschrieben, dass auf die Member eines Zeigers auf ein Struct mit dem -> Operator zugegriffen wird. acos, asin etc. sind Funktionen, die einen Parameter erwarten.
Du solltest dir wirklich noch einmal dein Vorlesugnsskript und oder ein Buch vornehmen.if(z->typ == zieltyp) // Member ist zieltyp -> wir können / müssen abbrechen return; float x,y,betrag,winkel; // Variablen deklarieren if(zieltyp==kartesisch) // bedeutet, dass z->typ polar ist { betrag = z->param[0]; // siehe Aufgabenstellung winkel = z->param[1]; // siehe Aufgabenstellung x = betrag * cos(winkel); // siehe Aufgabenstellung y = betrag * sin(winkel); // siehe Aufgabenstellung z->typ = kartesisch; // Nun die Member ändern z->param[0] = x; z->param[1] = y; }
Die Konvertierung in die andere Richtung überlasse ich dir, richte dich einfach nach der Aufgabenstellung.
-
oh man..so simpel eigentlich -.- danke leute:D
-
#define PI 3.14 typedef enum {kartesisch, polar} v_typ; typedef struct { v_typ typ; float param[2]; } vektor; void convert(vektor *z, v_typ zieltyp) { if(z->typ == zieltyp) // Member ist zieltyp -> wir können / müssen abbrechen return; float x,y,betrag,winkel; // Variablen deklarieren if(zieltyp==kartesisch) // bedeutet, dass z->typ polar ist { betrag = z->param[0]; // siehe Aufgabenstellung winkel = z->param[1]; // siehe Aufgabenstellung x = betrag * cos(winkel); // siehe Aufgabenstellung y = betrag * sin(winkel); // siehe Aufgabenstellung z->typ = kartesisch; // Nun die Member ändern z->param[0] = x; z->param[1] = y; } if(zieltyp==polar) { x = z->param[0]; y = z->param[1]; betrag=sqrt(x*x+y*y); if(x==0 || y==0) return; tan(winkel)=x/y; z->typ = polar; z->param [0] = betrag; z->param [1] = winkel; } }
if(zieltyp==kartesisch) // bedeutet, dass z->typ polar ist
du hast z->typ kartesisch gemeint da oben oder?
-
1. Rück deinen Code richtig ein. Sonst ist der einfach unleserlich und du machst Fehler. Vicious Falcon hat es doch richtig vor gemacht. Also halte dich dran!
tan(winkel)=x/y;
So funktioniert das im Code natürlich nicht! Denk einmal genau nach, was die Zeile in C sagt (und nicht was sie mathematisch sagt)!
-
vnecked schrieb:
if(zieltyp==kartesisch) // bedeutet, dass z->typ polar ist
du hast z->typ kartesisch gemeint da oben oder?
Das denke ich nicht, denn er hat ja nur die eine Umwandlung beschrieben.
Du hast ja selber raus gefunden wann man nicht wandeln muss.
Allerdings ist
if(x==0 || y==0) return; tan(winkel)=x/y;
absolut nicht richtig.
Mal es dir mal auf ein Papier auf. Nimm verschiedene Quadranten, also auch Positive und negative Werte für x und y.