Autor Beitrag
Theki
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 09.05.08 17:14 
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:

ausblenden 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


Zuletzt bearbeitet von Theki am Sa 10.05.08 14:58, insgesamt 1-mal bearbeitet
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11



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

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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
ausblenden 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
ausblenden C#-Quelltext
1:
2:
int i = 456;
string s = i.ToString();

Text in TextBox ausgeben
ausblenden 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# und OpenBook Visual C#. Oder Du musst die Fragen so formulieren, dass man sie nicht falsch verstehen kann. Jürgen
Theki Threadstarter
Hält's aus hier
Beiträge: 11



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

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

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:
ausblenden 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.