Einzelnen Beitrag anzeigen

Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

Problem mit Fraktion/Prozentrechnung

  Alt 22. Mai 2005, 22:09
Ich mach gerade ne kleine Anwendung, die mir n paar statistische Sachen über eine(n) text(datei) gibt. naja, eigentlich berechnet sie zur zeit nur die verteilung der buchstaben:

Delphi-Quellcode:
procedure TForm1.BCheckClick(Sender: TObject);
var c:char;
    counts:array[0..25] of integer;
    fraction:array[0..25] of single;
    i,k:integer;
    PB:TRBProgressBar;
begin
for PB in bars do
 PB.Position:=0; //Ja, Marabu und Sakura, seht nur hin, ich weise der Schleifenvariable etwas zu ;)

for i:= 0 to length(counts)-1 do //initialize the array
 counts[i]:=0;

for i := 1 to memo1.GetTextLen do
 begin
  application.ProcessMessages; //damit das ganze nicht hängenbleibt
  c:=memo1.text[i]; //dem char wird ein buchstabe des memos zugewiesen.
  c:=ansilowercase(c)[1]; //der char wird kleingemacht. was passiert eigentlich wenn er z.b. #10 ist? das muss ich gleich noch alles überprüfen/abfangen.
  PBSum.Position:=round(i / memo1.GetTextLen * 100); //hier kommt der gesamtfortschritt raus.
  counts[ord(c)-97]:=counts[ord(c)-97]+1; //wenn c=#97='a' ist, wird counts[97-97] inkrementiert.
 end;

for i:= 0 to 25 do
 fraction[i]:=counts[i]/memo1.GetTextLen; //hier werden die anteile an der gesamtdatei berechnet.

for i:= 0 to 100 do //diese schleife ist eigentlich nur design.
 for k:= 0 to 25 do
  begin
   application.ProcessMessages; //noch einmal antifreeze :D
   if bars[k].Position < round(fraction[k]*100) then //wenn die progressbar noch nicht soweit ist wie es der anteil sagt, dann...
    bars[k].Position:=bars[k].Position + 1; //...wird position inkementiert.
  end;
end;
1. ja die performance ist schlecht. danach frag ich aber gar nicht. oder doch: wenn ich progressmessages nicht so oft aufrufe, wirkt sich das auf die performance aus, oder werden sowieso alle anstehenden messages abgearbeitet?
2. das eigentliche problem:
es funktioniert alles wunderbar, aber ich bekomm zum schluss immer nur ganz mickrige anteile raus. in der summe ergibt es nie auch nur annähernd hundert (zeilenumbrüche muss man ja rausrechnen). es bewegt sich so zwischen 60% und 80%, wobei 60% typisch ist. die linefeeds machen 2-4% aus. ich hab also irgendwo was falsch. evtl. irgendwo so gravierende rundungsfehler? die bars werden ja in der letzten schleife zugewiesen. das sieht für mich aber ganz richtig aus?!

EDIT: gerade nen testlauf gemacht mit einfach nur 'aaaaaaa...'. gibt er mir brav meine 100%. also doch n rundungsfehler?!
EDIT2: liegt es vielleicht doch an den ganzen sonderzeichen('(', '-','_' usw.) die sich in so nem textfile verstecken? hab jetzt noch n paar solche testfälle laufen gelassen, und da geht es.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat