![]() |
pronzentberechungsproblem
hey,
ich hab ein wahrscheinlich sehr einfach zu lösendes problem
Delphi-Quellcode:
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
memo4.Lines[1]:= inttostr ((zeichen div 100)*b)+'%';
mfg max |
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))+'%';
|
Re: pronzentberechungsproblem
Oder du multiplizierst vorher mit b und rechnest dann div 100 - das spart dir das Runden
Dust Signs |
Re: pronzentberechungsproblem
Oder so :)
|
Re: pronzentberechungsproblem
also ich hab das mal ausprobiert
Delphi-Quellcode:
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)
memo4.Lines[1]:= inttostr (round(zeichen / 100 * b))+'%';
|
Re: pronzentberechungsproblem
Guten Morgen,
was möchtest Du denn berechnen? Wie groß kann "zeichen" werden, 415 Stellen? Wie groß ist "b"? Grüße Klaus |
Re: pronzentberechungsproblem
also zeichen kan erstaml unbegrentzt groß werden und b ist gleich der anzahl wie oft der buchstabe b in dieses zeichen vorkommt
|
Re: pronzentberechungsproblem
.. aber "zeichen" ist schon eine Zahl?
Und sollte es dann nicht eher
Delphi-Quellcode:
heißen?
memo4.Lines[1]:= inttostr (round((b/zeichen) *100))+'%';
Grüße Klaus |
Re: pronzentberechungsproblem
ah danke, so geht das perfekt
|
Re: pronzentberechungsproblem
Hi,
Zahlendreher: Prozent = 100 * Zähler / Maximum |
Re: pronzentberechungsproblem
hab ich schon geändert
|
Re: pronzentberechungsproblem
also
Delphi-Quellcode:
müsste doch eigendlich funktionieren
memo4.Lines[1]:= inttostr (round(zeichen / (100 * b)))+'%';
|
Re: pronzentberechungsproblem
was ist mit Deiner Aussage aus Beitrag #9
Zitat:
Grüße Klaus |
Re: pronzentberechungsproblem
Zitat:
Zeichen = Anzahl aller Zeichen = Maximum b = Anzahl der gefundenen Zeichen = Zähler
Delphi-Quellcode:
memo4.Lines[1]:= inttostr (round((100 * b) / zeichen))+'%';
|
Re: pronzentberechungsproblem
Wurde ja schon gesagt, da es nur Integer-Werte sind, kann man mit DIV rechnen und Round sparen.
Delphi-Quellcode:
Klammer um 100 * b wäre auch nicht nötig, aber bevor was falsch optimiert wird, schadet die auch nicht.
memo4.Lines[1]:= IntToStr ((100 * b) div zeichen)+'%';
|
Re: pronzentberechungsproblem
hier besteht das problem irgendwie immer noch, also hier mal der ganz code, ich weiß ist sehr umständlich geschrieben
Delphi-Quellcode:
und am ende noch nicht ganz fertig aber dennoch
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; |
Re: pronzentberechungsproblem
Delphi-Quellcode:
warum arbeitest Du hier nicht mit Float Werten, das ist unter Umständen genauer.
memo4.Lines[0]:= IntToStr ((100 * aa) div zeichen)+'%';
Delphi-Quellcode:
.. und vielleicht mal über die Verwendung von Array nachdenken.
memo4.Lines[0]:= format('%.2f %%',[100 * aa / zeichen]);
.. und nicht vergessen den Quellcode einzurücken, das macht die ganze Geschichte lesbarer. Grüße Klaus |
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 |
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; |
Re: pronzentberechungsproblem
Eine Array-Lösung hatte ich
![]() |
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 07:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz