Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Geocaching Tool: Ermitteln des Wordwerts und dessen Quersumme zu berechnen

  Alt 8. Okt 2012, 00:07
Hab ich mir mal angeschaut.
Das ganze wurde m.E. eher suboptimal umgesetzt.

NonAlpha-Zeichen werden in die Berechnung eingeschlossen, mit verwirrenden Ergebnissen.
Beispiel : Die Eingabe "." (Dezimalpunkt) führt zu einer Summe von 4294967278.
Nun kann man der Auffassung sein, es sei Sache des Anwenders, nur solche Zeichen einzugeben, die auch berechnet werden sollen, aber dann müsste man auch der Auffassung sein, dass z.B. Blanks nicht entfernt werden müssen.
Also : Wenn schon "Fehleingaben" erkannt werden, dann bitte konsequent.

Die mit der Ermittlung der Summe verbundenen Aktionen
- Blanks entfernen
- In UpperCase wandeln
- Umlaute entfernen (7 Mal das bummelige StringReplace)
sind alle höchst überflüssig, wenn man die Berechnung etwas besser gestaltet.

Wenn ich die Option "A=1" oder "A=26" klicke, dann erwarte ich, dass die aktuelle Eingabe neu bewertet wird.

Nun ja, ich will nicht nur meckern.
Deshalb nachstehend eine verbesserte Prozedur "Calc", die alle anderen Prozeduren in der Unit überflüssig macht und deutlich schneller arbeitet, wobei letzteres hier wohl irrelevant ist.
(Hoffentlich habe ich nichts übersehen).


Delphi-Quellcode:
PROCEDURE TGeoToolsWords.Calc(A1:boolean=true);
var n:integer; sum,digsum,corr:cardinal; s:AnsiString; p:PAnsiChar;
PROCEDURE Add(Value:AnsiChar); overload;
begin
   inc(n);
   s[n]:=Value;
   inc(sum,Ord(Value));
end;
PROCEDURE Add(Value1,Value2:AnsiChar); overload;
begin
   Add(Value1);
   Add(Value2);
end;
begin
   sum:=0;
   if FInputWord<>'then begin
      SetLength(s,Length(FInputWord)*2);
      p:=PAnsiChar(FInputWord);
      n:=0;
      repeat
         case p^ of
            'A'..'Z' : Add(p^);
            'a'..'z' : Add(AnsiChar(Ord(p^)-Ord('a')+Ord('A')));
            'Ä','ä'  : Add('A','E');
            'Ö','ö'  : Add('O','E');
            'Ü','ü'  : Add('U','E');
            'ß'      : Add('S','S');
         end;
         inc(p);
      until p^=#0;
      FInputWord:=Copy(s,1,n);
      dec(sum,n*(Ord('A')-1));
      if not A1 then sum:=n*27-sum;
   end;
   FSumLetters:=sum;
   digsum:=0;
   while sum>0 do begin
      inc(digsum,sum mod 10);
      sum:=sum div 10;
   end;
   FCrossSum:=digsum;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat