2024(e)ko martxoaren 21(a), osteguna

10. astea | alfabetoko letren maiztasuna testu batean

Maiztasuna: Alfabeto larrien letrak zenbat aldiz agertzen diren testu batean
Demagun testu bat daukagula array batean gorderik, karaktere-kateen array bat da testuaren edukiontzia:
const
   iZENBATIKASLE = 10;
type
   tsKate49 = string[49];
   tasIzenenZerrenda = array[1..iZENBATIKASLE] of tsKate49;
Bestalde, alfabetoko letra bat zenbat aldiz agertzen den gordetzeko zenbaki osoen array bat beharko dugu, arraiaren posizio bakoitzean kopuru bat (posizio horretako letrari dagokion maiztasuna). Maiztasunak gordeko dituen osoen arrayaren datu-mota hauxe izan daiteke, non arrayaren indizeak karaktereak diren:
type
   taiAlfabetoMaizta = array['A'..'Z'] of integer;

Adibide honetan testua konstantea da, izen abizenen zerrenda konstante bat da. Alfabetoko letren maiztasuna kalkulatzeko horrela egingo genuke:

program AlfabetokoLetrenMaiztasuna;
uses
   crt; 
const
   iZENBATIKASLE = 10; 
type
   taiAlfabetoMaizta = array['A'..'Z'] of integer;
   tsKate49 = string[49];
   tasIzenenZerrenda = array[1..iZENBATIKASLE] of tsKate49;
const
   asZERRENDA: tasIzenenZerrenda = ('AGIRRE ROMERO, UNAI',              // 01
                                    'ANGULEMA CARAZO, JON ANDER',       // 02
                                    'BIKARREGI IGLESIAS, JULEN',        // 03
                                    'CANO RUIZ DE HEREDIA, JULIAN',     // 04
                                    'CORRAL EGIA, JOSEBA ANDONI',       // 05
                                    'DIAZ DE ULZURRUN, ROY, LEONOR',    // 06
                                    'EGIGUREN MARKINEZ, IRUNE',         // 07
                                    'ERKIAGA ANDONEGI, IKER',           // 08
                                    'FERNANDEZ FEITO, FELIX',           // 09
                                    'GARTZIA DE ALZA GIL, KATALIN');    // 10

{ ikasleen izena array konstante batean daude, bere edukia pantailaratu }
{ parametrorik gabe, asZERRENDA eta iZENBATIKASLE konstante direlako    }
procedure TestuaIkusi;
var
   k: integer;
begin
   for k:=1 to iZENBATIKASLE do
   begin
      writeln(k:20, '. ikaslea: ', asZERRENDA[k]);
   end;
end;

{ asZERRENDA eta iZENBATIKASLE konstante direlako ez dira parametro  }
{ luzerarik ez aiAlfabetoMaizta arrayarentzat bete-beterik dagoelako }
procedure LetrenZenbaketakEgin(var aiAlfabetoMaizta: taiAlfabetoMaizta);
var
   cKontLetr: char;
   iKontIkas: integer;
   iKont: integer;
   cLetra: char;
begin
   (* hasiera batean letra guztien maiztasuna 0 da *)
   for cKontLetr:='A' to 'Z' do
      aiAlfabetoMaizta[cKontLetr] := 0; 
      
   (* ikasle guztiak arakatu *)
   for iKontIkas:=1 to iZENBATIKASLE do
   begin
      (* ikasle baten letrak prozesatu *)
      for iKont:=1 to length(asZERRENDA[iKontIkas]) do
      begin
         cLetra := asZERRENDA[iKontIkas][iKont];
         //aiAlfabetoMaizta[asZERRENDA[iKontIkas][iKont]] := aiAlfabetoMaizta[asZERRENDA[iKontIkas][iKont]] + 1;
         aiAlfabetoMaizta[cLetra] := aiAlfabetoMaizta[cLetra] + 1;
      end;
   end;
end;

{ luzerarik ez aiAlfabetoMaizta arrayarentzat bete-beterik dagoelako, A-tik Z-tara }
function fnrBatezBestekoaKalkulatu(const aiAlfabetoMaizta: taiAlfabetoMaizta): real;
var
   cKontLetr: char;
   iMetatua: integer;
   iZenbatLetra: integer;
begin
   iMetatua := 0;
   for cKontLetr:='A' to 'Z' do
      iMetatua := iMetatua + aiAlfabetoMaizta[cKontLetr];
   
   iZenbatLetra := ord('Z') - ord('A') + 1;
   fnrBatezBestekoaKalkulatu := 1.0*iMetatua/iZenbatLetra;
end;

{ luzerarik ez aiAlfabetoMaizta arrayarentzat A-tik Z-tara doalako }
procedure MaiztasunakIkusi(const aiAlfabetoMaizta: taiAlfabetoMaizta);
var
   cKont: char;
begin
   for cKont:='A' to 'Z' do
   begin
      writeln('"':20, cKont, '" ===> ', aiAlfabetoMaizta[cKont]:3, ' aldiz');
   end;
end;

{ ---------------------------------- Programa Nagusia ---------------------------------- }
var
   aiAlfabetoMaizta: taiAlfabetoMaizta;
   rBBA: real;
begin
   clrscr;
   
   writeln('Zeintzuk dira letra guzti hauen maiztasuna?');
   writeln;
   TestuaIkusi;    { parametrorik ez, izenen arraya konstante delako }
   writeln;
      
   LetrenZenbaketakEgin(aiAlfabetoMaizta);   { parametrorik bakarra, izenen arraya konstante delako }
   MaiztasunakIkusi(aiAlfabetoMaizta);       { luzerarik ez, arraya beterik dagoelako (26 letra) }
   writeln;
   
   rBBA := fnrBatezBestekoaKalkulatu(aiAlfabetoMaizta);    { luzerarik ez, alfabeto osoa }
   writeln('Letren agerpenen atezbesteko aritmetikoa = ', rBBA:0:2, ' aldiz');
   
   repeat until keypressed;
end.
 

iruzkinik ez:

Argitaratu iruzkina

Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.