2024(e)ko martxoaren 20(a), asteazkena

10. astea | hainbat txertaketa array batean

Array laguntzaile bat erabiliko dugu

Txertaketa array batean algoritmoari esker, posizio jakin batean elementu berri bat tartekatzen da arrayean (beti ere tokirik balego arrayean), baina algoritmo hori zaila bihurtzen da elementu bat baino gehiago txertatu behar direnean. Array bateko zenbait elementu txertatzeko algoritmo hau erabiliko dugu: 07a_HainbatTxertaketa.pas non zenbat elementu berri eta non sartuko diren teklatuz emaniko datuak diren:

(* Bektore laguntzaile bat erabiltzen da emaitza eskuratzeko. Benetan  *)
(* algoritmo hau ez da ezabaketa bat arraya zatika prozesatzea baizik. *)
program HainbatTxertaketaArrayetan_A; (* HainbatTxertaketaArrayLaguntzailez *)
const
   BEHEMUGA = 1;
   GOIMUGA = 20;
type
   tarZerrenda = array[BEHEMUGA..GOIMUGA] of real;

   
procedure ArrayaBete(var arNotak: tarZerrenda;
                     var iLuzera: integer);
var
   iIndizea: integer;
begin
   randomize;
   iLuzera := random(GOIMUGA) + 1;
   
   writeln('arrayan ', iLuzera, ' datu gordetzen');
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      arNotak[iIndizea] := 10*random;      { 0.00 eta 9.99 arteko balioak }
   end;
end;


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


procedure HainbatTartekaketa(var arNotak: tarZerrenda;
                             var iLuzera: integer;
                                 iNondik: integer;
                                 iZenbat: integer);
var
   iIndizea: integer;
   arBerriak: tarZerrenda;
   arLaguntzailea: tarZerrenda;
   iLuzeraLagun: integer;
begin
   for iIndizea:=1 to iZenbat do
   begin
      write('Eman sortaren ', iIndizea, '. zenbaki berriaren balioa: ');
      readln(arBerriak[iIndizea]);
   end;
   
   iLuzeraLagun := 0;
   for iIndizea:=1 to iNondik-1 do
   begin
      iLuzeraLagun := iLuzeraLagun + 1;
      arLaguntzailea[iLuzeraLagun] := arNotak[iIndizea];
   end;
   
   for iIndizea:=1 to iZenbat do
   begin
      iLuzeraLagun := iLuzeraLagun + 1;
      arLaguntzailea[iLuzeraLagun] := arBerriak[iIndizea];
   end;
   
   for iIndizea:=iNondik to iLuzera do
   begin
      iLuzeraLagun := iLuzeraLagun + 1;
      arLaguntzailea[iLuzeraLagun] := arNotak[iIndizea];
   end;
   
   arNotak := arLaguntzailea;
   iLuzera := iLuzeraLagun;
end;


{ ---------------------- PROGRAMA NAGUSIA ---------------------- }

var
   arNotak: tarZerrenda;
   iLuzera, iZenbat, iNondik: integer;
begin
   writeln;
   ArrayaBete(arNotak, iLuzera);
   ArrayaIkusi(arNotak, iLuzera);
   
   repeat
      write('Eman zenbat nota berri txertatuko diren: ');
      readln(iZenbat);
      if iZenbat > GOIMUGA-iLuzera then
         writeln('arrayan gehienez ', GOIMUGA-iLuzera, ' elementu berri txerta daitezke.');
   until (iZenbat >= 1) and (iZenbat <= GOIMUGA-iLuzera);
   
   repeat
      write('Zenbaki berrien sortaren hasierako posizioa arrayan: ');
      readln(iNondik);
      if (iNondik < BEHEMUGA) or (iNondik > iLuzera+1) then
         writeln('hasierako posizioa ', BEHEMUGA, ' eta ', iLuzera+1, ' artekoa izan dadila.'); 
   until (iNondik >= BEHEMUGA) and (iNondik <= iLuzera+1);
      
   HainbatTartekaketa(arNotak, iLuzera, iNondik, iZenbat);
   ArrayaIkusi(arNotak, iLuzera);
    
   readln;
end.


Algoritmo honek aurrekoak bezala emaitza bera eskaintzen du, baina zailagoa delakoan gaude.

(* Azken emaitza eskuratzeko, bektore laguntzailerik ez da erabiltzen.         *)
(* Txertatu beharreko elementuak banan banan sartzen dira, akzioa errepikatuz. *)
program HainbatTxertaketaArrayetan_B; (* HainbatTxertaketaArrayLaguntzailerikGabe *)
const
   BEHEMUGA = 1;
   GOIMUGA = 20;
type
   tarZerrenda = array[BEHEMUGA..GOIMUGA] of real;

   
procedure ArrayaBete(var arNotak: tarZerrenda;
                     var iLuzera: integer);
var
   iIndizea: integer;
begin
   randomize;
   iLuzera := random(GOIMUGA) + 1;
   
   writeln('arrayan ', iLuzera, ' datu gordetzen');
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      arNotak[iIndizea] := 10*random;      { 0.00 eta 9.99 arteko balioak }
   end;
end;


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


procedure BatTartekakatu(var arNotak: tarZerrenda;
                         var iLuzera: integer;
                          rElementua: real;
                                iNon: integer);
var
   iIndizea: integer;
begin
   for iIndizea:=iLuzera downto iNon do
   begin
      arNotak[iIndizea+1] := arNotak[iIndizea];
   end;
   arNotak[iNon] := rElementua;
   iLuzera := iLuzera + 1;
end;


procedure HainbatTartekaketa(var arNotak: tarZerrenda;
                             var iLuzera: integer;
                                 iNondik: integer;
                                 iZenbat: integer);
var
   iIndizea, iNon: integer;
   rElementuBerria: real;
begin
   iNon := iNondik;
   for iIndizea:=1 to iZenbat do
   begin
      write('Eman sortaren ', iIndizea, '. zenbaki berriaren balioa: ');
      readln(rElementuBerria);
      BatTartekakatu(arNotak, iLuzera, rElementuBerria, iNon);
      iNon := iNon + 1;
   end;
end;


{ ---------------------- PROGRAMA NAGUSIA ---------------------- }

var
   arNotak: tarZerrenda;
   iLuzera, iZenbat, iNondik: integer;
begin
   writeln;
   ArrayaBete(arNotak, iLuzera);
   ArrayaIkusi(arNotak, iLuzera);
   
   repeat
      write('Eman zenbat nota berri txertatuko diren: ');
      readln(iZenbat);
      if iZenbat > GOIMUGA-iLuzera then
         writeln('arrayan gehienez ', GOIMUGA-iLuzera, ' elementu berri txerta daitezke.');
   until (iZenbat >= 1) and (iZenbat <= GOIMUGA-iLuzera);
   
   repeat
      write('Zenbaki berrien sortaren hasierako posizioa arrayan: ');
      readln(iNondik);
      if (iNondik < BEHEMUGA) or (iNondik > iLuzera+1) then
         writeln('hasierako posizioa ', BEHEMUGA, ' eta ', iLuzera+1, ' artekoa izan dadila.');
      
   until (iNondik >= BEHEMUGA) and (iNondik <= iLuzera+1);
      
   HainbatTartekaketa(arNotak, iLuzera, iNondik, iZenbat);
   ArrayaIkusi(arNotak, iLuzera);
    
   readln;
end.  
 

iruzkinik ez:

Argitaratu iruzkina

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