Aufgabenstellung(Complex add, sub,.. strukturen etc.)

Googlehupf

Erfahrenes Mitglied
Hallo!

Ich hab eine Aufgabenstellung bekommen die ich nicht verstehe!

Vervollstaendigen Sie die fehlende write File Funktion.
Erweitern Sie die Berechungen um:
1) die Differenz aller Zahlen
2) das Produkt aller Zahlen
3) die Summe aller Kehrwerte der Zahlen
4) Machen Sie die Probe mit hilfe der Umkehrfunktion zu a,b
ausgehend vom berechneten Resultat.

Ein Text-File ist vorhanden, wo 2 Werte in einer Zeile stehen(a ist halt der Real-Teil und b der Imaginär-Teil).

C++:
struct complex_struct
{
  double real;
  double imag;
};

Diese werden ausgelesen und dann halt Complex-Addiert, Subtrahiert, Multipliziert und Dividiert.
Also die 1. Zeile wird mit der 2. Zeile addiert, subtrahiert etc. und das Ergebnis wird dann wiederum addiert, subtrahiert mit der 3. Zeile usw. bis halt ein gesamtes Resultat des Files herauskommt.

Die Zahlen sind durch Beistriche getrennt.

In dem vorgegebenen Text-File steht z.B.:
Code:
5.5,-7.8
3,2.3
...
...
...
...

Frage zum Dividieren:
Man sagte mir ich soll mit Hilfe der Multiplikation Dividieren, aber nur wie? Dividieren mit Komplexen Zahlen muss man ja "Komplex-Erweitern". Wie gesagt wie soll ich das genau machen mit der Multiplikation-Funktion einbinden?
Ich weiß wie man konjugiert komplex erweitert.

Multikation-Funktion:
C++:
complex c_multi(complex a, complex b)
{
  complex result2;
  result2.real = (a.real*b.real) - (a.imag*b.imag);
  result2.imag = (a.imag*b.real) + (b.imag*a.real);
  return result2;
}

"Vervollständigen Sie die fehlende write File Funktion"
Also hier sollen die Ergebnisse von 1), 2), 3) und 4) in eine neue .txt-Datei geschrieben werden.

Der Prototyp sieht so aus:

C++:
void c_write_file(char filename1[], complex compl_array[], int len);

Was soll ich bitte mit dem Struct-Array compl_array[] anfangen? Die Ergebnisse in das Array kopieren und dann ausgeben? Wenn ich das so machen brauch ich ja len gar nicht oder? Aber ich muss int len verwenden... Eins ist schon klar das len für die Länge(also Anzahl) der eingelesenen Zeilen steht.

1): hab ich schon
2): hab ich schon
3): Der Kehrwert ist doch: "1/das was in der Zeile steht" - richtig? Hier muss man ja wieder Komplex-Erweitern? Wie könnte ich das in etwa machen?
4): Was ist hier mit der Probe der Umkehrfunktion gemeint?


Hilft mir bitte auf die Sprünge! :)

PS: Frohe Weihnachten noch!

LG Googlehupf
 
Zuletzt bearbeitet:
Hi

Zum Multiplizieren/Dividieren:
http://de.wikipedia.org/wiki/Komplexe_Zahl
Da steht es ganz einfach, wie gerechnet werden muss.

Zu c_file_write:
len ist keine Anzahl von eingelesenen Sachen, du sollst schreiben.
Und vom einen zum anderen Array kopieren...Datei schreiben.
Öffne eine Datei mit Namen filename1 zum Schreiben.
Mach eine for-Schleife von 0 bis <len. Darin schreibst du compl_array[i] in die Datei.
Realteil, Beichstrich, Imaginärteil, \n
Dann schließt du die Datei wieder.

Probe: Wenn du für a*b c herausbekommst,
musst du auch c/b rechnen und prüfen, ob a rauskommt.

Gruß
 
Danke.

Hi
Zum Multiplizieren/Dividieren:
http://de.wikipedia.org/wiki/Komplexe_Zahl
Da steht es ganz einfach, wie gerechnet werden muss.

Siehe Bild.

Zu c_file_write:
len ist keine Anzahl von eingelesenen Sachen, du sollst schreiben.
Und vom einen zum anderen Array kopieren...Datei schreiben.
Öffne eine Datei mit Namen filename1 zum Schreiben.
Mach eine for-Schleife von 0 bis <len. Darin schreibst du compl_array[i] in die Datei.
Realteil, Beichstrich, Imaginärteil, \n
Dann schließt du die Datei wieder.

Soll ich nun die Ergebnisse in ein neues File schreiben oder das was im vorgegebenen file steht?
 

Anhänge

  • complex.png
    complex.png
    11,9 KB · Aufrufe: 7
Zuletzt bearbeitet:
Bild: Bitte Bilder als Anhänge einbinden.
Und was willst du mir damit sagen?

c_file_write:
Das, was im Array steht, soll in eine neue Datei geschrieben werden.
Unabhängig von den Werten drin.
 
Bild: Bitte Bilder als Anhänge einbinden.
Und was willst du mir damit sagen?

Naja ich soll ja Komplexe Zahlen die in einer Datei stehen dividieren. Ok, ich weiß wie es geht.
Aber man hat mir gesagt ich soll das Unterprogramm "c_multi" zur Hilfe nehmen, aber nur wie?

Ich dacht mir: Bei der Division kommt auch eine Multiplikation vor, aber nur mit Vorzeichen verändertem j(oder i), wenn man halt konjugiert komplex erweitert. Und da dacht ich mir ich rufe c_multi da auf wo ich konjugiert komplex erweitern muss. Aber das funktioniert in dem Falle nicht, da ja die Formel die in c_multi drinnen steht nicht fürs konjugiert komplex erweitern geht, da man ja beim j das Vorzeichen ändert.
Und jetzt weis ich halt nicht wie ich Dividieren soll mit Hilfe von c_multi.
Ohne c_multi weis ich es ja wie es geht... Aber wie funktioniert das Dividieren mit Hilfe von c_multi?

c_file_write:
Das, was im Array steht, soll in eine neue Datei geschrieben werden.
Unabhängig von den Werten drin.

Ahhh ok, danke.
Das schreiben bzw. ausgeben in ein Neues File ist ja ganz einfach. Aber dieses Struktur-Array, da stehn noch keine Werte drinnen...
Es steht ja gar nicht in der Aufgabe was ich ausgeben soll...
Du hast ja geschrieben Realteil Beistrich Imaginärteil... Aber was hat das für einen Sinn die Werte, die schon im vorgegebenen File stehn, in ein neues File rein zu schreiben?
 
Zuletzt bearbeitet:
Division:
Wenn man sich die Multiplikation und den Nenner der Division bei Wikipedia anschaut,
merkt man, dass es fast das selbe ist.
Nur d ist beim Dividieren -d.
Und das b^2+c^2 eben noch.
C++:
complex c_divi(complex a, complex b)
{
    complex result;
    double m = a.imag*a.imag + b.imag*b.imag;
    b.imag = -b.imag;
    result = c_multi(a, b);
    result.real /= m;
    result.imag /= m;
    return result;
}
So verwendest du also die Multiplikation auch mit.


Write-Funktion:
Wenn in der Angabe nie was von Datei-schreiben oder dem Verwenden der Funktion steht,
dann verwende sie eben nicht. Beim Lehrer Gedankenlesen können wir beide nicht.
Einfach so programmieren, dass sie ein übergebenes Array in eine Datei
mit übergebenem Dateinamen speichert, fertig.
 
Danke!

Ich habe mir c_divi nun selbst geschrieben:

Das arrayValues ist ja ein struct-Pointer und da wo es hinzeigt(auf die Speicherstellen und in diese stehn die Werte, richtig?) steht das eingelesene... Also davor wird einmal die ganze Textdatei eingelesen.

Und jetzt bin ich ein bisschen verwirrt... Mit * greift man auf dem Wert einer Variable an einer Speicherstelle zu oder? Und bei einem & bekommt man halt die Adresse, auf dem der Zeiger zeigt.

Das steht im int main():
C++:
complex result3={1.0,0.0};//real muss 1 sein, da da result3 am Anfang gleich den 1. Wert  von arrayValues sein muss.

while(n<file_len)
	{
	  result3=c_divi(result3,*(arrayValues+n),n);//Hier macht man ja +n, weil der Zeiger auf das nächste x oder y zeigen soll, damit man es weiter dividieren kann, aber wenn man nur arrayValues++ macht dann zeigt es immer um eins weiter. Und dadurch man das in Klammer setzt übergibt man den Wert immer auf den arrayValues zeigt... *arrayValues+n ohne Klammern ist was anderes und würde nicht funktionieren?
	  n++;
	}
	printf("\nQuotient aller Komplexer Zahlen:\n");
	c_print(result3);

Unterprogramm zum Ausgeben:
C++:
void c_print(complex a)
{
  printf("%lf + j%lf",a.real,a.imag);
}

Unterprogramm zum Dividieren:
C++:
complex c_divi(complex a, complex b, int n)
{
  complex result3;
  complex result2;
  double nenner=1.0;

  if(n >= 1)
  {
    nenner = (b.real*b.real) + (b.imag*b.imag);
	b.imag=-b.imag;
  }
  
  result2 = c_multi(a,b);

  result3.real=result2.real/nenner;
  result3.imag=result2.imag/nenner;

  return result3;
}

Das eigentliche Problem ist, dass es mir nichts ausgibt... Ich bin das Programm mit Einzelschritt F11 durchgegangen, aber es kommt 0+0j raus obwohl ganz eindeutig am Schluss result3={5.xxxxxxxx/4.xxxxxxxxxx} oder so rauskommt.

Was könnte es da haben?

Ich hab das c_divi ein bisschen anders gemacht, aber so müsste es auch stimmen?

Die if ist dazu da, dass der 1. Wert von result3 dem 1. Wert von arrayValues übereinstimmt und halt dann richtig zu übergeben.

Gruß
 
Zuletzt bearbeitet:
Warum baust du jetzt noch umständliche Pointersachen ein,
die du a) nicht verstehst und b) sowieso nicht brauchst?

C++:
*(arrayValues + n)
ist das Gleiche wie
C++:
arrayValues[n]

Das mit dem 1,0 am Anfang hat nichts mit dem ersten Arrayelement zu tun.
Ist nur die Basis zum Multiplizieren.
1*xyz = xyz
Die Lösung ist aber nicht gerade günstig, weil
a) Geht das nur beim Multiplizieren
1*a*b = a*b
1/a/b != a/b
1+a+b != a+b
1-a-b != a-b
b) Wenn die Datei leer ist, bekommst du trotzdem das Ergebnis 1

Zum ersten Codeteil: Hier ist eben das Problem mit dem 1
Das geht so nicht.

Zweiter Codetail:
Weg mit dem l bei %
Und das j vorne sollte wohl eher ein i hinten sein.

Dritter Codeteil:
Keine Ahnung, was du damit bezwecken willst.
Warum übernimmst du nicht einfach meine fertige Funktion?
Die Funktion soll nur Dividieren, sonst nichts.
Weg mit dem n und allem, was dazugehört.

Ausgabe stimmt nicht: Vllt., weil du falsch ausgibst...
 
Danke.

Sorry, hab ich vielleicht vergessen zum Erwähnen das mit dem Pointern(vielleicht als reine Übungssache ) und so im Code 1, das war schon vorgegeben und ich muss einfach Ergänzungen zu dem Programm machen.

Wegen der c_divi funktion: Ich wollte sie als Übung einfach mal selbst schreiben.
 
Zuletzt bearbeitet:
Zurück