Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi pronzentberechungsproblem (https://www.delphipraxis.net/133919-pronzentberechungsproblem.html)

mlhk 12. Mai 2009 07:47


pronzentberechungsproblem
 
hey,
ich hab ein wahrscheinlich sehr einfach zu lösendes problem
Delphi-Quellcode:
memo4.Lines[1]:= inttostr ((zeichen div 100)*b)+'%';
und zwar besteht meine frage darin warum er mir bei einer gering anzahl von zeichen immer 0% prozent ausgibt, es müsste doch immer funktionieren
mfg
max

DeddyH 12. Mai 2009 07:50

Re: pronzentberechungsproblem
 
Bei ganzzahliger Division mit div ergibt jede Zahl < 100 div 100 0. Ändere das mal so ab:
Delphi-Quellcode:
memo4.Lines[1]:= inttostr (round(zeichen / 100 * b))+'%';

Dust Signs 12. Mai 2009 07:50

Re: pronzentberechungsproblem
 
Oder du multiplizierst vorher mit b und rechnest dann div 100 - das spart dir das Runden

Dust Signs

DeddyH 12. Mai 2009 07:56

Re: pronzentberechungsproblem
 
Oder so :)

mlhk 12. Mai 2009 08:10

Re: pronzentberechungsproblem
 
also ich hab das mal ausprobiert
Delphi-Quellcode:
memo4.Lines[1]:= inttostr (round(zeichen / 100 * b))+'%';
funktioniert aber z.b. mit nur 10 zeichen auch nicht und was sehr komisch ist bei z.b. 415 zeichen gehen die prozente über 400% hinaus, sie sollen aber immer nur bis 100 % gehen, also insgesamt, immer (bei den 10zeichen)

Klaus01 12. Mai 2009 08:26

Re: pronzentberechungsproblem
 
Guten Morgen,

was möchtest Du denn berechnen?
Wie groß kann "zeichen" werden, 415 Stellen?
Wie groß ist "b"?

Grüße
Klaus

mlhk 12. Mai 2009 08:29

Re: pronzentberechungsproblem
 
also zeichen kan erstaml unbegrentzt groß werden und b ist gleich der anzahl wie oft der buchstabe b in dieses zeichen vorkommt

Klaus01 12. Mai 2009 08:33

Re: pronzentberechungsproblem
 
.. aber "zeichen" ist schon eine Zahl?

Und sollte es dann nicht eher

Delphi-Quellcode:
memo4.Lines[1]:= inttostr (round((b/zeichen) *100))+'%';
heißen?

Grüße
Klaus

mlhk 12. Mai 2009 08:36

Re: pronzentberechungsproblem
 
ah danke, so geht das perfekt

thkerkmann 12. Mai 2009 08:41

Re: pronzentberechungsproblem
 
Hi,

Zahlendreher:

Prozent = 100 * Zähler / Maximum

mlhk 12. Mai 2009 08:42

Re: pronzentberechungsproblem
 
hab ich schon geändert

mlhk 12. Mai 2009 08:51

Re: pronzentberechungsproblem
 
also
Delphi-Quellcode:
memo4.Lines[1]:= inttostr (round(zeichen / (100 * b)))+'%';
müsste doch eigendlich funktionieren

Klaus01 12. Mai 2009 08:58

Re: pronzentberechungsproblem
 
was ist mit Deiner Aussage aus Beitrag #9

Zitat:

ah danke, so geht das perfekt
Schau nochmals in Dein Mathebuch unter Prozentrechnung nach.

Grüße
Klaus

Blup 12. Mai 2009 09:00

Re: pronzentberechungsproblem
 
Zitat:

Zitat von mlhk
also
Delphi-Quellcode:
memo4.Lines[1]:= inttostr (round(zeichen / (100 * b)))+'%';
müsste doch eigendlich funktionieren

Nein, das ist Quark.

Zeichen = Anzahl aller Zeichen = Maximum
b = Anzahl der gefundenen Zeichen = Zähler

Delphi-Quellcode:
memo4.Lines[1]:= inttostr (round((100 * b) / zeichen))+'%';

Satty67 12. Mai 2009 09:14

Re: pronzentberechungsproblem
 
Wurde ja schon gesagt, da es nur Integer-Werte sind, kann man mit DIV rechnen und Round sparen.
Delphi-Quellcode:
memo4.Lines[1]:= IntToStr ((100 * b) div zeichen)+'%';
Klammer um 100 * b wäre auch nicht nötig, aber bevor was falsch optimiert wird, schadet die auch nicht.

mlhk 12. Mai 2009 09:29

Re: pronzentberechungsproblem
 
hier besteht das problem irgendwie immer noch, also hier mal der ganz code, ich weiß ist sehr umständlich geschrieben
Delphi-Quellcode:
procedure TForm2.startClick(Sender: TObject);
var text: string;
var zeichen,a,aa,i,e,b,c,d,f,g,h,ii,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z :integer;
begin
text:= Eeingabe.Text;
zeichen:= length (text);
Ezeichen.Caption:= inttostr (zeichen);
for I := 1 to zeichen do
begin
a:= ord (text[i]);
case a of
65,97 : aa:=aa+1;
66,98 : b:=b+1;
67,99 : c:=c+1;
68,100 : d:=d+1;
69,101 : e:=e+1;
70,102 : f:=f+1;
71,103 : g:=g+1;
72,104 : h:=h+1;
73,105 : ii:=ii+1;
74,106 : j:=j+1;
75,107 : k:=k+1;
76,108 : l:=l+1;
77,109 : m:=m+1;
78,110 : n:=n+1;
79,111 : o:=o+1;
80,112 : p:=p+1;
81,113 : q:=q+1;
82,114 : r:=r+1;
83,115 : s:=s+1;
84,116 : t:=t+1;
85,117 : u:=u+1;
86,118 : v:=v+1;
87,119 : w:=w+1;
88,120 : x:=x+1;
89,121 : y:=y+1;
90,122 : z:=z+1;
end;
memo3.lines[0]:='A:'+inttostr (aa);
memo3.lines[1]:='B:'+ inttostr (b);
memo3.lines[2]:='C:'+ inttostr (c);
memo3.lines[3]:='D:'+ inttostr (d);
memo3.lines[4]:='E:'+ inttostr (e);
memo3.lines[5]:='F:'+ inttostr (f);
memo3.lines[6]:='G:'+ inttostr (g);
memo3.lines[7]:='H:'+ inttostr (h);
memo3.lines[8]:='I:'+ inttostr (ii);
memo3.lines[9]:='J:'+ inttostr (j);
memo3.lines[10]:='K:'+ inttostr (k);
memo3.lines[11]:='L:'+ inttostr (l);
memo3.lines[12]:='M:'+ inttostr (m);
memo3.lines[13]:='N:'+ inttostr (n);
memo3.lines[14]:='O:'+ inttostr (o);
memo3.lines[15]:='P:'+ inttostr (p);
memo3.lines[16]:='Q:'+ inttostr (q);
memo3.lines[17]:='R:'+ inttostr (r);
memo3.lines[18]:='S:'+ inttostr (s);
memo3.lines[19]:='T:'+ inttostr (t);
memo3.lines[20]:='U:'+ inttostr (u);
memo3.lines[21]:='V:'+ inttostr (v);
memo3.lines[22]:='W:'+ inttostr (w);
memo3.lines[23]:='X:'+ inttostr (x);
memo3.lines[24]:='Y:'+ inttostr (y);
memo3.lines[25]:='Z:'+ inttostr (z);
end;
memo4.Lines[0]:= IntToStr ((100 * aa) div zeichen)+'%';
memo4.Lines[1]:= IntToStr ((100 * b) div zeichen)+'%';
memo4.Lines[2]:= IntToStr ((100 * c) div zeichen)+'%';
memo4.Lines[3]:= IntToStr ((100 * d) div zeichen)+'%';
memo4.Lines[4]:= inttostr (round((e/zeichen) *100))+'%';
memo4.Lines[5]:= inttostr (round((f/zeichen) *100))+'%';
memo4.Lines[6]:= inttostr (round((g/zeichen) *100))+'%';
memo4.Lines[7]:= inttostr (round((h/zeichen) *100))+'%';
memo4.Lines[8]:= inttostr (round((ii/zeichen) *100))+'%';
memo4.Lines[9]:= inttostr (round((j/zeichen) *100))+'%';
memo4.Lines[10]:= inttostr (round((k/zeichen) *100))+'%';
memo4.Lines[11]:= inttostr (round((l/zeichen) *100))+'%';
memo4.Lines[12]:= inttostr (round((m/zeichen) *100))+'%';
memo4.Lines[13]:= inttostr (round((n/zeichen) *100))+'%';
memo4.Lines[14]:= inttostr (round((o/zeichen) *100))+'%';
memo4.Lines[15]:= inttostr (round((p/zeichen) *100))+'%';
memo4.Lines[16]:= inttostr (round((q/zeichen) *100))+'%';
memo4.Lines[17]:= inttostr (round((r/zeichen) *100))+'%';
memo4.Lines[18]:= inttostr (round((s/zeichen) *100))+'%';
memo4.Lines[19]:= inttostr (round((t/zeichen) *100))+'%';
memo4.Lines[20]:= inttostr (round((u/zeichen) *100))+'%';
memo4.Lines[21]:= inttostr (round((v/zeichen) *100))+'%';
memo4.Lines[22]:= inttostr (round((w/zeichen) *100))+'%';
memo4.Lines[23]:= inttostr (round((x/zeichen) *100))+'%';
memo4.Lines[24]:= inttostr (round((y/zeichen) *100))+'%';
memo4.Lines[25]:= inttostr (round((z/zeichen) *100))+'%';

end;
und am ende noch nicht ganz fertig aber dennoch

Klaus01 12. Mai 2009 09:37

Re: pronzentberechungsproblem
 
Delphi-Quellcode:
memo4.Lines[0]:= IntToStr ((100 * aa) div zeichen)+'%';
warum arbeitest Du hier nicht mit Float Werten, das ist unter Umständen genauer.

Delphi-Quellcode:
memo4.Lines[0]:= format('%.2f %%',[100 * aa / zeichen]);
.. und vielleicht mal über die Verwendung von Array nachdenken.
.. und nicht vergessen den Quellcode einzurücken, das macht die ganze Geschichte lesbarer.

Grüße
Klaus

mlhk 12. Mai 2009 09:57

Re: pronzentberechungsproblem
 
das funktioniert jetzt, ich bin auch auf eine fehlerquelle gestoßen und zwar beim memo, bei lines sollte 0 eingestellt sein und das ist mir zwar unerklärlich man muss mit leerzeichen aufpassen

allerherzlichsten danke schon für eure hilfe, hat mich wirklich weiter gebracht

mfg
max

Blup 12. Mai 2009 14:36

Re: pronzentberechungsproblem
 
Ich bezweifle das deine Anwendung so richtig funktioniert.
Deine Variablen für die Summen werden nicht mit 0 initialisiert, bevor du mit dem Zählen beginnst.
Die Ausgabe der Prozente erfolgt zum Teil gerundet, zum Teil werden einfach die Kommastellen abgeschnitten.

Hier mal ein Beispiel nicht getestet:
Delphi-Quellcode:
{Funktionalität von der Oberfläche trennen, eventuell eigene Unit}
type
  TBuchstabenSumme = array['A'..'Z'] of integer;

function ZaehleBuchstaben(const AText: string; out ASumme: TBuchstabenSumme): integer;
var
  i: integer;
  c: Char;
begin
  {Anzahl der Zeichen zurückgeben}
  Result := Length(AText);
  {Anfangswerte für die Summen auf 0 setzen}
  for c := Low(ASumme) to High(ASumme) do
    ASumme[c] := 0;
  {die entsprechende Summe für jedes gültige Zeichen im Text erhöhen}
  for i := 1 to Result do
  begin
    c := UpCase(AText[i]);
    if (c >= Low(ASumme)) and (c <= High(ASumme)) then
      Inc(ASumme[c], 1);
  end;
end;

procedure TForm1.startClick(Sender: TObject);
var
  Zeichen: integer;
  Summe: TBuchstabenSumme;
  y: Integer;
  c: Char;
begin
  {Eingabeparameter an die Funktion übergeben und Ergebnis übernehmen}
  Zeichen := ZaehleBuchstaben(Eeingabe.Text, Summe);
  {Ergebnisausgabe}
  Ezeichen.Caption:= IntToStr(Zeichen);
  {mit erster Zeile im Memo beginnen, ein Grid wäre vieleicht besser}
  y := 0;
  for c := Low(Summe) to High(Summe) do
  begin
    memo3.Lines[y] := c + ': ' + IntToStr(Summe[c]);
    memo4.Lines[y] := IntToStr(Round((100 * Summe[c]) / Zeichen)) + '%';
    Inc(y);
  end;
end;

DeddyH 12. Mai 2009 14:54

Re: pronzentberechungsproblem
 
Eine Array-Lösung hatte ich gestern auch schon vorgeschlagen, aber das scheint ihm/ihr nicht zu behagen (:shock: das reimt sich ja sogar).

mlhk 14. Mai 2009 17:24

Re: pronzentberechungsproblem
 
problem ist folgendes ihr baut in euren quelltext zeug ein was ich nicht kenne und mit ich somit nur schlecht arbeiten kann, ich möchte am anfang lieber auf einfache leichte verfahren zurück greifen auch wenn diese im ersten moment vielleicht umständlich erscheinen, also ich konnte das problem nun beheben, allerherzlichsten dank an alle die hier geschreiben haben, hat mir sehr geholfen,
mfg
max


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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