Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Matheparser: Schleifenproblem bei Kommata (https://www.delphipraxis.net/96730-matheparser-schleifenproblem-bei-kommata.html)

Nils_13 30. Jul 2007 08:48


Matheparser: Schleifenproblem bei Kommata
 
Hi,

mein kleiner Matheparser macht mir beim Komma Ärger: Bei der Rechnung 1,5*2.3 verwandelt er
1
,
5
zu zu 1,5. Allerdings geschieht dies nicht bei 2.3. Warum ? Mir ist nur aufgefallen, dass ich die Arraygröße verändere und die Schleife deshalb vlt. schon früher zu Ende ist, aber falls das überhaupt Auswirkungen hat, wie könnte man dann das Problem lösen ?

Delphi-Quellcode:
function Split(s : String) : TDynTokArray; // Ein Array für die Klasse TToken, spielt allerdings keine großartige Rolle hierbei; Split teilt, wie der Name schon sagt, alles in Tokens auf. Dennoch muss eine Kommazahl in einem Eintrag statt in 3 Einträgen stehen.
begin
  ...
  for i := 0 to High(Result) do
  begin
    if (Result[i].Val = ',') or (Result[i].Val = '.') then // der Punkt wird hier abgefragt, also ist hier nicht die Fehlerquelle
    begin
      Result[i-1].Val := Result[i-1].Val + Result[i].Val + Result[i+1].Val; // Zusammensetzen
      for j := i to High(Result) do // der Rest im Array verschoben werden
        Result[j] := Result[j+1];  
      SetLength(Result, High(Result)); // der unnötige Rest, welcher sogar noch Fehler verursachen würde, wird gelöscht
    end;
  end;
  ...
end;

sirius 30. Jul 2007 08:58

Re: Matheparser: Schleifenproblem bei Kommata
 
Den . <-- , Fehler sehe ich hier auch nicht.

Aber :
1. Musst du das Array nicht um 2 Plätze verschieben?
2. Was passiert wenn ich den Ausdruck ".5*10" eingebe?

Christian Seehase 30. Jul 2007 10:24

Re: Matheparser: Schleifenproblem bei Kommata
 
Moin Nils,

Zitat:

Zitat von Nils_13
wie könnte man dann das Problem lösen ?

Indem Du die Routine umbaust, mit der Du Deine Token erkennst ;-)

Üblicherweise wird ein Token möglichst lang erzeugt, dass heisst:
Solange für einen erkannten möglichen Tokentyp Zeichen folgen, gehören die mit zum aktuellen Token.
Beispiel: Bezeichner.
Wenn für diese die Regel gilt:
Sie müssen mit _ oder Buchstabe anfangen, und dürfen ansonsten _, Buchstaben oder Ziffern enthalten, so müsste man beim Erkennen eines _ oder Buchstaben anschliessend alle Zeichen als Tokenattribut übernehmen, bis ein Zeichen ungleich _, Buchstabe, Ziffer auftritt.

Ein ähnliches Vorgehen gilt dann auch bei Zahlen.
(Annahmen:
Eine Zahl muss mit einer Ziffer beginnen oder enden, obwohl auch ein . bzw. , am Anfang oder Ende denkbar wäre.
Es werden keine Exponenten verwendet)

Man trifft auf eine Ziffer:
Jetzt wird solange durchgegangen, wie man eine Ziffer, ein . oder ein , findet.
Bei . oder , normalisiert man dass jetzt auf, z.B., .
Anschliessend geht man durch, bis man auf ein Zeichen ungleich Ziffer stösst.

Solche Sachen werden oft mit Hilfe von Bei Google suchenZustandsautomaten (bzw. DEA = Bei Google suchenDeterminierender Endlicher Automat) gelöst.
Klingt komplizierter als es ist.

Reinhard Kern 30. Jul 2007 18:48

Re: Matheparser: Schleifenproblem bei Kommata
 
Zitat:

Zitat von Nils_13
Hi,

mein kleiner Matheparser macht mir beim Komma Ärger: Bei der Rechnung 1,5*2.3 verwandelt er
...
[/delphi]

Hallo, schon die Aufgabenstellung ist inkorrekt: entweder heisst es 1,5 * 2,3 (hier) oder 1.5 * 2.3 (anderswo), üblicherweise richtet sich das nach den Ländereinstellungen. Wenn du das nicht in der korrekten Weise, sondern schlampig lösen willst, musst du zuerst Komma durch Punkt ersetzen.

Gruss Reinhard

pdug 30. Jul 2007 19:27

Re: Matheparser: Schleifenproblem bei Kommata
 
Hi.

schließe mich Reinhard und Christian an..

Nichts trennen, was zusammen gehört und nichts "rückwärts lesen" wie hier:
Delphi-Quellcode:
  for j := i to High(Result) do // der Rest im Array verschoben werden
        Result[j] := Result[j+1];
Guck mal hier in den Scanner:
http://wiki.delphigl.com/index.php/T...prachen_Teil_1

Und so machten es damals die Profis: http://www.246.dk/pascals.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz