Delphi-PRAXiS
Seite 10 von 10   « Erste     8910   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Mathe mit Strings (die deutsche StringMatheLib ._. ) (https://www.delphipraxis.net/135569-mathe-mit-strings-die-deutsche-stringmathelib-_.html)

xZise 18. Jul 2009 11:29

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Moin Stefan,
da ist glaub ich ein Fehler drinne:
Zitat:

Zitat von GPRSNerd
Delphi-Quellcode:
function TMathe.ZahlNBereinigen(const ZahlN, BasisN: string): string;
//Zahl-String zur Basis N von allen Zeichen bereinigen, die nicht zwischen
// '0' und Chr(N) liegen
var
  i: Integer;
  ZahlN_: string;
begin
  ZahlN_:=Uppercase(ZahlN);
  for i := Length(ZahlN_) downto 1 do //Rückwärts da sonst mehrfach hintereinander
                                      //auftretende nicht erlaubte Zeichen nicht korrigiert würden
  begin
    if ((_GetZahl(ZahlN_[i]) < 0) or (_GetZahl(ZahlN_[i]) >= StrToInt(BasisN))) then
      Delete(ZahlN_, i, 1);
  end;

  Result:=ZahlN_;
end;

Zum einen musst du ein Vorzeichen ignorieren und zum anderen, würde ich _GetZahl puffern und StrToInt auch (da aber außerhalb der schleife).

Also etwas wie sowas:
Delphi-Quellcode:
function TMathe.ZahlNBereinigen(const ZahlN, BasisN: string): string;
//Zahl-String zur Basis N von allen Zeichen bereinigen, die nicht zwischen
// '0' und Chr(N) liegen
var
  ZahlN_: string;
  i, Ziffer, BasisInt, StartZeichen : Integer;
begin
  ZahlN_:=Uppercase(ZahlN);
  if Ord(a[1]) in [Ord('+'), Ord('-')] then
    StartZeichen := 2
  else
    StartZeichen := 1;
  BasisInt := StrToInt(BasisN);

  // Rückwärtige Schleife, da der String hinter der aktuellen Position
  // verkürzt wird
  for i := Length(ZahlN_) downto StartZeichen do
  begin
    Ziffer := _GetZahl(ZahlN_[i]);
    if (Ziffer < 0) or (Ziffer >= BasisInt) then
      Delete(ZahlN_, i, 1);
  end;

  Result:=ZahlN_;
end;
Zitat:

Zitat von himitsu
Also im Prinzip sollte es so funktionieren - bei ImmerNormalisieren sowieso

Ich hab es eigentlich abschaltbar gemacht, falls man mit mehreren gekoppelten Berechnungen sich dieses sparren möchte, aber da sollte man dann vorher die "Eingabewerte" selber einmal manuell Normalisieren.

Naja, ich erwarte aber das Dezimalstellen('+12') mir immer 2 zurückgibt :P
Abgesehen davon müsste es eigentlich statt "a[Length(a)]" nur "a[1]" heißen.

MfG
xZise

Jens01 27. Dez 2010 16:51

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Hallo himitsu,

über die Festtage habe ich mir Deinen MatheParser angeguckt und finde ihn sehr gelungen.
Bei kleinen Test ist mir aufgefallen, dass das Potenzieren mit "^" nicht so richtig funktioniert.
Zum einem muß wohl in
Delphi-Quellcode:
Constructor TMatheParserF.Create;
der Operator von #^ zu ^ verändert werden.
Zum anderen läuft er sich in
Delphi-Quellcode:
Function TMathe.Potenz
aber irgendwie fest. Die Loop-Schleife findet scheinbar irgenwie keinen Ausstieg. Vielleicht muß diese '1' normalisiert werden?

In dem Demo5 tritt der Fehler nicht auf. Gibt es schon eine Korrektur?

Gruss
Jens

BBoy 8. Apr 2013 11:30

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
ICh weiß der Beitrag ist schon alt aber ich ärgere mich seit gestern mit einem Problem und diese unit hier hat das gleiche Problem.
Kann mir bitte jemand erklären warum matheparser anscheinend ein Problem hiermit haben: (25-20-4) Ergebnis ist dann 6
Aber warum?? Gebe ich das so in den Windowsrechner ein kommt 1 raus.
Andererseits kann Delphi aber dies richtig rechnen: (9*2/2-2)ebenso wie dies (5+3+1) dies kann er wieder nicht berechnen: (5-3-1) da bekommt er 3 raus.
Kann mir das bitte jemand erklären? Danke!

Furtbichler 8. Apr 2013 13:10

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Zitat:

Zitat von BBoy (Beitrag 1210528)
Andererseits kann Delphi aber dies richtig rechnen: (9*2/2-2)ebenso wie dies (5+3+1) dies kann er wieder nicht berechnen: (5-3-1) da bekommt er 3 raus.
Kann mir das bitte jemand erklären? Danke!

Wer ist 'Delphi' und wieso prüfst Du das nicht selbst? Also breakpoint setzen, Einzelschritt ausführen usw.

BBoy 8. Apr 2013 14:18

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Beim einen Schritt stimmt es ab dem nächsten dann einfach nicht mehr. Das lässt sich nicht debuggen. Hat auch nicht unbedingt was mit dieser Lib zu tun, scheint eher ein grundsätzliches Problem zu sein. Vlt. antwortet noch jemand der das erklären kann.

Jens01 8. Apr 2013 14:34

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Nach meinem Post habe ich mich länger mit Mathparsern, die es in der Delphi-Welt gibt, beschäftigt. Es gibt von diesen ca. 1 Mio., aber keinen der richtig funktioniert. Das kommt wahrscheinlich daher, dass alle heiß sind sich daran zu probieren dann aber nicht zu Ende gebracht werden.
Gefunden habe ich 2 Parser, die etwas taugen:
Parser10
Mathparser als den Cindy-Components
Wobei -man glaubt es kaum- der Parser aus Cindy ca. 30% schneller ist als der Parser10, der als schnell gilt.

Sir Rufo 8. Apr 2013 14:35

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Zitat:

Zitat von BBoy (Beitrag 1210604)
Beim einen Schritt stimmt es ab dem nächsten dann einfach nicht mehr. Das lässt sich nicht debuggen. Hat auch nicht unbedingt was mit dieser Lib zu tun, scheint eher ein grundsätzliches Problem zu sein. Vlt. antwortet noch jemand der das erklären kann.

Dann hast du ein Zauber-Delphi und wir haben das nicht ... ergo können wir das auch nicht erklären :)

Bummi 8. Apr 2013 14:49

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Vielleicht ein F8 statt F7 Problem ...

BBoy 8. Apr 2013 17:25

AW: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
@Jens01,
vielen Dank für die Empfehlung des cymathparser!! Dieser funktioniert tatsächlich einwandfrei. Klasse!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 Uhr.
Seite 10 von 10   « Erste     8910   

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