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 user profile iconAXMD: 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

user profile iconAXMD 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)) {
    //  rechne mit dem Wert von 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(01);


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:
user profile iconAXMD 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;
    //  vereinfachte Prüfung: max. 2-stellige Potenzen
    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.