Entwickler-Ecke
Multimedia / Grafik - f(x)=ax³+bx²+cx+d formel auslesen aus der textbox
Theki - Fr 09.05.08 17:14
Titel: f(x)=ax³+bx²+cx+d formel auslesen aus der textbox
Hey
in der Schule arbeiten wir im Moment an einem Funktionsplotter.
Naja aufjedenfall ist nun die aufgebe, erst einmal die vorhandene Werte aus einer Textbox auszulesen.
sie sollten in diesem format eingetragen werden:
a*x^3+b*x^2+c*x+d
Nun hatten wir anfangs die Idee die werte einzelnt wie folgt auszulesen:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| for (x = 0; x <= Convert.ToInt16(tb_formel.Text.Length) - 1; x++) { list_formel.Items.Add(tb_formel.Text[x]); listBox1.Items.Add(x1); } |
Dies hat aber nur den Effekt wenn man z.b. eine zweistellige Zahl eingibt, das er nun jede Ziffer einzeln anzeigt...
habt ihr vielleicht einen sinvollen lösungens vorschlag?
Moderiert von
AXMD: C#-Tags hinzugefügt
AXMD - Fr 09.05.08 18:37
Hallo und :welcome: in der EE!
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?
Falls letzteres der Fall ist kannst du dir ja mal die Methode Substring von der String-Klasse ansehen.
AXMD
Theki - Sa 10.05.08 13:05
AXMD hat folgendes geschrieben: |
Falls letzteres der Fall ist kannst du dir ja mal die Methode Substring von der String-Klasse ansehen.
|
Die Methode funktioniert sehr gut..
nur mir ist noch nicht ganz klar wie ich dann den string der z.b. den wert für a hat in nen integer umwandle damit ich mit ihm rechnen kann bzw. ihn in eine Textbox ausgeben kann..
JüTho - Sa 10.05.08 14:08
Ich verstehe (ebenso wie AXMD) nicht, wie die Teile gespeichert sind. Deshalb kann ich auch nur Hinweise geben. Außerdem verstehe ich nicht, was die Fragen mit Multimedia/Grafik zu tun haben (das Thema an sich schon, aber erst, wenn Du zeichnen willst).
Text in Zahl verwandeln
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| string s = "123"; int i = 0; if (int.TryParse(s, out i)) { } else { MessageBox.Show("s ist keine Integer-Zahl: " + s); } |
Zahl in Text verwandeln
C#-Quelltext
1: 2:
| int i = 456; string s = i.ToString(); |
Text in TextBox ausgeben
C#-Quelltext
1: 2:
| string s = "123"; TextBox1.Text = s; |
Das Ganze sind aber sehr elementare Grundlagen: Entweder Du solltest Dich ausführlich damit befassen, z.B. über
OpenBook C# [
http://www.galileocomputing.de/openbook/csharp] und
OpenBook Visual C# [
http://www.galileocomputing.de/openbook/visual_csharp]. Oder Du musst die Fragen so formulieren, dass man sie nicht falsch verstehen kann. Jürgen
Theki - Sa 10.05.08 14:45
Okay, entschuldigung wenn ich meine Frage ein bisschen verwirrend gestellt habe.
Nur jetzt is bei mir eine andere Frage aufgetreten.
Wenn ich die Substring methode benutzte, setzte ich ja voraus dass ich weiß wo a,b,c und postioniert sind, also an welcher Stelle sie stehen.
C#-Quelltext
1: 2:
| string formel = tb_formel.Text; string a = formel.Substring(0, 1); |
Also setzte ich ja voraus, dass das a nur einen Wert von 0 bis 9 annimmt.
was mach ich nun wenn der es den Wert 15 oder so annimmt.
In wieweit muss ich meinen Code dann erweitern?
JüTho - Sa 10.05.08 16:10
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.
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!