Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suchen und Ersetzen (https://www.delphipraxis.net/104416-suchen-und-ersetzen.html)

rennpunto 3. Dez 2007 16:40


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;
---

Neutral General 3. Dez 2007 16:43

Re: Suchen und Ersetzen
 
Hi,

Also dein Quelltext ist erstmal unnötig lang ;)

Delphi-Quellcode:
Eingabeterm:=frmPlotter.edtEingabe.text;
Eingabeterm:=StringReplace(Eingabeterm,'x+', 'x^1+', [rfReplaceAll]);
frmPlotter.edtEingabe.text:=Eingabeterm;
würde ausreichen. Das Problem ist halt: Was passiert wenn man "x +" eingibt oder es gibt immerhin auch andere Rechenarten als +...

Gruß
Neutral General

shmia 3. Dez 2007 16:43

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.

rennpunto 3. Dez 2007 16:52

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?

shmia 3. Dez 2007 16:58

Re: Suchen und Ersetzen
 
Zitat:

Zitat von rennpunto
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

Nein, es geht wirklich nur so. Das Suchen & Ersetzen wäre nur "Gemurkse" um eine unzureichende Funktion zu überdecken.
Du hast doch sicher eine Funktion, die den String zerpflückt und dann ein Array mit den Polynomfaktoren befüllt, oder ?
Beispiel:
Delphi-Quellcode:
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;
Dann zeigt doch mal den Sourcecode.

rennpunto 3. Dez 2007 17:06

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