2023(e)ko apirilaren 4(a), asteartea

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.







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 BektoreaDatuzBete(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('Ikaslen izenak ez dira errepikatzen') ;
writeln ;

for k:=BEHEMUGA to iLuzera do
begin
repeat
write('Eman ', k, '. ikaslearen izena: ') ;
readln(sNor) ;
iPosizioa := fniIkasleaBilatu(ardIkasgela, iLuzera, 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) ;
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 ;
BektoreaDatuzBete(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, ') artekoa: ') ;
readln(iNon) ;
until (iNon >= BEHEMUGA) and (iNon <= iLuzera) ;

IkasleBatenDatuakJaso(rdIkasleBerria) ;
IkasleBatTxertatu(ardIkasgela, iLuzera, rdIkasleBerria, iNon) ;
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