Entwickler-Ecke
WinForms - Matrix
Noobie93 - Do 26.06.14 10:34
Titel: Matrix
Hallo
Wie im Bild gezeigt wird folgende Eingabe gemacht, leider weiß man nicht wie viele Unbekannte bzw. Gleichungen eingegeben werden.
Nun seht ihr meinen Quellcode. Was müsste ich hier ändern das er das in eine Matrix speichert. Also nur die Zahlenwerte?
LG
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| int[,] a; int anz;
public static int Matrix(int anz) {
for (int i = 0; i <= anz; i++) { int anz = richTextBox1.Items.Count; string gleichungx = richTextBox1.Items[anz - 1].ToString(); } } |
Ralf Jansen - Do 26.06.14 10:37
Hausaufgabe?
Noobie93 - Do 26.06.14 10:38
So auf die Art. Ich soll das Gauß'sche Eliminationsverfahren programmieren.
Ralf Jansen - Do 26.06.14 11:01
Wenn die Aufgabe keine freie Eingabe der Formel erzwingt solltest du das erstmal lassen und dir ein anderes Eingabeverfahren ausdenken. Also zum Beispiel einfach den User nach der größe der Matrix fragen und ihn dann eine entsprechende große Matrix eingeben lassen. Sonst bist du jetzt beim Formelparsing was schon ein gewisser Aufwand an sich ist und eigentlich nichts mit dem Problem des Eliminationsverfahren zu tun hat sondern schon ein größeres Problem in sich ist das dich vermutlich mehr beschäftigt als der eigentlich zu lösende Rechenverfahren.
Falls du das doch möchtest, bisher bist da nur an dem Punkt die einzelnen Gleichungen aus der Textbox zu holen.
Ein einfaches Auslesen der Zahlen aus diesen Gleichungen wird dir nicht helfen du brauchst schon etwas das näher an einem Parser für mathematische Ausdrücke ist da
a.) Der Faktor 1 nicht genannt wird du willst ihn aber bestimmt trotzdem bekommen. Variablen mit Faktor 0 nicht in der Gleichung stehen.
b.) Du Anhand der genannten Variablen erstmal die Größe der Matrix bestimmen mußt (und wie man aus a erkennt die Anzahl Zahlen nicht mit der Anzahl Variablen korrespondieren muß)
c.) Beachten mußt in welcher Reihenfolge die Variablen angeben wurden
d.) Allgemein Sinnhaftigkeit der Gleichungen testen mußt (sind es überhaupt gültige Ausdrücke, wird meine Matrix quadratisch also gibt es gleichviele Gleichungen und Variablen etc.)
Noobie93 - Do 26.06.14 13:28
Wie ist ein Parser aufgebaut?
Ralf Jansen - Do 26.06.14 14:28
Er zerlegt eine Ausdruck in bekannte Tokens (hier Operatoren, Variablen, Konstanten) und liefert als Ergebnis einen Ausdruck der von einem System dann auch einfach auswertbar ist. Anders also ein belibieger Ausdruck in einem string dessen Bedeutung nur dem Leser bekannt ist und nur vom Ansehen desjenigen als mathematische Gleichung erkannt werden kann.
Aber ich wiederhole noch mal wenn das nicht das eigentliche Problem war dann ignoierer das und beschäftige dich mit mit dem Gauß'sche Eliminationsverfahren. Das Parsen einer Gleichung ist eine Nebenkriegsschauplatz und eher schwieriger als das eigentliche Problem.
Noobie93 - Do 26.06.14 21:33
Ja aber der Parser ist ja das was ich benötige
Ralf Jansen - Do 26.06.14 21:54
Zitat: |
Ist dieses jagged Array anders zu befüllen oder was mache ich falsch? |
Jede Zeile im Array ist dann ein eigenes Array und muß dann explizit instanziiert werden.
also
C#-Quelltext
1: 2: 3: 4: 5: 6:
| double[][] A = { new double[] { 0, 1, 1 }, new double[] { 2, 4, -2 }, new double[] { 0, 3, 15 } }; |
Edit: Häh???
Noobie93 - Do 26.06.14 23:30
Was ist kann bei meinem Quellcode falsch sein, das er auf die 4te Unbekannte nicht reagiert. Egal welche Zahl man eingibt es kommt immer 0,999999 raus.
Kann mir wer weiterhelfen?
Lg
freak4fun - Fr 27.06.14 01:43
Hast du das mal debugged? :shock:
Debuggen (MS VS 2013 E)
- Zeile 70: "int N = 4;" auswählen
- Mit "F9" Breakpoint setzen
- Starten ("F5")
- Zeile für Zeile steppen ("F11")
- Unten links im Fenster "Lokal" seihst du die Variablen
- Wenn vor zB x ein dreieck ist kannst du das aufklappen bei A kannst du zweimal aufklappen
- bei "double[] x = new double[N];" Breakpoint setzen
- von einem zum nächsten Breakpoint kommst du mit "Starten" ("F5")
- Beenden mit "roten Viereck" oder "Umschalt + F5"
C#-Quelltext
1:
| x[i] = (b[i] - sum) / A[i][i]; |
i = 3, b[3] = 0.41379310344827536, sum = 0, A[3][3] = 0.41379310344827586 <-- (Quelle: Debugger Lokal-Fenster) ;)
Edit: Hast du echt einen
Java-Quellcode [
http://introcs.cs.princeton.edu/java/95linear/GaussianElimination.java] kopiert und umgewandelt? :oops:
Noobie93 - Fr 27.06.14 08:51
Ja hab ich debugged. Mit 3 Unbekannten läuft es ja einwandfrei. Nur bei der 4ten fängt es dann an.
Wie kann ich diesen Fehler beheben?
Lg
Ralf Jansen - Fr 27.06.14 11:09
Rechne das Verfahren per Hand nach dann hast du die einzelnen Ergebnisse der Zwischensteps. Dann debugge den Code und siehe dir die Zwischensteps an. Dort wo es voneinander differiert schau dir den Code genauer an.
Ich würde dir empfehlen das Verfahren selbst zu programmieren dann tust du dich auch mit dem debuggen leichter. Und als Nebeneffekt lernst du Programmieren UND Mathe in einer Weise die haften bleibt.
Noobie93 - So 29.06.14 20:38
Hab es nun überarbeitet und es funktioniert nun alles :)
Jetzt werde ich mich dem Parser widmen.
Die Anzahl der Gleichungen kann ich ja mit Count auslesen. Doch wie splitte ich die Zahl vom Buchstaben und speicher beides seperat?
Lg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!