Autor Beitrag
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mo 29.09.08 19:06 
Hallo,

ich versuche gerade ein Programm zu schreiben, das lineare Gleichungssysteme löst, das Lösen selbst ist nicht das Problem, dazu nehme ich dann das Gaußsche Eliminationsverfahren. Das Problem ist das Parsen. Beispiel:

ausblenden Quelltext
1:
2:
3:
4:
5:
2*x+x+3*y-2*z+3=5*x
->
(0+2+1+3)*x+(0-2)*z+3=5*x
->(0+2+1+3-5)*x+(2)*z+3=0
->11*x+2*z+3=0


Das wäre also auch nicht das Problem, das mit dem Zeilen-Vertauschen schaffe ich auch schon irgendwie. Problem sind genau gesagt die Klammern. Alles bis zum ersten Pfeil dient ja nur zur Veranschaulichung, das muss das Proggi ja nicht wirklich machen. Aber wie Löse ich das Problem mit den Klammern? Bestimmte Konstruktionen wie Binome lassen sich ja relativ einfach umformen (wobei die ja in linearen Gleichungssystemen nichts zu suchen haben :P ).
Und wenn nur Klammern alleine möglich wären, dann wäre das auch kein Problem, aber die lassen sich ja verschachten. Und dazu kommt, dass solche fiesen Dinger wie (x+x)*2 möglich sind (gut auch das ist einfach, aber schwer wird's bei (x+y-3*z)*2).

Jemand eine Idee?
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 29.09.08 19:23 
Hi,

Das Stichwort lautet "Rekursion": Bei jeder neuen Klammer parst du den Inhalt , indem du deine Methode nocheinmal aufrufst(String kopieren, siehe "Copy", "Pos"). Dann musst du nurnoch die Rückgabe mit einem eventuellen Vorfaktor multiplizieren ;)

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Jakob_Ullmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mo 29.09.08 19:34 
OK, sowas hab ich mir schon gedacht. :shock: Problem ist halt: Ich muss ja die Faktoren von x, y und z zählen, um sie dann in die Matrix einzutragen. Und wie speichere ich dann ab, welche Klammer wie viel x, y und z enthält? Oder komme ich besser, wenn ich mich gleich von links nach rechts durcharbeite (mit vorherigem Multiplikation und Division einklammern)?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 29.09.08 21:07 
Ich würde jede Funktion einen fertigen Zeilenvektor zurückgeben lassen. Pseudo-Beispiel Mul-Funktion:
ausblenden Quelltext
1:
2:
3:
4:
Mul(): TFloatArray =
  Result := Paranthesized();
  if lookahead = '*' then
    Result := MulRows(Result, Paranthesized());

Nagut, mit Division wirds noch ein wenig komplizierter ;) .

_________________
>λ=
Jakob_Ullmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 30.09.08 14:27 
Das mit dem LookAhead ist es! Danke! :D