Autor Beitrag
Noobie93
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 26.06.14 10:34 
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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 26.06.14 10:37 
Hausaufgabe?
Noobie93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 26.06.14 10:38 
So auf die Art. Ich soll das Gauß'sche Eliminationsverfahren programmieren.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 26.06.14 13:28 
Wie ist ein Parser aufgebaut?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 26.06.14 14:29 
Hallo Noobie93, :welcome:

in deinem Crosspost myCSharp.de - Gleichungssystem richtig parsen wurde dir ja schon ein Link auf meinen Parser für mathematische Formeln gegeben (wo auch ein bißchen Theorie dazu erklärt wird).
Aber ich muß Ralf zustimmen, daß hierfür ein Parser (wahrscheinlich) deine bisherigen Kenntnisse übersteigt. Ich würde dir ebenfalls empfehlen, einfach eine Matrix in Tabellenform anzuzeigen (z.B. mit dem DataGridView).

Im Anhang habe ich mal einen Screenshot von einem meiner ähnlichen Programme gemacht (wenn auch mit dem Borland C++ Builder, d.h. der VCL, erstellt ;- ).
Einloggen, um Attachments anzusehen!
Noobie93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 26.06.14 21:33 
Ja aber der Parser ist ja das was ich benötige
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
double[][] A = 
{
    new double[] { 01,  1 },
    new double[] { 24, -2 },
    new double[] { 0315 }
};


Edit: Häh???
Noobie93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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


Zuletzt bearbeitet von Noobie93 am Fr 27.06.14 12:16, insgesamt 1-mal bearbeitet
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: 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"


ausblenden 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 kopiert und umgewandelt? :oops:

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Noobie93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: freak4fun
Noobie93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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