Hey Leute,
bin wieder zurück
Also hab mir echt mühe gegeben, komme nicht mehr weiter.
Es ist diesmal etwas aufwendig durch zuschauen Ihr habt gesagt ihr wollt erstmal was sehen
vector.c-Datei (main)
vec_funcs.c - Funktionsdatei
vec_funcs.h - Datei
vec_testers.c - Datei
vec_testers.h
So ich hoffe ihr könnt mir einzelne Stichpunkte geben, wie ich weiter arbeiten könnte.
Aufgabenstellung :
1. Schreiben Sie ein Hauptprogramm, das Triplets von doubles von der Eingabedatei testvectors.dat bis EOF liest, daraus je einen vector_t [siehe a)] erzeugt, diese in ei- nem array von Strukturen speichert und dann testweise alle u. g. Funktionen verwendet. Für jede neu geschriebene Funktion sollte im Hauptprogramm ein Block zur Kontrollaus- gabe implementiert werden, der für alle Vektoren im array den/die Eingabevektor(en) mit dem Ergebnis des jeweiligen Funktionsaufrufes zeigt. Addieren Sie z.B. für den Test der Funktion aus d) in einer Schleife über alle Vektoren den jeweils i-ten mit dem i+1-ten Vektor.
[Beachten Sie, dass die Eingabewerte insbesondere auch die Grenzfälle (z. B. zwei Vek- toren in einer Ebene, zwei senkrecht aufeinander stehende Vektoren, zwei parallele Vek- toren, Null-Vektor) abdecken, siehe auch i).]
bin wieder zurück

Also hab mir echt mühe gegeben, komme nicht mehr weiter.
Es ist diesmal etwas aufwendig durch zuschauen Ihr habt gesagt ihr wollt erstmal was sehen

vector.c-Datei (main)
C:
#include <stdlib.h>
#include <stdio.h>
#include "vec_funcs.h"
#include "vec_testers.h"
int main() {
enum { MAXV = 30 }; /* Maximalzahl array-Elemente/Test-Vektoren */
vector_t vectors[MAXV]; /* array der eingelesen Testvektoren */
int nv; /* Anzahl eingelesener Vektoren */
char infilename [] = "/Users/************/Desktop/INF 1/INF 1/Übg 6/A6_Rumpf/testvectors.dat";
printf("\n3D-Vektorrechnung\n");
printf("=================\n\n");
/* Test-Vektoren einlesen und speichern */
nv = vec_read(infilename, vectors, MAXV);
if (nv <= 0) return 1;
/* b) Kontroll-Ausgabe der Test-Vektoren */
test_vec_out(vectors, nv);
/*************************************************************
* 1) Verwendung aller definierten Vektor-Funktionen
*************************************************************/
printf("=== Funktionsaufrufe mit Test-Vektoren ===\n\n");
/* c) Betrag/Norm */
test_vec_norm(vectors, nv);
/* d) Vektoraddition */
test_vec_add(vectors, nv);
/* e) Mult. mit Skalar */
test_vec_smul(vectors, nv);
/* f) Vergleich */
test_vec_equal(vectors, nv);
/* g) Skalarprodukt */
test_vec_dotp(vectors, nv);
/* h) Kreuzprodukt */
test_vec_crossp(vectors, nv);
/* i) Winkel */
test_vec_angle(vectors, nv);
printf("\n");
return 0;
}
vec_funcs.c - Funktionsdatei
C:
#include "vec_funcs.h"
/***********************************************************************/
int vec_read(char *infilename, vector_t vectors[], const int MAXV) {
/* liest Vektoren von Datei in struct-array vectors ein,
* gibt Anzahl gelesener Vektoren zurück */
FILE *infile;
double c1, c2, c3;
int nv = 0;
/* Eingabedatei oeffnen und pruefen */
if ((infile = fopen(infilename, "r")) == NULL) {
fprintf(stderr, " *** Fehler: Kann '%s' nicht zum Lesen oeffnen!\n",
infilename);
return 0;
}
/* Schleife ueber alle Test-Vektoren(je 3 doubles), speichern */
while (fscanf(infile, "%lf %lf %lf", &c1, &c2, &c3) == 3) {
if (nv >= MAXV) { /* Feldgroesse absichern */
fprintf(stderr,
" *** Hinweis: Mehr als %d Testvektoren auf der Datei!\n", MAXV);
break;
}
vectors[nv] = vec_gen(c1, c2, c3);
nv++;
}
/* Eingabedatei schliessen und Kontrollmeldung */
fclose(infile);
printf("Es wurden %d Testvektoren eingelesen.\n\n", nv);
return nv;
}
/***********************************************************************/
vector_t vec_gen(const double xcoord,
const double ycoord,
const double zcoord) {
/* erzeugt einen Ortsvektor aus drei kartesischen Koordinaten */
vector_t vec;
vec.x=xcoord;
vec.y=ycoord;
vec.z=zcoord;
return vec;
}
/***********************************************************************/
void vec_out(const vector_t a) {
/* gibt einen Ortsvektor formatiert nach stdout aus */
printf(" %4.3lf %4.3lf %4.3lf\n",a.x,a.y,a.z);
}
/***********************************************************************/
void vec_out_idx(vector_t vectors[], const int idx) {
/* gibt ein Element des Vektor-Feldes mit
* Index formatiert nach stdout aus */
printf("%3d:", idx);
vec_out(vectors[idx]);
}
/***********************************************************************/
double vec_norm(const vector_t a) {
/* Betrag/Norm eines Vektors */
double norm = 0.;
norm = sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
return norm;
}
/***********************************************************************/
vector_t vec_add(const vector_t a, const vector_t b) {
/* Addiert zwei Ortsvektoren */
vector_t vsum;
vsum.x = a.x + b.x;
vsum.y = a.y + b.y;
vsum.z = a.z + b.z;
return vsum;
}
/***********************************************************************/
vector_t vec_smul(const vector_t a, double f) {
/* Multiplikation zweier Vektoren */
vector_t vsmul;
vsmul.x = a.x*f;
vsmul.y = a.y*f;
vsmul.z = a.z*f;
return vsmul;
}
/***********************************************************************/
vector_t vec_equal(const vector_t a);
/***********************************************************************/
vector_t vec_dotp(const vector_t a, const vector_t b) {
double vskal2;
vector_t vskal;
vskal.x = a.x * b.x;
vskal.y = a.y * b.y;
vskal.z = a.z * b.z;
vskal2 =vskal.x+vskal.y+vskal.z;
return vskal;
}
vec_funcs.h - Datei
C:
#ifndef VEC_FUNCS_H
#define VEC_FUNCS_H
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/* Struktur zur Definition eines 3D-Punktes/Ortsvektors */
typedef struct {
double x,y,z;
} vector_t;
int vec_read(char *infilename, vector_t vectors[], const int MAXV);
/* liest Vektoren von Datei in struct-array vectors ein,
* gibt Anzahl gelesener Vektoren zurück */
vector_t vec_gen(const double x, const double y, const double z);
/* erzeugt einen Ortsvektor aus drei kartesischen Koordinaten */
void vec_out(const vector_t a);
/* gibt einen Ortsvektor formatiert nach stdout aus */
void vec_out_idx(vector_t vectors[], const int idx);
/* gibt ein Element des Vektor-Feldes mit Index formatiert nach stdout aus */
double vec_norm(const vector_t a);
/* Betrag/Norm eines Vektors */
vector_t vec_add(const vector_t a, const vector_t b);
/* Addiert zwei Ortsvektoren */
vector_t vec_smul(const vector_t a, double f);
/* Multiplikation eines Vektors */
#endif
vec_testers.c - Datei
C:
#include "vec_testers.h"
/***********************************************************************/
void test_vec_out(vector_t vectors[], const int nv) {
/* c) Test-Ausgabe Vektoren */
int i;
printf("=== Kontroll-Ausgabe eingelesener Test-Vektoren ===\n\n");
for (i = 0; i < nv; i++) {
vec_out_idx(vectors, i);
printf("\n");
}
printf("\n");
}
/***********************************************************************/
void test_vec_norm(vector_t vectors[], const int nv) {
/* c) Test-Ausgabe Betrag/Norm eines Vektors */
int i;
printf("Betrag:\n");
printf("-------\n");
for (i = 0; i < nv; i++) {
vec_out_idx(vectors, i);
printf(" ==> %3.3f\n", vec_norm(vectors[i]));
}
printf("\n");
}
/***********************************************************************/
void test_vec_add(vector_t vectors[], const int nv) {
/* d) Test-Ausgabe Betrag/Norm eines Vektors */
int i;
printf("Vektoraddition:\n");
printf("---------------\n");
for (i = 0; i < nv - 1; i++) {
vec_out_idx(vectors, i);
printf(" +\n");
vec_out_idx(vectors, i + 1);
printf(" ==> ");
vec_out(vec_add(vectors[i], vectors[i + 1]));
printf("\n");
}
printf("\n");
}
/***********************************************************************/
void test_vec_smul(vector_t vectors[], const int nv) {
/* e) Test-Ausgabe Skalar mult. mit Vektor */
int i;
printf("Skalar(eigener Betrag) * Vektor:\n");
printf("--------------------------------\n");
for (i = 0; i < nv - 1; i++) {
vec_out_idx(vectors, i);
printf(" ==> ");
vec_out(vec_smul(vectors[i]),double 3));
printf("\n");
}
}
/***********************************************************************/
void test_vec_equal(vector_t vectors[], const int nv) {
/* f) Test-Ausgabe Vergleich zweier Vektoren */
printf("Vergleichen:\n");
printf("------------\n");
printf("\n");
}
/***********************************************************************/
void test_vec_dotp(vector_t vectors[], const int nv) {
/* g) Test-Ausgabe Skalarprodukt */
printf("Skalarprodukt:\n");
printf("--------------\n");
for (i = 0; i < nv - 1; i++) {
vec_out_idx(vectors, i);
printf(" ==> ");
vec_out(vec_smul(vectors[i]),double 3);
printf("\n");
printf("\n");
}
/***********************************************************************/
void test_vec_crossp(vector_t vectors[], const int nv) {
/* h) Test-Ausgabe Kreuzprodukt */
printf("Kreuzprodukt:\n");
printf("-------------\n");
printf("\n");
}
/***********************************************************************/
void test_vec_angle(vector_t vectors[], const int nv) {
/* i) Test-Ausgabe eingeschlossener Winkel */
printf("eingeschlossener Winkel:\n");
printf("------------------------\n");
printf("\n");
}
/***********************************************************************/
vec_testers.h
C:
#ifndef VEC_TESTERS_H
#define VEC_TESTERS_H
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "vec_funcs.h"
void test_vec_out(vector_t vectors[], const int nv);
/* b) Test-Ausgabe Vektoren */
void test_vec_norm(vector_t vectors[], const int nv);
/* c) Test-Ausgabe Betrag/Norm eines Vektors */
void test_vec_add(vector_t vectors[], const int nv);
/* d) Test-Ausgabe Betrag/Norm eines Vektors */
void test_vec_smul(vector_t vectors[], const int nv);
/* e) Test-Ausgabe Skalar mult. mit Vektor */
void test_vec_equal(vector_t vectors[], const int nv);
/* f) Test-Ausgabe Vergleich zweier Vektoren */
void test_vec_dotp(vector_t vectors[], const int nv);
/* g) Test-Ausgabe Skalarprodukt */
void test_vec_crossp(vector_t vectors[], const int nv);
/* h) Test-Ausgabe Kreuzprodukt */
void test_vec_angle(vector_t vectors[], const int nv);
/* i) Test-Ausgabe eingeschlossener Winkel */
#endif
So ich hoffe ihr könnt mir einzelne Stichpunkte geben, wie ich weiter arbeiten könnte.
Aufgabenstellung :
1. Schreiben Sie ein Hauptprogramm, das Triplets von doubles von der Eingabedatei testvectors.dat bis EOF liest, daraus je einen vector_t [siehe a)] erzeugt, diese in ei- nem array von Strukturen speichert und dann testweise alle u. g. Funktionen verwendet. Für jede neu geschriebene Funktion sollte im Hauptprogramm ein Block zur Kontrollaus- gabe implementiert werden, der für alle Vektoren im array den/die Eingabevektor(en) mit dem Ergebnis des jeweiligen Funktionsaufrufes zeigt. Addieren Sie z.B. für den Test der Funktion aus d) in einer Schleife über alle Vektoren den jeweils i-ten mit dem i+1-ten Vektor.
[Beachten Sie, dass die Eingabewerte insbesondere auch die Grenzfälle (z. B. zwei Vek- toren in einer Ebene, zwei senkrecht aufeinander stehende Vektoren, zwei parallele Vek- toren, Null-Vektor) abdecken, siehe auch i).]
- a) Definieren Sie einen geeigneten struct-Datentyp vector_t, der ein 3D-Koordina- tentripel aufnimmt und damit auch als Ortsvektor aufgefasst werden kann.
- b) Definieren Sie Funktionen zum Erzeugen (aus drei skalaren doubles) und zur forma- tierten Ausgabe eines vector_t.
- c) Definieren Sie eine Funktion für die Berechnung des Betrages (euklidische Länge) ei- nes Ortsvektors.
- d) Definieren Sie eine Funktion für die Addition zweier Vektoren.
- e) Definieren Sie eine Funktion für die Multiplikation eines Vektors mit einem Skalar (Streckung, d.h. Skalierung der Vektorlänge).
- f) Definieren Sie eine Funktion, mit der zwei Ortsvektoren auf Gleichheit überprüft werden können.
- g) Definieren Sie Funktionen für das Skalarprodukt (inneres oder Punkt-Produkt, liefert als Ergebnis ein Skalar) und
- h) das Kreuzprodukt (äußeres oder Vektor-Produkt, liefert wieder einen Vektor) zweier V ektoren.
- i) Definieren Sie eine Funktion zur Ermittlung des eingeschlossenen Winkels zwischen zwei Vektoren unter Verwendung der o. g. Funktionen für den Betrag und das Skalar- produkt (beachten Sie die numerischen Probleme mit der Division und dem Argument des acos()).
Zuletzt bearbeitet von einem Moderator: