Damit sind wir aber wieder bei der allerersten Nachfrage:
AXMD hat folgendes geschrieben: |
Wie sind die Werte denn voneinander getrennt? Oder steht in der Textbox dann so etwas wie 1*x^3+2*x^2+3*x+4 |
Wenn Du es richtig, d.h. konsequent untersuchen willst, benötigst Du ein
double-Array für die Argumente (der Einfachheit halber kannst Du Dich auf
int beschränken, aber korrekt wäre double). Im ersten Durchgang prüfst Du das Maximum der vorhandenen Potenzen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| int maxPotenz = 0; for(int x1 = 0; x1 < formel.Length; x1++) { if (formel[x1] == '^') { int currentPotenz = 0; string currentPotenzString; if (Char.IsDigit(formel[x1+2])) currentPotenzString = formel.Substring(x1+1,2); else currentPotenzString = formel.Substring(x1+1,1); if (int.TryParse(currentPotenzString, out currentPotenz) && currentPotenz > maxPotenz) maxPotenz = currentPotenz; } } |
So, jetzt können wir das Array vorbereiten:
C#-Quelltext
1:
| double[] args = new double[maxPotenz+1]; |
Jetzt wird die Formel erneut per Schleife durchgegangen: Geprüft wird die Situation "*x^". Was davor steht bis zum vorigen '+' oder '-' oder (beim ersten Argument) 'nichts' (Index < 0), ist ein Argument; dahinter kommt wie gerade eben die aktuelle Potenz. Also:
C#-Quelltext
1: 2: 3:
| double currentArgument = 0; double.TryParse(currentArgumentString, out currentArgument); args[currentPotenz] = currentArgument; |
Mit den Werten in args[] kannst Du auf jeden Fall rechnen.
Alternativ kannst Du mit
IndexOf oder
IndexOfAny von jeder Position in der Formel aus den "Abstand" bis zum nächsten Trenner suchen. Du kannst auch mit
String.Split die Formel von vornherein aufteilen und abschnittsweise untersuchen. Aber wegen der Varianten mit +/- und fehlender Potenzen und "falscher Reihenfolge" der Potenzen kommst Du sowieso nicht drumherum, die von mir vorgeschlagenen Prüfungen vorzunehmen. Deshalb halte ich die "manuelle" Analyse per Schleife für besser.
Ich hoffe, das hilft jetzt wirklich, auch wenn es eine völlig neue Konstruktion enthält. Jürgen
PS. Die Begriffe sollen Anregungen für die Lektüre in der
SDK-Doku sein.
PS 2. Vorsorglich weise ich darauf hin, dass die
Convert-Methoden möglichst zu vermeiden sind.
Parse, TryParse, ParseExact, TryParseExact sind (fast) immer die bessere Lösung.