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

10. astea | bi array paralelo


Array batean ikasleen izenak ditugu eta beste array batean ikasleen notak gorderik daude. asIzenak arraya karaktere-kateak biltegitzen ditu, eta arNotak arrayak zenbaki errealak jasoko ditu. 

Array biren arteko lotura posizioetan datza, hau da, array baten lehen posizioko informazioa elkarturik dago beste arrrayaren lehen posizioko informazioarekin, eta horrela posizio guztiekin. Noski, luzera efektiboa bera delako, array bientzat lan egiten duen iLuzera aldagai bakarra erabiliko dugu. 

Adibidez:
     asIzenak 
1   'Klara' 
2    'Pedro'  
3    'Igone'  
4
 
...
 
40  
                iLuzera=3


     arNotak 
1   6.77 
2     4.35  
3    9.25  
4
 
...
 
40  

Hona hemen iturburu-programa, aurrexeago erregistroak ikastean array bakarra erabiliko dugu:

program BiArrayParalelo ;
const
  BEHEMUGA = 1 ;
  GOIMUGA = 40 ;
type
   tarNotak = array[BEHEMUGA..GOIMUGA] of real ;
   tsKatea = string[30] ;
   tasIzenak = array[BEHEMUGA..GOIMUGA] of tsKatea ;


procedure IzenakLortu(var asIzenak: tasIzenak; var iLuzera: integer) ;
var
   iIndizea: integer ;
begin
   repeat
      write('Zenbat ikasle dira? ') ;
      readln(iLuzera) ;
   until (iluzera >= BEHEMUGA) and (iLuzera <= GOIMUGA) ;   

   writeln ('Izenen arrayan ', iLuzera, ' datu gordetzen') ;
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      write('Eman ', iIndizea, '. izena: ') ;
      readln(asIzenak[iIndizea]) ;
   end ;
   writeln ;
end ;


procedure NotakLortu(var arNotak: tarNotak; iLuzera: integer) ;
var
   iIndizea: integer ;
begin
   writeln ('Noten arrayan ', iLuzera, ' datu gordetzen') ;
   randomize ;
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      arNotak[iIndizea] := random*10 ;      { 0.0 eta 9.999 arteko balioak }
   end ;
end ;


procedure IzenakIkusi(const asIzenak: tasIzenak; iLuzera: integer) ;
var
   iIndizea: integer ;
begin
   writeln('Izenen arrayaren edukia: ') ;
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      writeln(iIndizea:2, '. ikaslea = ', asIzenak[iIndizea]) ;
   end ;
end ;


procedure NotakIkusi(const arNotak: tarNotak; iLuzera: integer) ;
var
   iIndizea: integer ;
begin
   writeln('Noten arrayaren edukia: ') ;
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      writeln(iIndizea:2, '. nota = ', arNotak[iIndizea]:0:3) ;
   end ;
end ;


procedure NotakInkrementatu(var arNotak: tarNotak; iLuzera: integer) ;
var
   iIndizea: integer ;
begin
   writeln('Suspendituak inkrementatzen: ') ;
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      if arNotak[iIndizea] < 5.0 then
      begin
         arNotak[iIndizea] := arNotak[iIndizea] + 1.0 ;
      end ;
   end ;
end ;


function fniIkasleaBilatu(const asIzenak: tasIzenak;
                                 iLuzera: integer;
                                  sGakoa: tsKatea): integer ;
var
   iIndizea: integer ;
   boAurkitua: Boolean ;
begin
   iIndizea := BEHEMUGA ;
   boAurkitua := FALSE ;
   while (iIndizea <= iLuzera) and not boAurkitua do
   begin
      if asIzenak[iIndizea] = sGakoa then
        boAurkitua := TRUE
      else
        iIndizea := iIndizea + 1 ;
   end ;

   if boAurkitua then
     fniIkasleaBilatu := iIndizea
   else
     fniIkasleaBilatu := -1 ;    { -1 gezurrezko posizioa litzateke }
end ;

(* ---------------------- PROGRAMA NAGUSIA ---------------------- *)

var
   arNotak  : tarNotak ;
   asIzenak : tasIzenak;
   iLuzera  : integer ;
   sGakoa   : tsKatea ;
   iPosizioa: integer ;
begin
   writeln ;
   writeln ;
   
   IzenakLortu(asIzenak, iLuzera) ;
   IzenakIkusi(asIzenak, iLuzera) ;
   writeln ;
      
   NotakLortu(arNotak, iLuzera) ;
   NotakIkusi(arNotak, iLuzera) ;   
   writeln ;
   
   writeln('Suspendituen notak inkrementatu') ;
   NotakInkrementatu(arNotak, iLuzera) ;
   NotakIkusi(arNotak, iLuzera) ;   
   writeln ;
   
   writeln('Ikasle baten nota aldatu') ;
   write('Ikaslearen izena eman: ') ;
   readln(sGakoa) ;
   
   iPosizioa := fniIkasleaBilatu(asIzenak, iLuzera, sGakoa) ;
   
   if iPosizioa = -1 then
      writeln(sGakoa, ' izena duen ikaslerik ez dago') 
   else 
   begin
      write(asIzenak[iPosizioa], ' ikaslearen nota berria eman: ') ;
      readln(arNotak[iPosizioa]);       
      writeln;                    (* asIzenak[iPosizioa] edo sGakoa *)
      writeln('Datuak "', asIzenak[iPosizioa], '" ikaslearen nota aldatu ondoren') ;
      NotakIkusi(arNotak, iLuzera) ;
   end ;
   
   readln ;
end.
 

iruzkinik ez:

Argitaratu iruzkina

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