![]() |
Suchen und Ersetzen
Hi, ich programmiere einen FUnktionsplotter für die Schule der ganzrationale Funktionen zeichen soll. Bei Funktionen wie 3x^3+x^2 entstehen keine Probleme. Allerdings bekommt mein Programm Probleme wenn das "Potenzzeichen" fehlt, also da wo man einfach ^1 dahinter schreiben könnte. Ich möchte jetzt den ganzen String nach solchen Problemstellen durchsuchen und ^1 anfügen.
Beispiel: Aus 3x^3 + x + 5 ---> 3x^3 + x^1 + 5^1 Wie mache ich das jetzt am besten? Ich weiß nicht genau wonach ich suchen soll und ich glaube, dass es bei der Konstanten am Schluss ein Problem geben könnte. Ich hab hier mal nen Ansatzt entwickelt, bei dem ich alle Möglichkeiten an denen das Programm eingreifen müsste (x+ , x-, und dann prinzipiell alle Konstanten die alleine stehen ) selbstständig ^1 ergänzen soll. Allerdings gibt das Probleme und ist nicht besonders effizient. Wer hat eine bessere Lösung? var Eingabeterm:string; i:integer; --- Eingabeterm:=frmPlotter.edtEingabe.text; for i:= 1 to length(Eingabeterm) do begin if Eingabeterm[i]= 'x+' then Eingabeterm:=StringReplace(Eingabeterm, 'x+', 'x^1+', [rfReplaceAll]); frmPlotter.edtEingabe.text:=Eingabeterm; --- |
Re: Suchen und Ersetzen
Hi,
Also dein Quelltext ist erstmal unnötig lang ;)
Delphi-Quellcode:
würde ausreichen. Das Problem ist halt: Was passiert wenn man "x +" eingibt oder es gibt immerhin auch andere Rechenarten als +...
Eingabeterm:=frmPlotter.edtEingabe.text;
Eingabeterm:=StringReplace(Eingabeterm,'x+', 'x^1+', [rfReplaceAll]); frmPlotter.edtEingabe.text:=Eingabeterm; Gruß Neutral General |
Re: Suchen und Ersetzen
Das ist natürlich blöd, wenn man: x^1 + 5^1 schreiben muss.
Es gibt nur eine Lösung: sorge dafür, das dein Programm auch mit Ausdrücken wie x+5 zurecht kommt. |
Re: Suchen und Ersetzen
Gibts denn da keine bessere Möglichkeit?
Ich müsste sonst das gleiche für x- machen, und mit den Konstanten hab ich dann ja immer noch ein Problem Ich bräuchte sowas wie: Wenn das Zeichen hinter dem x kein "^" ist, dann füge hinter dem x "^1" ein. Und was ist dann mit der Konstanten? --- Ähnliches Problem: Ichn will, dass der für x=1 z.B. bei "4x^2" auch "4* 2^2" rechnet und nicht "42^2" Da müsste ich wieder sagen, wenn vor dem x was steht, was kein + oder minus ist, dann multipliziere damit. Was soll ich da machen? |
Re: Suchen und Ersetzen
Zitat:
Du hast doch sicher eine Funktion, die den String zerpflückt und dann ein Array mit den Polynomfaktoren befüllt, oder ? Beispiel:
Delphi-Quellcode:
Dann zeigt doch mal den Sourcecode.
func := '3*x^2-20*x+4';
// dann wären die Polynomfaktoren p[0] := 4.0; p[1] := -20.0; p[2] := 3.0; p[3] := 0.0; |
Re: Suchen und Ersetzen
Das zerlegen geht so:
procedure ZerlegeTerm; //Zerlegt den Term und ersetzt Zeichen "x" durch "f"-Wert var Eingebeterm: TStrings; i:integer; begin frmPlotter.libSummanden.clear; Eingebeterm := TStringList.Create; frmPlotter.edtEingabe.text := StringReplace(frmPlotter.edtEingabe.text, '-', '#-', [rfReplaceAll]); // "#" als Trennzeichen für Delimitter setzen frmPlotter.edtEingabe.text := StringReplace(frmPlotter.edtEingabe.text, '+', '#+', [rfReplaceAll]); // "#" als Trennzeichen für Delimitter setzen Eingebeterm.Delimiter := '#'; Eingebeterm.DelimitedText := frmPlotter.edtEingabe.text; for i:=0 to Eingebeterm.Count -1 do begin frmPlotter.libSummanden.Items.Add(Eingebeterm.Stri ngs[i]); frmPlotter.libSummanden.Items[i]:= StringReplace (frmPlotter.libSummanden.Items[i],'x', FloatToStr(f), [rfReplaceAll]); // Alle "x" durch f ersetzen end; frmPlotter.edtEingabe.text := StringReplace(frmPlotter.edtEingabe.text, '#', '', [rfReplaceAll]); //"#"-Zeichen entfernen end; lib.Summanden ist eine Listbox, die ich nachher einfach ausblenden will. Aber was ich jetzt vorhabe mit dem ^1 ergänzen, amch ich besser als eigene Prozedur, oder? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz