2024(e)ko martxoaren 23(a), larunbata

10. astea | hiru array paralelo

Gehienez 20 elementu gordetzeko gai diren arrayekin lan egingo dugu. Arrayen elementuak zenbaki osoak izango dira.


 
{ Luzera logikorik ez da erabiltzen hiru arrayak }
{ beti beterik daudela suposatzen delako.        }
program HiruArray;
uses
   crt;

const
   iBEHEMUGA = 1;
   iGOIMUGA = 20;

type
   taiZenbakiak = array[iBEHEMUGA..iGOIMUGA] of integer;


procedure ArrayakAleatoriokiBete(var aiZenbakiak1: taiZenbakiak;
                                 var aiZenbakiak2: taiZenbakiak);
var
   iKont: integer;
begin
   randomize;
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      aiZenbakiak1[iKont] := random(40) - 20;   { -20 eta 19 arteko balioak }
      aiZenbakiak2[iKont] := random(40) - 20;   { -20 eta 19 arteko balioak }
   end;
   writeln;
end;


procedure ArrayaBete(var aiZenbakiak: taiZenbakiak);
var
   iKont: Integer;
begin
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      write('Eman ', iKont:2, '. zenbakia: ');
      readln(aiZenbakiak[iKont]) ;
   end;
   writeln;
end;


procedure ArrayaIkusi(const aiZenbakiak: taiZenbakiak);
var
   iKont: integer;
begin
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      writeln(iKont:2, '. zenbakia = ', aiZenbakiak[iKont]);
   end;
   writeln;
end;
   
   
procedure ArrayaLortu(const aiX, aiY: taiZenbakiak; 
                             var aiZ: taiZenbakiak);
var
   iKont: integer;
begin
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      if aiX[iKont] > aiY[iKont] then
         aiZ[iKont] := 1;
      if aiX[iKont] = aiY[iKont] then
         aiZ[iKont] := 0;
      if aiX[iKont] < aiY[iKont] then
         aiZ[iKont] := -1;      
   end;
end;


function fniKontatuZenbatPlus(const aiZ: taiZenbakiak): integer;
var
   iKont, iZenbat: integer;
begin
   iZenbat := 0;
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      if aiZ[iKont] = 1 then
         iZenbat := iZenbat + 1;
   end;
   fniKontatuZenbatPlus := iZenbat;
end;


function fniKontatuZenbatMinus(const aiZ: taiZenbakiak): integer;
var
   iKont, iZenbat: integer;
begin
   iZenbat := 0;
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      if aiZ[iKont] = -1 then
      begin
         iZenbat := iZenbat + 1;
      end;   
   end;
   fniKontatuZenbatMinus := iZenbat;
end;


function fniKontatuZenbatZero(const aiZ: taiZenbakiak): integer;
var
   iKont, iZenbat: integer;
begin
   iZenbat := 0;
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      if aiZ[iKont] = 0 then
      begin
         iZenbat := iZenbat + 1;
      end;   
   end;
   fniKontatuZenbatZero := iZenbat;
end;


procedure HiruKontaketakEgin(    const aiZeta: taiZenbakiak;
                              var iZenbatPlus: integer;
                             var iZenbatMinus: integer;
                              var iZenbatZero: integer);
var
   iKont: integer;
begin
   iZenbatPlus := 0;
   iZenbatMinus := 0;
   iZenbatZero := 0;
   for iKont:=iBEHEMUGA to iGOIMUGA do
   begin
      case aiZeta[iKont] of
         1: begin
               iZenbatPlus := iZenbatPlus + 1;
             end;   
        -1: begin
               iZenbatMinus := iZenbatMinus + 1;
             end;  
         0: iZenbatZero := iZenbatZero + 1;
      end;
   end;
end;


{ ------------------------- programa nagusia ------------------------- }
var
   aiX, aiY, aiZ: taiZenbakiak;
   iZenbatPlus, iZenbatMinus, iZenbatZero: integer;
begin
   clrscr;
   writeln('aiX eta aiY arrayen datuak aleatorioki hartuko dira');
   ArrayakAleatoriokiBete(aiX, aiY);
   writeln('aiX arrayaren edukia');
   ArrayaIkusi(aiX);
   writeln('aiY arrayaren edukia');
   ArrayaIkusi(aiY);
   writeln;
   	
   ArrayaLortu(aiX, aiY, aiZ);
   writeln('aiZ arrayaren edukia');
   ArrayaIkusi(aiZ);
   writeln;
   
   iZenbatPlus := fniKontatuZenbatPlus(aiZ);
   iZenbatMinus := fniKontatuZenbatMinus(aiZ);
   iZenbatZero := fniKontatuZenbatZero(aiZ);
   writeln('Hiru funtzioz...');
   writeln('Xi elementuak Yi elementuak baino handiago: ', iZenbatPlus, ' aldiz' );
   writeln('Xi elementuak Yi elementuak baino txikiago: ', iZenbatMinus, ' aldiz' );
   writeln('Xi elementuak eta Yi elementuak berdinak:   ', iZenbatZero, ' aldiz' );
   writeln;
   
   HiruKontaketakEgin(aiZ, iZenbatPlus, iZenbatMinus, iZenbatZero);
   writeln('Prozedura bakarraz...');
   writeln('Xi elementuak Yi elementuak baino handiago: ', iZenbatPlus, ' aldiz' );
   writeln('Xi elementuak Yi elementuak baino txikiago: ', iZenbatMinus, ' aldiz' );
   writeln('Xi elementuak eta Yi elementuak berdinak:   ', iZenbatZero, ' aldiz' );
   
   repeat until keypressed;
end.    { programaren amaiera }
 

2024(e)ko martxoaren 18(a), astelehena

Kontrola prestatzeko ariketa esanguratsuak

Bigarren kontrola prestatzeko ariketa esanguratsuak:

 

9. ASTEA | etxerako lana

 9. astea (2024/03/19) etxean egitekoa

 

9. ASTEA | laborategi/mintegian egin dena

 9. astea (2024/03/19) laborategi/mintegian egindakoa

  • Zerrenda pasatu dugu. Deitutako 25en artean 5 ez dira etorri (zehaztapen gehiago eGela zerbitzuan)
  • Saio honek bi zati izango ditu: kateak eta arrayak
 

2024(e)ko martxoaren 15(a), ostirala

8. astea | zenbait noten batezbesteko aritmetikoa

Zenbait ikasleren noten batezbesteko aritmetikoa kalkulatu behar da. Ikasle bakoitzaren nota, bere izena eta bere deiturarekin batera dator.

Ikasleen kopurua programaren hasieran irakurriko da, eta kopuru hori teklatuz ematean karaktere-kate bat erabiliko da. Horrela, kopurua onargarria dela ziurtatu ahalko da eta ondorioz exekuzio-denborako errorerik ez da gertatuko.

Ikaslearen datua ere, karaktere-kate bat izango da. Ikasle jakin baten datua den karaktere-katearen ezaugarriak:

  • Datuaren luzera maximoa 30 karaktere
  • Datuan izena, deitura eta nota daude
  • Notak hainbat zifra ditu eta edozein tokitan izan daitezke:
    1. Gutxienez zifra bat dago
    2. Lehen zifra unitatea da eta gainerakoak hamartarrak
    3. Zifrak ez dira zertan jarraian egon behar
    4. Suposatu notarik txikiena 0 dela eta handiena 9.999 dela
  • Letrak direla eta, izena deitura baino lehenago dago
  • Izena letra larriz hasten da eta gainerakoak minuskulak dira
  • Deitura letra larriz hasten da eta gainerakoak minuskulak dira

Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak eskuratu eta nota guztien batezbestekoa kalkulatu. Adibidez:

Eleo72norIz1a ------> 7.21
Peru6Sala8zar ------> 6.8
AmagoiaLaka5rra ----> 5
4RuyRuiz91 ---------> 4.91

(+7.21 +6.8 +5 +4.91) / 4 = 5.98


{
   Datuaren luzera maximoa 30 karaktere. Datuak banan banan aztertuz
   izena, deitura eta nota lortu. Nota guztien batezbestekoa kalkulatu.
   
   Programaren hasiera. Non ikasleen kopurua irakurtzen den eta for
   prozesu errepikakorrean DatuakBakandu() prozedurari deitzen zaion,
   azkenean noten batezbesteko aritmetikoa erakusten den.
}

program ZenbaitNotenBatezbestekoAritmetikoa_HASIERA;
type
   tsKate30 = string[30];

procedure DatuakBakandu(sIkaslea: tsKate30; var sIzena, sAbizena, sNota: tsKate30);
begin

end;

{-------------------------Programa Nagusia-------------------------}
var
   sZenbat, sIkaslea, sNota, sIzena, sAbizena: tsKate30;
   rNota, rBatukaria: real;
   iZenbatIkasle, iKont, iErroreaNon: integer;
begin
   writeln('//////////////////////////////////////');
   writeln;
   repeat
      write('Zenbat ikasle izango dira (adibidez 4): ');
      readln(sZenbat);
      val(sZenbat, iZenbatIkasle, iErroreaNon);
      if iErroreaNon <> 0 then
         writeln('Datu okerra ', iErroreaNon, '. posizioko karakterea onargarria ez delako.')
      else
        if iZenbatIkasle <= 0 then
           writeln('Ikasleen kopurua gutxienez 1 izan behar da.');
   until (iZenbatIkasle > 0) and (iErroreaNon = 0);
   
   rBatukaria := 0.0;
   for iKont:=1 to iZenbatIkasle do
   begin
   
      // DatuakBakandu(sIkaslea, sIzena, sAbizena, sNota);
   
   end;

   writeln;  
   writeln('Batezbestekoa = ', rBatukaria/iZenbatIkasle:0:3);

   writeln ;
   writeln('//////////////////////////////////////') ;
   readln ;
end.
Koloreen bitartez adierazten da pantailan idatzitakoa zein modulutik datorren
(handiago ikusteko irudiaren gainean klik egin)
{
   Zenbait ikasleren noten batezbesteko aritmetikoa kalkulatu behar da.
   Ikasle bakoitzaren nota, bere izena eta deiturarekin batera dator.
   
   Ikasleen kopurua programaren hasieran irakurriko da, eta kopuru hori
   teklatuz ematean karaktere-kate bat erabiliko da. Horrela, kopurua
   onargarria dela ziurtatu ahalko da eta ondorioz exekuzio-denborako
   errorerik ez da gertatuko.

   Ikasle jakin baten datua den karaktere-katearen ezaugarriak:

     - Datuaren luzera maximoa 30 karaktere
     - Datuan izena, deitura eta nota daude
     - Notak hainbat zifra ditu eta edozein tokitan izan daitezke:
         * Gutxienez zifra bat dago
         * Lehen zifra unitatea da eta gainerakoak hamartarrak
         * Zifrak ez dira zertan jarraian egon behar
         * Suposatu notarik txikiena 0 dela eta handiena 9.999 dela
     - Letrak direla eta, izena deitura baino lehenago dago
     - Izena letra larriz hasten da eta gainerakoak minuskulak dira
     - Deitura letra larriz hasten da eta gainerakoak minuskulak dira
        
   Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak
   eskuratu eta nota guztien batezbestekoa kalkulatu. Adibidez:
   
        Eleo72norIz1a     ------> 7.21
        Peru6Sala8zarc
        AmagoiaLaka5rra   ------> 5
        4RuyRuiz91        ------> 4.91
    
        (+7.21 +6.8 +5 +4.91)/4 = 5.98
}
 
program ZenbaitNotenBatezbestekoAritmetikoa;
uses
   crt;
   
type
   tsKate30 = string[30];

procedure IzenAbizen_Nota(sIkaslea: tsKate30; var sIzenAbizen, sNota: tsKate30);
var
   iKont: integer;
begin
   writeln('IzenAbizen_Nota() prozeduran ------------------------------');
   sNota := '';
   sIzenAbizen := '';
   for iKont:=1 to length(sIkaslea) do
   begin
      if (sIkaslea[iKont] >= '0') and (sIkaslea[iKont] <= '9') then
         sNota := sNota + sIkaslea[iKont]
      else
         sIzenAbizen := sIzenAbizen + sIkaslea[iKont];
   end;
   writeln('      sNota (', length(sNota):2, ' karaktere)   |', sNota, '|');
   writeln('sIzenAbizen (', length(sIzenAbizen):2, ' karaktere)   |', sIzenAbizen, '|');
   
   writeln('IzenAbizen_Nota() prozeduraren amaiaera -------------------');
end;
   
   
procedure Izen_Abizen(sIzenAbizen: tsKate30; var sIzena, sAbizena: tsKate30);
var
   iKont, iHasieraNon: integer;
begin
   writeln('Izen_Abizen() prozeduran ----------------------------------');
   
   iHasieraNon := 2;
   iKont := 2;
   while sIzenAbizen[iKont] > 'Z' do
   begin
      writeln(iKont:2, '.  ---> ', sIzenAbizen[iKont]);
      iKont := iKont + 1;
   end;
   iHasieraNon := iKont;
   
   writeln('Deituraren hasierako posizioa ', iHasieraNon, ' da');   
    
   sIzena := copy(sIzenAbizen, 1, iHasieraNon-1); 
   sAbizena := copy(sIzenAbizen, iHasieraNon, length(sIzenAbizen)-iHasieraNon+1);
   
   writeln('  sIzena (', length(sIzena):2, ' karaktere)   |', sIzena, '|');
   writeln('sAbizena (', length(sAbizena):2, ' karaktere)   |', sAbizena, '|');
   
   writeln('Izen_Abizen() prozeduraren amaiaera -----------------------');
end;
   
   
procedure DatuakBakandu(sIkaslea: tsKate30; var sIzena, sAbizena, sNota: tsKate30);
var
   iZenbatZifra: integer;
   sIzenAbizen: tsKate30;
begin
   textcolor(Cyan);
   writeln('DatuakBakandu() prozeduran --------------------------------');
   
   textcolor(Yellow);
   IzenAbizen_Nota(sIkaslea, sIzenAbizen, sNota);
   
   iZenbatZifra := length(sNota);
   if iZenbatZifra > 1 then
      insert('.', sNota, 2);
   
   textcolor(Magenta);
   Izen_Abizen(sIzenAbizen, sIzena, sAbizena);
   
   textcolor(Cyan);
   writeln('sIzena   (', length(sIzenA):2, ' karaktere)   |', sIzena, '|');
   writeln('sAbizena (', length(sAbizena):2, ' karaktere)   |', sAbizena, '|');
   writeln('sNota    (', length(sNota):2, ' karaktere)   |', sNota, '|');
   
   writeln('DatuakBakandu() prozeduraren amaiaera ---------------------');
   textcolor(LightGray);
end;
   
   
{-------------------------Programa Nagusia-------------------------}
var
   sZenbat, sIkaslea, sNota, sIzena, sAbizena: tsKate30;
   rNota, rBatukaria: real;
   iZenbatIkasle, iKont, iErroreaNon: integer;
begin
   writeln('//////////////////////////////////////');
   writeln;
   repeat
      write('Zenbat ikasle izango dira (adibidez 4): ');
      readln(sZenbat);
      val(sZenbat, iZenbatIkasle, iErroreaNon);
      if iErroreaNon <> 0 then
         writeln('Datu okerra ', iErroreaNon, '. posizioko karakterea onargarria ez delako.')
      else
        if iZenbatIkasle <= 0 then
           writeln('Ikasleen kopurua gutxienez 1 izan behar da.');
   until (iZenbatIkasle > 0) and (iErroreaNon = 0);
   
   rBatukaria := 0.0;
   for iKont:=1 to iZenbatIkasle do
   begin
      writeln;
      write(iKont, '. ikaslearen datuak (adibidez: Eleo72norIz1a): '); 
      readln(sIkaslea);
   
      writeln;
      writeln('datua ==>', sIkaslea, '<==');
      
      DatuakBakandu(sIkaslea, sIzena, sAbizena, sNota);
      
      writeln(iKont:2, '. ikaslea (kateak)    >>>  |', sIzena,'|   |', sAbizena,'|   |', sNota,'|');
      val(sNota, rNota, iErroreaNon);
      writeln(iKont:2, '. ikaslea (zenbakiak) >>>  rNota = ', rNota:0:3, '   iErroreaNon = ', iErroreaNon);
      
      rBatukaria := rBatukaria + rNota; 
   end;
     
   writeln;  
   writeln('Batezbestekoa = ', rBatukaria/iZenbatIkasle:0:3);
    
   writeln;
   writeln('//////////////////////////////////////');
   repeat until keypressed;
end.


Datuen eredua itxiagoa denean programa errazagoa izango da. Esate baterako, zifren kopurua ezaguna denean eta haien posizioak finkoak direnean, edo/eta izena eta abizena banatzeko karaktere jakin bat erabiltzen denean.

{
   Zenbait ikasleren noten batezbesteko aritmetikoa kalkulatu behar da.
   Ikasle bakoitzaren nota, bere izena eta deiturarekin batera dator.
   
   Ikasleen kopurua programaren hasieran irakurriko da, eta kopuru hori
   teklatuz ematean karaktere-kate bat erabiliko da. Horrela, kopurua
   onargarria dela ziurtatu ahalko da eta ondorioz exekuzio-denborako
   errorerik ez da gertatuko.

   Ikasle jakin baten datua den karaktere-katearen ezaugarriak:

     - Datuaren luzera maximoa 30 karaktere
     - Datuan izena, deitura eta nota daude
     - Izena eta abizena '_' karakterez banaturik daude
     - Notak 3 zifra ditu:
         * Lehen posizioko karakterea zifra bat da eta unitatea adierazten du
         * Azkenaurreko karakterea zifra bat da eta hamarrekoa adierazten du
         * Azkeneko karakterea zifra bat da eta ehunekoa adierazten du
     - Izenak hainbat karaktere ditu:
         * Bigarren posizioko karakterea izenaren hasiera da
         * '_' karakterearen aurrekoa izenaren azken karakterea da
     - Abizenak hainbat karaktere ditu:
         * '_' karakterearen hurrengoa abizenaren hasiera da
         * Notaren hamarreko karakterearen aurrekoa abizenaren azkena da
        
   Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak
   eskuratu eta nota guztien batezbestekoa kalkulatu. Adibidez:
   
        7ana_iza21        ------> 7.21
        8Peru_SalaZar69   ------> 8.69
        3AMAIA_ORBE57     ------> 3.57
        4Ruy_Ruiz93       ------> 4.93
    
        (+7.21 +8.62 +3.57 +4.91)/4 = 6.10
}
 
program ZifraIzena_AbizenaZifrak;
uses
   crt;
   
type
   tsKate30 = string[30];
   
   
procedure DatuakBakandu(sIkaslea: tsKate30; var sIzena, sAbizena, sNota: tsKate30);
var
   iAzpimarraNon: integer;
begin
   writeln('DatuakBakandu() prozeduran ---------------------------------');
   
   sNota := sIkaslea[1] + '.' + sIkaslea[length(sIkaslea)-1] + sIkaslea[length(sIkaslea)];
   
   iAzpimarraNon := pos('_', sIkaslea);
   sIzena := copy(sIkaslea, 2, iAzpimarraNon-2);
   sAbizena := copy(sIkaslea, iAzpimarraNon+1, length(sIkaslea)-iAzpimarraNon-2);
   
   writeln('sIzena   (', length(sIzenA):2, ' karaktere)   |', sIzena, '|');
   writeln('sAbizena (', length(sAbizena):2, ' karaktere)   |', sAbizena, '|');
   writeln('sNota    (', length(sNota):2, ' karaktere)   |', sNota, '|');
   
   writeln('DatuakBakandu() prozeduraren amaiaera ----------------------');
end;
   
   
{-------------------------Programa Nagusia-------------------------}
var
   sZenbat, sIkaslea, sNota, sIzena, sAbizena: tsKate30;
   rNota, rBatukaria: real;
   iZenbatIkasle, iKont, iErroreaNon: integer;
begin
   writeln('//////////////////////////////////////');
   writeln;
   repeat
      write('Zenbat ikasle izango dira (adibidez 4): ');
      readln(sZenbat);
      val(sZenbat, iZenbatIkasle, iErroreaNon);
      if iErroreaNon <> 0 then
         writeln('Datu okerra ', iErroreaNon, '. posizioko karakterea onargarria ez delako.')
      else
        if iZenbatIkasle <= 0 then
           writeln('Ikasleen kopurua gutxienez 1 izan behar da.');
   until (iZenbatIkasle > 0) and (iErroreaNon = 0);
   
   rBatukaria := 0.0;
   for iKont:=1 to iZenbatIkasle do
   begin
      writeln;
      write(iKont, '. ikaslearen datuak (adibidez: 7ana_iza21): '); 
      readln(sIkaslea);
   
      writeln;
      writeln('datua ==>', sIkaslea, '<==');
      
      DatuakBakandu(sIkaslea, sIzena, sAbizena, sNota);
      
      writeln(iKont:2, '. ikaslea (kateak)    >>>  |', sIzena,'|   |', sAbizena,'|   |', sNota,'|');
      val(sNota, rNota, iErroreaNon);
      writeln(iKont:2, '. ikaslea (zenbakiak) >>>  rNota = ', rNota:0:3, '   iErroreaNon = ', iErroreaNon);
      
      rBatukaria := rBatukaria + rNota; 
   end;
     
   writeln;  
   writeln('Batezbestekoa = ', rBatukaria/iZenbatIkasle:0:3);
    
   writeln;
   writeln('//////////////////////////////////////');
   repeat until keypressed;
end.
 

2024(e)ko martxoaren 11(a), astelehena

8. ASTEA | etxerako lana

 8. astea (2024/03/12) etxean egitekoa


Autoebaluazioa Azp-1: menu bat azpiprogramaz (kateak)

Aurreko astean eskatutako 7. astea | menu bat azpiprogramaz ariketa eredutzar harturik, antzekoa den beste hau egizu: Autoebaluazioa Azp-1: menu bat azpiprogramaz (kateak). Programa berria gidatzeko menu bat programatu beharra dago, aukerak hauek direla:

                                MENUA

        M  Maiuskulak eta minuskulak
        D   Katea pantailaratu diagonalki
        B   Bi noten batezbestekoa aritmetikoa
        H   Hainbat noten batezbestekoa aritmetikoa      

         I   Irten          

                           Zure aukera: __

Aukera guztiak azpiprograma banatan programatu, eta eskatzen diren aukera bakoitzaren kodea hemendik har daiteke 8. astea | kateen adibideak:
 

8. ASTEA | laborategi/mintegian egin dena

 8. astea (2024/03/12) laborategi/mintegian egindakoa

  • Zerrenda pasatu dugu. Deitutako 25en artean 6 ez dira etorri (zehaztapen gehiago eGela zerbitzuan)