2024(e)ko apirilaren 4(a), osteguna

11. astea | erregistroen bektore baten elementuak ezabatu

 Elementuak ezabatu bi algoritmo desberdinez

Ikasleen informazioa biltzen duen bektore bat daukagu. Ikasle bakoitzaren informazioa izena eta adina dira.

Ikasleen izenak ez dira errepikatzen eta horregatik BektoreaDatuzBete prozedurak fniIkasleaBilatu funtzioa darabil konprobatzeko onartuko duen ikaslea benetan berria den.

Bektorea datuz horniturik dagoenen bi ezabaketa egiten dira:

  1. Ikasle baten izenaren hasiera A bada, ikasle hori zerrendatik kenduko da (ez da array laguntzailerik erabiltzen)
  2. Ikasle bat gaztea denean, bere adina mediatik behera dagoelako, ikasle hori zerrendatik kenduko da (array laguntzaile bat erabiltzen da)

Bukatu aurretik ikasle berri baten datuak zerrendara eramaten dira. Lehenik tokirik dagoela konprobatzen da, gero ikasle berriaren posizioa zein den eskatzen da eta, azkenean, ikasle berriaren datuak jaso ondoren, erregistro hori dagokion posizioan zerrendan txertatzen da (desberdinduz benetako txertaketa den ala gehiketa den).


Ariketaren balizko kodea ikusi:

program IzenakEtaAdinakKendu;
const
   BEHEMUGA = 1;
   GOIMUGA = 25;
  
type
   tsKatea = string[15];
   trdIkaslea = record
                   sIzena: tsKatea;
                   iAdina: integer;
                end;
   tardZerrenda = array[BEHEMUGA..GOIMUGA] of trdIkaslea;
  
  
function fniIkasleaBilatu(const ardIkasgela: tardZerrenda; 
                                    iLuzera: integer;
                                     sGakoa: tsKatea): integer;
var
   k: integer;
   boAurkitua: boolean;
begin
   k := BEHEMUGA;
   boAurkitua := FALSE;
   while (k <= iLuzera) and not boAurkitua do
   begin
      if UpCase(ardIkasgela[k].sIzena) = UpCase(sGakoa) then
        boAurkitua := TRUE
      else
        k := k+1;
   end;
 
   if boAurkitua then
     fniIkasleaBilatu := k
   else
     fniIkasleaBilatu := -1;    { -1 gezurrezko posizioa litzateke }
end;
 
  
procedure BektoreaDatuDesberdinezBete(var ardIkasgela: tardZerrenda;
                                          var iLuzera: integer);
var
    k, iPosizioa: integer;
    sNor: tsKatea;
begin
   repeat
      write('Ikasleen kopurua eman: ');
      readln(iLuzera);
   until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA);
   
   writeln;
   writeln('Lehen ikaslearen izena berria delako ez dago errepikaturik...');
   writeln;
     
   write('Eman ', BEHEMUGA, '. ikaslearen izena: ');
   readln(ardIkasgela[BEHEMUGA].sIzena);
   write('Eman ', BEHEMUGA, '. ikaslearen adina: ');
   readln(ardIkasgela[BEHEMUGA].iAdina);
   
   writeln;
   writeln('Gainerako ikaslen izenak ez dira errepikatzen...');
   writeln;
   for k:=BEHEMUGA+1 to iLuzera do
   begin
      repeat
         write('Eman ', k, '. ikaslearen izena: ');
         readln(sNor);
         iPosizioa := fniIkasleaBilatu(ardIkasgela, k-1, sNor);
         if iPosizioa <> -1 then
            writeln('"',sNor, '" izeneko ikaslerik badago ', iPosizioa, '. posizioan');
      until iPosizioa = -1;
        
      ardIkasgela[k].sIzena := sNor;
      write('Eman ', k, '. ikaslearen adina: ');
      readln(ardIkasgela[k].iAdina);
      writeln;
   end;
end;
  
  
procedure BektorearenEdukiaIkusi(const ardIkasgela: tardZerrenda;
                                           iLuzera: integer);
var
    k: integer;
begin
   for k:=BEHEMUGA to iLuzera do
   begin
      write(k, '. ikaslea: ', ardIkasgela[k].sIzena:15);
      writeln(ardIkasgela[k].iAdina:20, ' urte');
   end;
end;
  
 
procedure ElementuBatEzabatu(var ardIkasgela: tardZerrenda;
                                 var iLuzera: integer;
                                           k: integer);
var
   iIndizea: integer;
begin
   for iIndizea:=k to iLuzera-1 do
   begin
      ardIkasgela[iIndizea] := ardIkasgela[iIndizea+1];
   end;
   iLuzera := iLuzera - 1;
end;
  
  
function fnboIzenarenHasiera_A_Da(const rdIkasleBat: trdIkaslea): boolean;
begin 
   if (rdIkasleBat.sIzena[1] = 'A') OR
      (rdIkasleBat.sIzena[1] = 'a') then
      fnboIzenarenHasiera_A_Da := TRUE
   else
      fnboIzenarenHasiera_A_Da := FALSE;
end;
  
 
function fnrBatezbestekoaKalkulatu(const ardIkasgela: tardZerrenda;
                                             iLuzera: integer): real;
var
    k: integer;
    rMetagailua: real;
begin
   rMetagailua := 0.0;
   for k:=BEHEMUGA to iLuzera do
   begin
      rMetagailua := rMetagailua + ardIkasgela[k].iAdina;
   end;
    
   fnrBatezbestekoaKalkulatu := rMetagailua/iLuzera;
end;
 
  
procedure IkasleGazteakEzabatu(var ardIkasgela: tardZerrenda;
                                   var iLuzera: integer;
                                rBatezBestekoa: real);
var
   ardLaguntzailea: tardZerrenda;
   iZenbatIkasle, k: integer;
begin
   iZenbatIkasle := 0;
   for k:=BEHEMUGA to iLuzera do
   begin
      if ardIkasgela[k].iAdina >= rBatezBestekoa then
      begin
         iZenbatIkasle := iZenbatIkasle + 1;
         ardLaguntzailea[iZenbatIkasle] := ardIkasgela[k];
      end;
   end;
 
   ardIkasgela := ardLaguntzailea;
   iLuzera := iZenbatIkasle;
end;


procedure IkasleBatenDatuakJaso(var rdIkasleBat: trdIkaslea);
begin
   write('Eman ikaslearen izena: ');
   readln(rdIkasleBat.sIzena);
   write('Eman ikaslearen adina: ');
   readln(rdIkasleBat.iAdina);
end;


procedure IkasleBatTxertatu(var ardIkasgela: tardZerrenda;
                                var iLuzera: integer;
                            const rdIkaslea: trdIkaslea;
                                       iNon: integer);
var
   k: integer;
begin
   for k:=iLuzera downto iNon do
   begin
      ardIkasgela[k+1] := ardIkasgela[k];
   end;
   ardIkasgela[iNon] := rdIkaslea;
   iLuzera := iLuzera + 1;
end;


{=============Programa nagusia eta programa nagusiko aldagaiak=============}
var
   ardIkasgela: tardZerrenda;
   iLuzera, k: integer;
   rBatezBestekoa: real;
   iNon: integer;
   rdIkasleBerria: trdIkaslea;
begin
   writeln('------------------------------------------------');
   writeln;
   BektoreaDatuDesberdinezBete(ardIkasgela, iLuzera);
   writeln;
   BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
 
   k := BEHEMUGA;            (* for k:=BEHEMUGA to iLuzera do *)
   while k <= iLuzera do     (* txarto egongo litzateke       *)
   begin
      if fnboIzenarenHasiera_A_Da(ardIkasgela[k]) then
         ElementuBatEzabatu(ardIkasgela, iLuzera, k)
      else
         k := k+1;
   end;
  
   writeln;
   writeln('Izenaren hasiera A denean ikasleak zerrendatik kendu ostean:');
   BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
  
   writeln;
   rBatezBestekoa := fnrBatezbestekoaKalkulatu(ardIkasgela, iLuzera);
   writeln('BatezBestekoa = ', rBatezBestekoa:0:3);
   
   IkasleGazteakEzabatu(ardIkasgela, iLuzera, rBatezBestekoa);
   
   writeln('Mediatik beherako adina duten ikasleak zerrendatik kendu ostean:');
   BektorearenEdukiaIkusi(ardIkasgela, iLuzera);  
   
   writeln;
   writeln('Ikasle berri baten datuak zerrendan gorde:');
   if iLuzera < GOIMUGA then
   begin
      repeat
         write('Eman ikasle berriaren posizioa zerrendan (');
         write(BEHEMUGA, ' eta ', iLuzera+1, ') artekoa: ');
         readln(iNon);
      until (iNon >= BEHEMUGA) and (iNon <= iLuzera+1);
      
      IkasleBatenDatuakJaso(rdIkasleBerria);
      if iNon = iLuzera+1 then    { txertaketa baino gehiago gehiketa da }
      begin
         ardIkasgela[iNon] := rdIkasleBerria;
         iLuzera := iLuzera+1;
      end
      else                        { elementu berri baten txertaketa }
      begin
         IkasleBatTxertatu(ardIkasgela, iLuzera, rdIkasleBerria, iNon);
      end;
      BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
   end
   else
   begin
      writeln('Zerrenda beterik dago, ezin da ikasle berririk sartu.');
   end;

   writeln;
   writeln;
   writeln('Amaituta!----------------------------------------');
   readln;
end. { Programaren bukaera }
 

iruzkinik ez:

Argitaratu iruzkina

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