Thema: Delphi Parser Kommarechnung

Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Parser Kommarechnung

  Alt 4. Sep 2010, 20:17
Versuch mal, alzaimars Code nachzuvollziehen. Die Potenzen steigen in unserem Dezimalsystem von rechts nach links jeweils um eins an:
Code:
1. Stelle vor dem Komma: 10^0 = __1
2. Stelle vor dem Komma: 10^1 = _10
3. Stelle vor dem Komma: 10^2 = 100
(_ = Leerzeichen, aus irgendeinem Grund bleibt hier ja der Whitespace leider nicht mehr erhalten...)
usw...
D.h., man muss die Ziffer an der jeweilgen Position immer mit der jeiligen Zehner-Potenz, der Wertigkeit, multiplizieren, um den Wert zu erhalten. Deshalb funktioniert es bei von links nach rechts eingelesenen Ganzzahlen, einfach immer den alten Wert mit 10 zu multiplizieren und die aktuelle Ziffer zu addieren. So macht es auch der originale Algorithmus.

Hinter dem Komma ist es eben genau umgekehrt:
Code:
1. Stelle nach dem Komma: 10^-1 = 0.1
2. Stelle nach dem Komma: 10^-2 = 0.01
3. Stelle nach dem Komma: 10^-3 = 0.001
usw...
Hier braucht man allerdings eine zusätzliche Variable, die die Potenz speichert: Dafür ist bei Alzaimars Code die Variavble decimal zuständig, die für jede Ziffer nach dem Komma mit 10 multipliziert wird. Die neue Ziffer wird dann durch diesen Wert geteilt und zum vorigen Wert hinzuaddiert. Der Initialwert ist logischerweise 10, weil die erste Stelle nach dem Komma die Wertigkeit 1/10 hat (10^-1).

Dieser Wert wird initialisiert, sobald das erste mal ein Komma auftritt:
Delphi-Quellcode:
        '.': if decimal>0 then
               raise Exception.Create('invalid decimal')
            else
               decimal := 10;
Die Prüfung auf decimal>0 ist deshalb vorhanden, weil sonst mehrere Kommata pro zahl vorkommen dürften, was natürlich sinnlos wäre. Lange Rede kurz: Der Algorithmus geht von einem mit 0 initialisierten Wert aus.

Da hättest du mit ein paar Sekunden Analyse aber auch drauf kommen können...
  Mit Zitat antworten Zitat