[Delphi] Percentage berekening gaat niet goed

Pagina: 1
Acties:
  • 180 views sinds 30-01-2008
  • Reageer

  • newpegasus
  • Registratie: Juni 2003
  • Laatst online: 05-03 19:50
ik heb een probleem bij een delphi opgave die ik aan het doen ben. het programma moet in een tekst de klinkers en medeklinkers tellen en deze als percentage van de totale lengte weergeven in een messagebox. eigenlijk ging alles goed, de for loop om de characters te tellen werkt ook prima.

maar als ik de integers van het aantal klinkers en medeklinkers om wil zetten in een percentage gebeurt er iets geks. ik gebruik deze berekening: (lengtetekst div iklinker) * 100. als ik bijvoorbeeld 5 keer een a invul dan is de lengte van de tekst 5 en komt er dus 100 % uit, dat klopt. dit werkt ook voor de medeklinkers.

het probleem komt als ik zowel klinkers als medeklinkers in mijn tekstvak typ. dan geeft hij als percentage opeens allebei 0 %?? hieronder staat de code die ik gemaakt heb, de fout zit hem in de berekening van de percentages denk ik, maar ik kan het probleem niet vinden. misschien jullie wel?

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
procedure TForm1.btnBerekenClick(Sender: TObject);

var

stekst: String ;
cklinker, cmedeklinker: Char ;
iKlinker, iMedeklinker, iPositiek, iPositiem, iLengtetekst,
iPerklinkers, iPermedeklinkers: Integer;

begin

sTekst := mTekstinvoer.Text;
iKlinker := 0;
iMedeklinker := 0;

//klinkers berekenen en opslaan

for iPositiek := 1 to Length (sTekst)
  do begin
   cKlinker := UpCase (sTekst[iPositiek]);
   if cKlinker in ['A', 'E', 'I', 'O', 'U']
   then
      iKlinker := iKlinker + 1
  end;

//medeklinkers berekenen en opslaan

for iPositiem := 1 to Length (sTekst)
  do begin
   cMedeklinker := UpCase (sTekst[iPositiem]);
   if cMedeklinker in ['B'..'D','F'..'H', 'J'..'N', 'P'..'T', 'V'..'Z']
   then
      iMedeklinker := iMedeklinker + 1
  end;

//percentages berekenen en weergeven, hier zit denk ik de fout.

iLengtetekst := Length (sTekst);
iPerklinkers := (iKlinker div iLengtetekst)*100;
iPermedeklinkers := (iMedeklinker div iLengtetekst)*100;

showmessage ('Percentage klinkers in uw tekst: ' + IntToStr (iPerklinkers)
              + ' Percentage medeklinkers in uw tekst: ' + IntToStr (iPermedeklinkers));

end;

procedure TForm1.btnOpnieuwClick(Sender: TObject);
begin

mTekstinvoer.clear   ;
mTekstinvoer.setfocus ;

end;

end.

ik bebruik trouwens borland delphi 7.

ik hoop dat iemand me kan helpen, ik kan het probleem niet vinden. de search leverde me niet echt iets op, en google gaf niet het specifieke probleem wat ik had. vast bedankt!

[ Voor 6% gewijzigd door newpegasus op 26-09-2004 10:50 ]


Verwijderd

de fout zit hem in de berekening van de percentages denk ik,
denk je dat of weet je dat zeker?

maw: zet eens een break na die "subprocedures" (als ik ze zo mag noemen) en kijk eens of je vreemde waardes van iKlinker, iMedeklinker, of iLengtetext tegenkomt.

[ Voor 11% gewijzigd door Verwijderd op 26-09-2004 11:32 ]


Verwijderd

Heb je code ff aangepast zie de comments en het werkt nu prima.


Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btnOpnieuw: TButton;
    btnBereken: TButton;
    mTekstinvoer: TEdit;
    procedure btnOpnieuwClick(Sender: TObject);
    procedure btnBerekenClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.btnBerekenClick(Sender: TObject);
var
  stekst: String ;
  cklinker, cmedeklinker: Char ;
  iKlinker, iMedeklinker, iPositiek, iPositiem : Integer;
  // Hier heb ik doubles van gemaakt beter voor je berekening
  iPerklinkers, iPermedeklinkers,iLengtetekst : Double;
begin
  sTekst := mTekstinvoer.Text;
  iKlinker := 0;
  iMedeklinker := 0;

  //klinkers berekenen en opslaan
  for iPositiek := 1 to Length (sTekst)
    do begin
     cKlinker := UpCase (sTekst[iPositiek]);
     if cKlinker in ['A', 'E', 'I', 'O', 'U']
     then
        iKlinker := iKlinker + 1
    end;

  //medeklinkers berekenen en opslaan
  for iPositiem := 1 to Length (sTekst)
    do begin
     cMedeklinker := UpCase (sTekst[iPositiem]);
     if cMedeklinker in ['B'..'D','F'..'H', 'J'..'N', 'P'..'T', 'V'..'Z']
     then
        iMedeklinker := iMedeklinker + 1
    end;

  //percentages berekenen en weergeven, hier zit denk ik de fout.
  iLengtetekst := Length (sTekst);
  iPerklinkers := (iKlinker / iLengtetekst)*100; // "Div" eruit gehaald en vervangen door "/"
  iPermedeklinkers := (iMedeklinker / iLengtetekst)*100; // "Div" eruit gehaald en vervangen door "/"

  // FloatToStrF zie help maar maakt van je float een mooie string !
  showmessage ('Percentage klinkers in uw tekst: ' + FloatToStrF(iPerklinkers,ffFixed   ,15,2)
                + ' Percentage medeklinkers in uw tekst: ' + FloatToStrF(iPermedeklinkers,ffFixed       ,15,2));

end;

procedure TForm1.btnOpnieuwClick(Sender: TObject);
begin
  mTekstinvoer.clear   ;
  mTekstinvoer.setfocus ;
end;

end.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

newpegasus schreef op 26 september 2004 @ 10:49:
ik gebruik deze berekening: (lengtetekst div iklinker) * 100.
div levert een integer terug. Als lengtetekst < iklinker zal dat altijd 0 opleveren. Aangezien het om percentages gaat zal dat dus waarschijnlijk elke keer het geval zijn.
Probeer de volgorde eens om te draaien: (lengtetekst * 100) div iklinker.

Vb: lengtetekst = 2, iklinker = 4.
(2 div 4) * 100 = 0 * 100 = 0
(2 * 100) div 4 = 200 div 4 = 50

Edit: als / altijd een real teruggeeft, ongeacht operand types, dan zou je nieuwe oplossing ook moeten werken. Ik ben niet meer zo bekend met Delphi, dus ik weet niet of het werkt. In Java, C en C++ doet / op 2 integers/longs wat div doet in Delphi.

[ Voor 20% gewijzigd door Robtimus op 26-09-2004 12:22 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

Verwijderd schreef op 26 september 2004 @ 11:32:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  //klinkers berekenen en opslaan
  for iPositiek := 1 to Length (sTekst)
    do begin
     cKlinker := UpCase (sTekst[iPositiek]);
     if cKlinker in ['A', 'E', 'I', 'O', 'U']
     then
        iKlinker := iKlinker + 1
    end;

  //medeklinkers berekenen en opslaan
  for iPositiem := 1 to Length (sTekst)
    do begin
     cMedeklinker := UpCase (sTekst[iPositiem]);
     if cMedeklinker in ['B'..'D','F'..'H', 'J'..'N', 'P'..'T', 'V'..'Z']
     then
        iMedeklinker := iMedeklinker + 1
    end;
Nu loop je 2x door de string heen, dat kun je in 1 loop doen:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
  //klinkers berekenen en opslaan
  for iPositiek := 1 to Length (sTekst)
    do begin
     cLetter := UpCase (sTekst[iPositiek]);
     if cLetter in ['A', 'E', 'I', 'O', 'U']
     then
        iKlinker := iKlinker + 1
    else if cLetter in ['B'..'D','F'..'H', 'J'..'N', 'P'..'T', 'V'..'Z']
    then
        iMedeklinker := iMedeklinker + 1
    end;
(kan wat syntaxfouten bevatten

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • newpegasus
  • Registratie: Juni 2003
  • Laatst online: 05-03 19:50
hardstikke bedankt voor de reacties! ik ben er nu uit, en weet waar het probleem zat. het zat zoals ik al dacht in de berekening van de percentages. zoals iceman en d52 mij duidelijk maakten: div maakt weer een integer van het getal. als ik dus de het aantal klinkers deel door de tekst krijg ik een decimaal getal, en dat word dus een 0 :X. (en omdat het eerst integers waren konden het ook niet eens decimale getallen worden.) ik heb van iKlinker, iMedeklinker en iLengtetekst een double gemaakt zodat er een decimaal getal kan onstaan. deze vermenigvuldig ik dan met 100 en dan heb ik eindelijk mijn percentage :D.

ik heb je vereenvoudiging van de loop ook meegenomen in mijn programmatje, is inderdaad beter zo.

allemaal bedankt voor het meedenken!
Pagina: 1