Modulare Programmgestaltung, Vektor
-
Guten Abend zusammen,
folgendes ist meine Aufgabenstellung:
Entwerfen und implementieren Sie ein C/C++- Modul zum Arbeiten mit dreidimensionalen Vektoren. Das Modul soll in der Datei vektor.cpp
implementiert werden und über seine Schnittstelle (Datei vektor.h) die folgenden Funktionalitäten bereitstellen:Ausgabe eines Vektors auf dem Bildschirm
Berechnung des Skalarprodukts zweier Vektoren
Addition zweier Vektoren
Berechnung der Länge eines Vektors
Berechnung des Winkels (in Grad) zwischen zwei Vektoren
Definieren Sie zunächst einen neuen Datentyp VektorT, durch den ein Vektor
mit seinen x-, y- und z-Koordinaten beschrieben werden kann. Legen Sie fernen die Funktionsprototypen der Schnittstellenfunktionen fest bevor
Sie mit der Implementierung des Moduls beginnen. Testen
Sie Ihr Modul indem Sie es in der Datei main.cpp
inkludieren und aus dem Hauptprogramm
aufrufen.So habe ich nun wie folgt eine vektor.cpp, eine main.cpp und eine vektor.h Datei angelegt.
Allerdings komme ich gerade absolut nicht mehr weiter.
Ist es zunächst überhaupt richtig die neue Datenstruktur VektorT in der vektor.h Datei anzulegen?
Und dann habe ich probiert erstmal einen Vektor auszugeben, allerdings scheiter ich schon daran da ich nicht weiß, welche Parameter ich übergeben muss.Ich wäre super dankbar wenn jemand hier mal einmal drüber schauen könnte um mir ein paar Hilfestellungen zu geben.
Liebe Grüße
vektor.cpp
#include <iostream> #include <cmath> #include "vektor.h" using namespace std; void vek_ausgabe(VektorT Vek1) { cout << "x-Koordinate: " << Vek1.x << endl; cout << "y-Koordinate: " << Vek1.y << endl; cout << "z-Koordinate: " << Vek1.z << endl; } double vek_skalarpro(const VektorT Vek1, const VektorT Vek2) { //VektorT Vek1, Vek2; double skalarpro=(Vek1.x*Vek2.x + Vek1.y*Vek2.y + Vek1.z*Vek2.z); return skalarpro; } VektorT vek_addition(const VektorT Vek1, const VektorT Vek2) { VektorT Vek3; Vek3.x= Vek1.x+Vek2.x; Vek3.y= Vek1.y+Vek2.y; Vek3.z= Vek1.z+Vek2.z; return Vek3; } double vek_betrag(const VektorT) { VektorT Vek; double laenge = sqrt((Vek.x*Vek.x) + (Vek.y*Vek.y) + (Vek.z*Vek.z)); return laenge; } double vek_winkel(const VektorT Vek1, const VektorT Vek2) { //VektorT Vek1, Vek2; double winkel = (vek_skalarpro(Vek1, Vek2)/(vek_betrag(Vek1)*vek_betrag(Vek2))); return winkel; }
vektor.h
struct VektorT { int x,y,z; }; void vek_ausgabe(); double vek_skalarpro(const VektorT, const VektorT); VektorT vek_addition(const VektorT , const VektorT); double vek_betrag(const VektorT); double vek_winkel(const VektorT, const VektorT);
main.cpp
#include <iostream> #include "vektor.h" void vek_ausgabe(VektorT); double vek_skalarpro(const VektorT, const VektorT); VektorT vek_addition(const VektorT , const VektorT); double vek_betrag(const VektorT); double vek_winkel(const VektorT, const VektorT); int main() { VektorT Vektor1, Vektor2; Vektor1.x = 1; Vektor1.y = 4; Vektor1.z = 3; Vektor2.x = 2; Vektor2.y = 6; Vektor2.z = 12; void vek_ausgabe(Vektor1); }
-
Stars_nStripes schrieb:
So habe ich nun wie folgt eine vektor.cpp, eine main.cpp und eine vektor.h Datei angelegt.
Und was genau ist das Problem? Der Code ist zwar nicht gut, aber du hast ja durchaus was hinbekommen. In der Aufgabe steht sinnigerweise C/C++. Der Code schaut aber eher nach C++ aus (cout und so), also ist wohl eher eine Klasse mit Methoden gewollt.
So an sich sollte dein Code aber auch halbwegs funktionieren (habs mir nicht genau angeschaut).p.s. In der main.cpp solltest du das void vor vec_ausgabe natürlich weglassen, fällt mir grad auf.
-
Grundsätzlich okay so. Einige Fehlerchen sind drin:
1. vektor.cpp, Zeile 37:
Vek
wolltest du wohl als Funktionsargument einbauen
2. vektor.h, Zeile 7: Parameter vergessen, vergleiche Zeile 8 in vektor.cpp
3. main.cpp, Zeilen 5-9: kein richtiger Fehler, aber redundante Deklarationen, sind bereits über vektor.h inkludiert
4. mainc.pp, Zeile 24: dasvoid
muss beim Funktionsaufruf weg, das ist nur bei der Deklaration von Belang.
-
Noch etwas:
Was du in
vek_winkel()
berechnest, ist nicht der Winkel zwischen den Vektoren, sondern der Kosinus des Winkels.
Um den Winkel zu erhalten, musst du auf diesen Wert noch den inversen Kosinus anwenden (acos()
).Und noch zwei Tips:
1. Es empfiehlt sich bei diesen Funktionen (nicht immer!) für die Parameter konstante Referenzen zu nehmen (const VektorT&
).
So müssen die Vektoren beim Funktionsaufruf nicht kopiert werden, sondern es wird direkt auf den übegebenen Vektoren gearbeitet.
Wenn dir Referenzen noch nichts sagen sollten, ist es so allerdings auch eine ordentliche Lösung.
2. Es lässt sich etwas Code sparen und die Funktionvek_betrag()
elegant mithilfe des Skalarprodukts formulieren:double laenge = sqrt(vek_skalarpro(Vek, Vek));
Veilleicht empfindest empfindest du das ja auch als etwas übersichtlicher.
Gruss,
Finnegan