Programmeren letters tellen

Het forum voor overige vragen betreffende wiskunde uit het hoger onderwijs.
Plaats reactie
BusinessMath
Vast lid
Vast lid
Berichten: 57
Lid geworden op: 23 feb 2014, 15:14

Programmeren letters tellen

Bericht door BusinessMath » 28 sep 2014, 18:45

Hallo,

Deze vraag gaat over programmeren.

Door middel van Opendialog wordt een bestand gekozen en die wordt op het scherm weergegeven,
in een StringGrid wil ik alle Alfabet letters hebben staan, onder elkaar en in de volgende kolom het aantal wat voorkomt in het geselecteerde textbestand.

ik weet dat het moet met StringGrid1.cells[i,j]:= .....

Hierbij is i de kolom en j de rij.

in de eerste kolom (kolom nul is dat) wil ik de alfabet letter hebben staan, dus de i wordt vervangen door een nul.

mijn vraag1 is hoe ik de letters in de rijen krijg. ik heb al verschillende mogelijkheden geprobeerd maar het wil maar niet lukken.

Dit is wat ik al geprobeerd heb.

Code: Selecteer alles

 for k := 'A' to 'Z' do
             j:=aantal[k];
             stringGrid1.cells[1,0]:= IntToStr(j);

of.
           for k:= 65 to 90 do
              begin
              alfabet:= chr(k);
              for j:= 0 to 26 do
              StringGrid1.cells[0,j]:= IntToStr(alfabet)
              end;

En vraag 2 is: hoe krijg ik het bijbehorende aantal letters in de volgende kolom die erbij horen??

ik heb een array gedeclareerd voor het tellen van de letters::

var aantal: array [‘A’..’Z’] of integer ;
De index van dit array is dus een deelbereik van het type char.
Voorbeeld: aantal[‘K’] geeft aan hoe vaak de letter ‘K’ voorkomt.

Dit is wat ik gemaakt heb:

Code: Selecteer alles


          Reset(f);
          while not Eof do
           begin
             read(f,c);
             d:=Upcase(c);
             for i := 'A' to 'Z' do
             if d=i then
                begin
                aantal[d]:= aantal[d]+1;
             StringGrid1.cells[1,j]:= IntToStr(aantal[d]);
                end;
zolang niet aan het einde is van het textbestand do
lees teken voor teken, maak hoofdletters van het teken (er wordt geen onderscheid gemaakt tussen hoofd en kleine letters).

ik weet nu niet precies wat ik fout doe. maar er komt in ieder geval niks in het stringgrid te staan.

hoop dat jullie mij kunnen helpen! :D
Durf te vragen!

arie
Moderator
Moderator
Berichten: 3246
Lid geworden op: 09 mei 2008, 09:19

Re: Programmeren letters tellen

Bericht door arie » 29 sep 2014, 09:33

Ik heb nog steeds geen Delphi, maar hier wat gedachten:
De opdracht bestaat uit 2 delen:
lees een tekst en zet de letteraantallen in een array
[II] geef de resultaten weer in StringGrid1


Eerst deel : tekst lezen en letters tellen

Je hebt gedefinieerd:
var aantal: array [‘A’..’Z’] of integer;
Geldige indices voor aantal[] zijn dan 'A' t/m 'Z' ofwel 65 t/m 90

Voordat we gaan tellen zet je eerst alle waarden in de array aantal[] op 0, dat zal er zoiets uitzien:
for i:= 'A' to 'Z' do
aantal := 0;

Dan de kern van deze stap:

Code: Selecteer alles

Reset(f);                          // reset je file pointer
while not Eof(f) do                // moet dit inderdaad zijn: Eof(f) i.p.v. Eof ??
  begin
    Read(f, c);
    d:=UpCase(c);
    if d >= 'A' And d<= 'Z' then   // test of d in de range zit, zo hoef je niet 
                                   // alle letters 1 voor 1 af te gaan
      begin
        aantal[d] := aantal[d] + 1;
      end;
  end;
Merk op dat we bij iedere letter die we vinden StringGrid1 NIET updaten, zo'n update kost veel tijd, terwijl we alleen geinteresseerd zijn in het eindresultaat.

Als het goed is heb je nu je file gelezen en staan de letteraantallen in array aantal[].
Je zou ter controle array aantal[] eens een keer kunnen printen.


Dan deel [II]: aantal[] weergeven in StringGrid1:

De index k die je gebruikt voor array aantal[] loopt van 'A' t/m 'Z' ofwel van 65 t/m 90
Als je de aantallen wilt plaatsen in kolom 1 van StringGrid1 (van rij 1 t/m rij 26), wordt de rij-index voor StringGrid1:
k - 'A' + 1
(als k='A' dan is k - 'A' + 1 = 'A' - 'A' + 1 = 1,
als k='B' dan is k - 'A' + 1 = 'B' - 'A' + 1 = 2,
etc.)
Je krijgt dan zoiets:

Code: Selecteer alles

 
for k := 'A' to 'Z' do
  begin
    j:=aantal[k];
    stringGrid1.cells[k-'A'+1, 0] := k;
    stringGrid1.cells[k-'A'+1, 1] := IntToStr(j);
  end
Indien Delphi protesteert over k - 'A' + 1, dan zou je ook dit eens kunnen proberen:

Code: Selecteer alles

 
for k := 'A' to 'Z' do
  begin
    j:=aantal[k];
    stringGrid1.cells[Ord(k)-64, 0] := k;
    stringGrid1.cells[Ord(k)-64, 1] := IntToStr(j);
  end
Nogmaals, ik heb bovenstaande code niet getest, laat het s.v.p. even weten als het ergens mis gaat of vastloopt.

Plaats reactie