Vektorrechnung
-
Hi Leute,
ich habe mal wieder ein Problem bzw. brauche Hilfe.
Diesmal weiß ich gar nicht weiter.
Habe im Internet nach plausiblen Beispielen gesucht, aber nichts hilfreiches gefunden.Und zwar soll ich ein Modul vector schreiben das bestimmte Funktionen hat.
Ich habe das Beispiel:
Dementsprechend sieht ja vector sub gleich aus, nur dass der Operator - ist richtig?
"vector set" ist wahrscheinlich die Definition von x,y,z, aber wie macht man das?
"vector mult" steht wahrscheinlich für die Multiplikation, aber ist es nicht das gleiche wie vector add nur mit * ?
Denn in der Klammer steht ja double value, const Vector *v2.void printVector ist die Ausgabe vom Resultat?!
ich seh schon...da kommt einiges auf mich zu..
Vielen Dank fürs Lesen wie immer!!
-
Hi,
Bist du dir sicher, dass das ne "ANSI C" Aufgabe sein soll? Das ist eigentlich ein Paradebeispiel für C++. Und ja, sub ist wie add, nur mit "-"
"vector mult" steht wahrscheinlich für die Multiplikation, aber ist es nicht das gleiche wie vector add nur mit * ?
Denn in der Klammer steht ja double value, const Vector *v2.Das ist eine Skalarmultiplikation. Jeder Wert des Vectors wird mit dem Skalar "value" multipliziert.
"dot" ist das Skalarprodukt,
"cross" das KreuzproduktIch habe das Gefühl, dass sich bei dir hier nicht um ein direktes Programmierproblem, sondern eher um ein mathematisches Verständnissproblem handelt. Ggf. nachlesen z.B. http://de.wikipedia.org/wiki/Kreuzprodukt
printVector kann einen Vecor auf der Konsole darstellen. Z.B. mit printf("....",..) usw.
ich seh schon...da kommt einiges auf mich zu..
Das ist "eigentlich" eine einfache Aufgabe, wenn die mathematischen (Grund-)Kenntnisse vorhanden sind. Viel Erfolg, die Lösung will ich hier halt nicht hinklatschen. Gruß Andy
-
wwwAndy schrieb:
Bist du dir sicher, dass das ne "ANSI C" Aufgabe sein soll? Das ist eigentlich ein Paradebeispiel für C++.
Ich finde schon, dass sich die Aufgabenstellung nach C anhört. In C++ würde das Paradebeispiel bestimmt Dinge wie Operatorüberladung einbeziehen.
-
Hallo Andy,
zuerst danke für die Tipps!
Ja, die Aufgabe ist in C. Habe im Internet nach Beispielen gesucht. Aber dadurch dass ich auf diese Art (mit Pointern, Modul) noch nicht programmiert habe fällt mir das natürlich umso schwerer da was zu verstehen. Wobei ich denke das alles in C++ war was ich gefunden habe.
Danke..!
-
"\vektor.c(42) : error C2232: '->x': Der linke Operand ist vom Typ 'struct', verwenden Sie '.'"
Da steht doch schon die Lösung. Du sollst anstatt ->x .x benutzen.
-
Ah stimmt, habe ich auch probiert, dann blieben die Meldungen
\vektor.c(47) : error C2440: 'Funktion': 'Vector' kann nicht in 'const Vector *' konvertiert werden
\vektor.c(47) : warning C4024: 'printVector': Unterschiedliche Typen für formalen und übergebenen Parameter 1
\vektor.c(48) : error C2440: 'Funktion': 'Vector' kann nicht in 'const Vector *' konvertiert werden
\vektor.c(48) : warning C4024: 'printVector': Unterschiedliche Typen für formalen und übergebenen Parameter 1
\aufgabe9\vektor.c(50) : error C2440: 'Funktion': 'Vector' kann nicht in 'const Vector *' konvertiert werden
\vektor.c(50) : warning C4024: 'add': Unterschiedliche Typen für formalen und übergebenen Parameter 1
\vektor.c(50) : error C2440: 'Funktion': 'Vector' kann nicht in 'const Vector *' konvertiert werden
\vektor.c(50) : warning C4024: 'add': Unterschiedliche Typen für formalen und übergebenen Parameter 2
\vektor.c(51) : error C2065: 'result': nichtdeklarierter Bezeichner
\vektor.c(51) : warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'const Vector *' und 'int' unterschiedlich
\vektor.c(51) : warning C4024: 'printVector': Unterschiedliche Typen für formalen und übergebenen Parameter 1
-
Jetzt habe ich es.
main() { Vector v1, v2; Vector v3; printf("1. Vektor eingeben: "); scanf("%lf %lf %lf",&v1.x,&v1.y,&v1.z); printf("2. Vektor eingeben: "); scanf("%lf %lf %lf",&v2.x,&v2.y,&v2.z); printVector(&v1); printVector(&v2); v3 = add(&v1, &v2); printVector(&v3); }
Und es funktioniert wie ich sehe. Jetzt nur noch die anderen Funktionen rein machen und über switch wählen.
Meine Aufgabe sieht so aus
Schreiben Sie ein Modul namens vector, das die folgende Funktionalität realisiert.
* Vector set( double vec[3] );
* Vector add( const Vector *v1, const Vector *v2 );
* Vector sub( const Vector *v1, const Vector *v2 );
* double dot( const Vector *v1, const Vector *v2 );
* Vector cross( const Vector *v1, const Vector *v2 );
* Vector mult( double value, const Vector *v2 );
* void printVector( const Vector * v );Was kommt in die vector.h ?
Die Funktionen die über main() sind einfach?!
-
dprzon schrieb:
Was kommt in die vector.h ?
dein 'typedef struct ... Vector' und prototypen der vektorfunktionen...
:xmas2:
-
dprzon schrieb:
Schreiben Sie ein Modul namens vector, das die folgende Funktionalität realisiert.
* Vector set( double vec[3] );
* Vector add( const Vector *v1, const Vector *v2 );
* Vector sub( const Vector *v1, const Vector *v2 );
* double dot( const Vector *v1, const Vector *v2 );
* Vector cross( const Vector *v1, const Vector *v2 );
* Vector mult( double value, const Vector *v2 );
* void printVector( const Vector * v );Was kommt in die vector.h ?
Die Funktionen die über main() sind einfach?!Nein, in die Header-Datei kommen typischerweise die Deklarationen. In die vector.c-Datei kommt die Funktion. Dann compilierst Du die vector.c-Datei (die die main-Funktion nicht enthält) zu einer Objekt-Datei, die Du dann zu dem Hauptprogramm dazulinken kannst.
Ausführlicher in der C++-FAQ, aber die Konzepte sind ziemlich gleich: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39477.html
Näheres solltest Du in deinem Skript oder jedem C-Buch finden. Das "Modulkonzept" kann am Anfang etwas verwirrend sein, so schlimm ist das aber alles nicht.
-
Zuerst danke euch für die Erklärung.
Ich arbeite mit C mit dem Programm Visual Studio.
Da habe ich bei jedem Projekt (Programm) einen Projektmappen-Explorer. Dort gibt es den Punkt Headerdatei. Ich habe eine neue leere hinzugefügt und alles was ich vor main() definiert habe dort rein kopiert.
In die *.c Datei habe ich oben noch #include "vector.h" reingeschrieben und durchlaufen lassen und es geht. Ist es so gedacht bzw. ok?
-
dprzon schrieb:
Zuerst danke euch für die Erklärung.
Ich arbeite mit C mit dem Programm Visual Studio.
Da habe ich bei jedem Projekt (Programm) einen Projektmappen-Explorer. Dort gibt es den Punkt Headerdatei. Ich habe eine neue leere hinzugefügt und alles was ich vor main() definiert habe dort rein kopiert.In die *.c Datei habe ich oben noch #include "vector.h" reingeschrieben und durchlaufen lassen und es geht. Ist es so gedacht bzw. ok?Nein, so ist das nicht gedacht. Wie es gedacht ist:
du hast eine Datei vector.h, da kommen (wie net geschrieben hat) die Deklarationen rein wie z.B.die Deklaration des Typs "Vector" und die Prototypen deiner Vektorfunktionen wie z.B.... Vector set( double vec[3] ); Vector add( const Vector *v1, const Vector *v2 ); Vector sub( const Vector *v1, const Vector *v2 ); ..
in die datei vector.c kommt ganz oben ein #include "vector.h"
und die Implementation deiner Funktionen wie z.B.Vector add( const Vector *v1, const Vector *v2 ) { Vector temp; temp.x=v1->x + v2->x; ... return temp; }
und dann noch ein kleines Testprogramm, sagen wir main.c
(Die neue Datei kannst du irgendwie mit "C Datei hinzufügen erstellen,
mitcompiliert und gelinkt wird sie dann eigentlich automatisch)dort kommt ganz oben ein #include "vector.h"
Und deine "int main()" Funktion.So ist der Code dann schön getrennt.
vector.c enthält die Algorithmen, die braucht eigentlich später niemand, der deine Funktionen verwenden will, lesen.vector.h enthält die Funktionsdeklarationen. So wird dem Compiler mitgeteilt, dass später die Implementation erfolgt. Außerdem ist es für andere Programmierer, die deine Funktionen verwenden wollen, der erste Anlaufpunkt um zu erkennen mit welchen Argumenten deine Funktionen arbeiten.
und in der main.c werden dann deine tollen Algorithmen verwendet.
HTH Andy
-
Vielen Dank für die Mühe! Habs jetzt hinbekommen und läuft!