koodrinatensystem (Konvertierung: kartesisch - polar)
-
soo..also bin im 1. semester und bereite mich auf die prüfungen vor :S jetzt steh ich vor dem folgenden problem...ich weiß leider nicht so recht was ich da machen soll :S
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 yich bin für jede hilfe dankbar :S
Beim Arbeiten mit Landkarten unterscheidet man zwischen kartesischen und polaren
Koordinaten bzw. Vektoren. Dabei kann eine kartesische Koordinate oder Vektor
(x,y) stets auch durch ihren Betrag und ihren Winkel (betrag,winkel) ausgedrückt
werden.Es gilt stets betrag = x y2 2 + und tan (winkel) = y / x (für x!=0);
umgekehrt gilt x = betrag * cos(winkel) und y = betrag * sin(winkel).Schreiben Sie die Funktion convert() für die unten definierten Koordinaten bzw.
Vektoren in der Programmiersprache C.In 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.vorgegeben:
#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) {
-
Wie würdest du das denn von Hand machen?
Schreib es dir in Pseudocode auf - und dann in C.
-
//#include<math.h> #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,sin; x=betrag*cos(winkel); y=betrag*sin(winkel);*/ }
so in der art vielleicht?
und dann noch eine if anweisung kann das sein?
wenn p[0] dann in x wert konvertieren
wenn p[1] dann in y wert konvertieren
-
Geht doch!
Denk aber an x !=0 bzw. was da für ein Winkel ist.
Es werden ein paar mehr if sein.
-
ich weiß bloß nich so richtig was ich mit diesem struch und enum anfangen soll :S vtyp kann also polar und kartesisch annehmen als variable?
-
vnecked schrieb:
ich weiß bloß nich so richtig was ich mit diesem struch und enum anfangen soll :S vtyp kann also polar und kartesisch annehmen als variable?
Ein struct ist ein Sammelbehälter für verschiedene Daten, die zusammengehören.
Ein enum ist ein int bei dem die Inhalte nur schöne Namen statt Zahlen sind.
Der Compiler übersetzt die Namen dann schon in Zahlen.Ein if( typ == polar) ist besser verständlich als if( typ == 1) .
Aber wenn ihr mit Zeigern auf structs arbeitet solltes du schon wissen was ein struct ist und wie man auf Elemente in einem struct zugreift.
-
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)!