Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Addieren 2er Complexer Zahlen in C# » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1] 2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Addieren 2er Complexer Zahlen in C#
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Addieren 2er Complexer Zahlen in C# Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Folgendes möchte ich machen...

Ich habe 2 Komplexe Zahlen.
c1 und c2 (jeweils mit einem real und imaginär teil.)

Beispiel:
c1: real(1) imaginär (2)
c2: real(3) imaginär (4)

jetzt will ich folgendes machen. c1= c1+c2
c2 soll unverändert bleiben. Und das Ergebnis soll sein.
c1: real(4) imaginär(6)

Dazu habe ich bis jetzt folgenden Code geschrieben.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Complex
    {
        private float re = 0.0F;
        private float im = 0.0F;

        public void Init(float wert1, float wert2)
        {
            this.re = wert1;
            this.im = wert2;
        }
        public void Print()
        {
            Console.WriteLine("({0}--{0})", this.re, this.im);
        }
        public void Add1(Complex ctmp)
        {
            this.re += ctmp.re;
            this.im += ctmp.im;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Complex c1 = new Complex();
            Complex c2 = new Complex();
            c1.Init(1F, 2F);
            c2.Init(3F, 4F);
            c1.Add1(c2);
            c1.Print();
            Console.ReadLine();
        }
    }
}

Die zahlen sind hier etwas anders.
Aber als ergebnis kommt real(4) imaginär(4) raus....
obwohl es (3 -- 6) sein sollte.
Wenn ich das in Visual Studio mit F10 bzw F11 Schritt für Schritt durch gehe, zeigt er mir auch an, das er in c1 die (3 -- 6) speichert....
Trotzdem gibt er am Ende (4 --4) aus....
Ich wüsste nicht wo der Fehler ist... bitte bitte helft mir Augenzwinkern
08.04.2013 18:57 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
Console.WriteLine("({0}--{0})", this.re, this.im);


sollte wohl eher

code:
1:
Console.WriteLine("({0}--{1})", this.re, this.im);


sein. Augenzwinkern

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
08.04.2013 19:37 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Oh mann...

*Hand --> Kopf* Zunge raus

Ja logisch.... Vielen Dank.... ich muss da irgendwas in meinem Kopf verwechselt haben großes Grinsen


Vielen Vielen Dank ......


argh ^^

Lg Matze


Achja gleich noch ne weitere Frage zum gleichen Thema.....

Ich soll das ganz ja als Übungsaufgabe machen.

Komplett Aufgabe steht hier:
http://dblabor.fh-stralsund.de/pr2/Aufgabe%202.pdf

Jetzt soll ich eine Methode (Add2) schreiben, mit der ich folgendes machen kann.


code:
1:
c1.Add2(c2).Add2(c3)


Wie darf ich das verstehen?
Also wie soll das ablaufen?

Das einzige wo ich mir sicher bin, ist, dass die Methode "Add2" einen Rückgabewert haben muss. (also nicht "void" sondern eher so "float" bzw. "Complex")

Wie gesagt ich weiß nicht wie ich dieses
2x (Punkt) verstehen soll.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Matze84: 08.04.2013 21:30.

08.04.2013 21:25 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Man nennt sowas Method chaining – im verlinkten Artikel findest du auch heraus, wie man sowas macht. Ein total banaler "Trick", eigentlich.

Chaining ist übrigens superpraktisch und wird in der Praxis viel verwendet. C#-Beispiele kann ich jetzt nicht nennen, aber in Java-Frameworks ist das genauso verbreitet wie in z.B. jQuery und ähnlichem.

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
08.04.2013 21:52 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Wenn ich jetzt also das Java Beispiel in deinem link richtig verstanden habe (kenne mich mit Java nicht aus ^^)

Dann macht die Funktion quasi nix anderes als
c1.Add2(c2)
und gleich danach
c1.Add2(c3)


???
Nur halt in einem Schritt/Zeile
09.04.2013 06:55 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Genau. Und erreicht wird das, indem die Funktion die Instanz zurückgibt, zu der sie gehört. Dadurch lässt sich der zweite Aufruf nämlich direkt an den ersten ketten.

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
09.04.2013 07:56 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

kurzer Einwurf: In C# kann man Operatoren überladen. Um c1=c1+c2 genau so im Quelltext schreiben zu können, würde ich dies so tun. Ist intuitiver, jedoch weiß ich gerade nicht wie aufwändig das ist.

VG,

Karlito
09.04.2013 13:01 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Das Aufgabenblatt gibt ihm die Chain-Syntax allerdings vor. smile

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
09.04.2013 13:23 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Achso, entschuldigung. Das habe ich nicht gelesen. Als Zusatzinfo sicher trotzdem eine interessante Alternative.

VG,

Karlito
09.04.2013 14:30 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich finde das Überladen an dieser Stelle auch deutlich schöner. Wie es der Zufall will, schreibe ich derzeit privat eine JavaScript-Bibliothek, bei der es auch um das Addieren (und andere Rechenoperationen) geht. JavaScript kann sowas leider nicht, weshalb mir "nur" das Chaining bleibt.

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
09.04.2013 14:46 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Zitat:
Original von Karlito
Hallo,

kurzer Einwurf: In C# kann man Operatoren überladen. ...........

VG,

Karlito


Das hatten wir gestern in der Vorlesung....
Ist für mich immer erstmal verwirrend, bis ichs dann an einer Übungsaufgabe testen/probieren konnte smile

Weil selber fallen mir immer nicht solche Aufgaben ein, das ich das mal so üben könnte unglücklich
09.04.2013 21:13 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ok soweit so gut... wieder eine Frage smile
Bisher habe ich folgendes geschrieben....
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Complex
    {
        private float re = 0.0F;
        private float im = 0.0F;

        public void Init(float wert1, float wert2)
        {
            this.re = wert1;
            this.im = wert2;
        }
        public void Print()
        {
            Console.WriteLine("({0}--{1})", this.re, this.im);
        }
        public void Add1(Complex ctmp)
        {
            this.re += ctmp.re;
            this.im += ctmp.im;
        }
        public Complex Add2(Complex ctmp)
        {
            this.re += ctmp.re;
            this.im += ctmp.im;
            return this;
        }
        public Complex Add3(Complex ctmp)
        {
            ctmp.re += this.re;
            ctmp.im += this.im;
            return ctmp;
        }
        public Complex Add4(params Complex[] complexestmp)
        { 
            Complex ctmp = new Complex();
            ctmp.re = 0; ctmp.im = 0;
            int count = complexestmp.Length;
            for (int i = 0; i < count; i++)
            {
                ctmp.re += complexestmp[i].re;
                ctmp.im += complexestmp[i].im;
            }
            return ctmp;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Complex c1 = new Complex();
            Complex c2 = new Complex();
            Complex c3 = new Complex();
            c1.Init(1, 2);
            c2.Init(3, 4);
            c3.Init(5, 6);
            c1.Add1(c2);
            c1.Print();
            c1.Init(1, 2);
            c1.Add2(c2).Add2(c3);
            c1.Print();
            c1.Init(1, 2);
            c1 = c1.Add3(c2.Add3(c3));
            c1.Print();
            c1 = c1.Add4(c2, c3, c1, c2);
            c1.Print();
            Console.ReadLine();
        }
    }
}


Ich habe den Fehler erst jetzt bemerkt, aber es geht um meine "Add3" Methode...

In zeile 70 ändert er mir nämlich die Werte von "c3"
das soll er aber (gemäß aufgabenstellung) nicht.
was mache ich da falsch?

JA Add2 und Add3 sind sich gewissermaßen identisch....
Aber mit Add3 kommt das raus, was rauskommen soll... nur durch die Veränderung an "c3" wird mein Ergebnis bei Add4 falsch....

Irgendwas übersehe ich nur weiß ich nicht was.

Wie gesagt die Methoden (und wie ich sie benutzen soll) in der main sind mir vorgegeben.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Matze84: 09.04.2013 22:01.

09.04.2013 22:00 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

dein Problem ist, dass Du nicht beachtest, dass von Objekten immer nur Referenzen übergeben werden. D.h. Add3 hat ja einen Parameter vom Typ Complex, wobei als Parameter dann eine Referenz auf ein Objekt vom Typ Complex übergeben wird. D.h. du arbeitest nicht mit einer Kopie sondern mit dem selben Objekt.
Die Lösung besteht darin, für die Rückgabe ein neues Objekt zu erzeugen und dieses zurückzugeben (bzw. dessen Referenz).

Also:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public Complex Add3(Complex ctmp)
{
  Complex result = new Complex();
  result.init(0,0);
  result.re = ctmp.re + this.re;
  result.im = ctmp.im += this.im;
  return result;
}


Btw.: Dass Du den Wert des Objekts erst mit der init-Methode festlegst ist schlechter Stil! Für die initiale Belegung eine Objektes ist der Konstruktor vorgesehen. Das ist übrigens ein oft vorkommendes Verständnisproblem. Viele Anfänger denken, dass der Kontruktor das Objekt konstruiert, dabei handelt es sich eigentlich nur um eine Methode, welche den initialen Zustand (die Belegung der internen Variablen) des Objektes herstellt.

VG,

Karlito
10.04.2013 12:21 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Leider wurde ihm auch das von der Aufgabenstellung vorgegeben. Recht hast du allerdings schon.

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
10.04.2013 13:10 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo ihr beiden... heute schaffe ich es mal wieder mich damit zu beschäftigen unglücklich

@Karlito:
nochmal zum Verständnis:

wenn ich also

public Complex Add3(Complex ctmp){}

habe und dann als Bsp.

c1.Add3(c2); aufrufe,
wird quasi mein c2 für die Zeit der Methodendurchführung einfach nur "ctmp" genannt? es ist also exakt das selbe... (also nicht Kopie, sondern nur "namensänderung")?????
und deswegen ändere ich auch mein c2 (was ja eigentlich nicht soll)
ok.


Wegen dem Init.... ja das ist leider so vorgegeben, würde das auch lieber mit

Complex c1 = new Complex(1,2) oder so lösen....
müsste man sich halt nur den Konstruktor schreiben, was aber nicht das Problem sein sollte...

Zum Thema schlechter Stil: Der Prof macht das dieses Jahr sowieso merkwürdig, weil er uns ein Beispiel zeigt, und dann erklärt warum das nicht geht (sprich er zeigt quasi als erstes Beispiel, wie es falsch ist unglücklich )
Aber ok da müssen wir durch.

Eine Frage nebenbei noch....

Wenn ich sowas habe wie:
c1=c1.Add3(c2.Add3(c3));
Dann führt der das doch von rechts nach links aus oder?
Also al erstes macht er c2.Add3(c3)????

Lg matze

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Matze84: 13.04.2013 09:10.

13.04.2013 09:05 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Addieren 2er Complexer Zahlen in C#