![]() |
| 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.