kaosa sortzen |
Ariketa honen algoritmoa 11. astean ikusitako kaosa sortzen (array ordenatu bat desordenatzen) ariketan programatu zen berbera da. Orduan informazioa erregistroen array batean zegoen, eta orain erregistroen fitxategi batean.
Erregistroen fitxategi bat daukagu. Erregistroak hiru eremuz osaturik daude: kate bat, zenbaki oso bat eta zenbaki erreal bat. Erregistroen fitxategiaren datu batzuk konstante array batetik hartzen dira. Honako hau da erregistroen fitxategiaren datu-mota:
const
iKOPURUMAX = 15;
type
tsKate49 = string[49];
trdFitxa = record
sIzenDeiturak: tsKate49;
byDeialdia: byte; (* osoa, txikia eta positiboa *)
rNota: real;
end ;
tfrdFitxategi = file of trdFitxa ;
asIZENAK array konstantea da eta horretaz oinarriturik balioak hartuko ditu fitxategiak. Datuen asIZENAK array konstantea alfabetikoki ordenaturik dagoenez, fitxategia ordenaturik egongo da ere. Fitxategia desordenatzeko ardIkasleak eta ardKaotikoak array laguntzaileak erabiliko dira.
Fitxategiaren edukia ardIkasleak arrayra igaro ondoren, nahasketa burutzen da ardKaotikoak arraya lortzeko. Behin ardKaotikoak arraya daukagula, bere edukia berriro fitxategian gordetzen da. Arrayaren nahasketa ZerrendaNahastu izeneko prozeduran burutzen da eta horretarako datu-mota berezi pare bat sortuko dugu, trdLaguntzaile erregistroa eta tardLaguntzaile arraya. Programaren gainerako tokietan erabilpenik ez dutenez, datu-mota espezifiko horiek ZerrendaNahastu prozedura barruan sortzen dira:
{ bi datu-mota berri sortzen dira, soilik prozedura honetan erabiliko direnak }
procedure ZerrendaNahastu(const ardIkasleak: tardIkasleak;
iLuzera: integer;
var ardKaotikoak: tardIkasleak);
type
trdLaguntzaile = record
rdIkaslea: trdFitxa;
boGordeta: boolean;
end;
tardLaguntzaile = array[1..iKOPURUMAX] of trdLaguntzaile;
var
ardLaguntzailea: tardLaguntzaile;
...
Fitxategi ordenatu bat desordenatzen duen programa hau izan daiteke:
program KaosaSortzenFitxategiBatean;
uses
crt;
const
iZENBATIKASLE = 12;
type
tsKate49 = string[49];
tasIzenenZerrenda = array[1..iZENBATIKASLE] of tsKate49;
tarNotenZerrenda = array[1..iZENBATIKASLE] of real;
const
asIZENAK: tasIzenenZerrenda = ('AGIRRE ROMERO, UNAI', // 01
'ANGULEMA CARAZO, JON ANDER', // 02
'BIKARREGI IGLESIAS, JULEN', // 03
'CANO RUIZ DE HEREDIA, JULIAN', // 04
'CORRAL EGIA, JOSEBA ANDONI', // 05
'DIAZ DE ULZURRUN, ROY, LEONOR', // 06
'EGIGUREN MARKINEZ, IRUNE', // 07
'ERKIAGA ANDONEGI, IKER', // 08
'FERNANDEZ FEITO, FELIX', // 09
'GARTZIA DE ALZA GIL, KATALIN', // 10
'HERRANZ MARTINEZ, REBECA', // 11
'IRAGORRI COTANO, MARTIN'); // 12
const
arNOTAK: tarNotenZerrenda = (4.6, // 01
3.2, // 02
5.7, // 03
4.8, // 04
5.1, // 05
6.1, // 06
7.3, // 07
7.6, // 08
2.8, // 09
9.2, // 10
2.9, // 11
8.5); // 12
type
trdIkasle = record
sNor: tsKate49;
rNota: real;
end;
tardIkasleak = array[1..iZENBATIKASLE] of trdIkasle;
tsKateLuze = string[199];
tfrdFitxategi = file of trdIkasle;
{ ikasleen izenak eta notak array konstanteetan daude }
procedure FitxategiaSortuEtaBete(sFitxIzen: tsKateLuze; iLuzera: integer);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
k: integer;
begin
assign(f, sFitxIzen);
rewrite(f);
for k:=1 to iLuzera do
begin
rdIkasleBat.sNor := asIZENAK[k];
rdIkasleBat.rNota := arNOTAK[k];
write(f, rdIkasleBat);
end;
close(f);
end;
{ fitxategiaren edukia pantailaratu }
procedure FitxategiaIkusi(sFitxIzen: tsKateLuze);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
begin
assign(f, sFitxIzen);
reset(f);
while not eof(f) do
begin
read(f, rdIkasleBat);
writeln(rdIkasleBat.sNor:57, rdIkasleBat.rNota:15:1);
end;
close(f);
end;
{ fitxategiaren edukia array batera eraman. iLuzera ez da behar ezaguna delako programa nagusian }
procedure FitxategiArray(sFitxIzen: tsKateLuze; var ardIkasleak: tardIkasleak);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
k: integer;
begin
assign(f, sFitxIzen);
reset(f);
k := 0;
while not eof(f) do
begin
read(f, rdIkasleBat);
k := k + 1;
ardIkasleak[k] := rdIkasleBat;
end;
close(f);
end;
{ arrayaren edukia fitxategian gorde }
procedure ArrayFitxategi(const ardKaotikoak: tardIkasleak; iLuzera: integer; sFitxIzen: tsKateLuze);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
k: integer;
begin
assign(f, sFitxIzen);
rewrite(f);
for k:=1 to iLuzera do
begin
rdIkasleBat := ardKaotikoak[k];
write(f, rdIkasleBat);
end;
close(f);
end;
{ arrayaren edukia pantailaratu }
procedure DatuakIkusi(const ardIkasleak: tardIkasleak; iLuzera: integer);
var
k: integer;
begin
for k:=1 to iLuzera do
begin
writeln(k:10, ' . ikaslea: ', ardIkasleak[k].sNor:40, ardIkasleak[k].rNota:10:1);
end;
end;
{ bi datu-mota berri sortzen dira, soilik prozedura honetan erabiliko direnak }
procedure ZerrendaNahastu(const ardIkasleak: tardIkasleak;
iLuzera: integer;
var ardKaotikoak: tardIkasleak);
type
trdLaguntzaile = record
rdIkaslea: trdIkasle;
boGordeta: boolean;
end;
tardLaguntzaile = array[1..iZENBATIKASLE] of trdLaguntzaile;
var
ardLaguntzailea: tardLaguntzaile;
k, iZbk: integer;
begin
for k:=1 to iLUZERA do
begin
ardLaguntzailea[k].boGordeta := FALSE;
end;
randomize;
for k:=1 to iLuzera do
begin
repeat
iZbk := random(iLUZERA) + 1;
//writeln('k=', k:2, '----------');
until ardLaguntzailea[iZbk].boGordeta = FALSE;
ardLaguntzailea[iZbk].boGordeta := TRUE;
ardLaguntzailea[iZbk].rdIkaslea := ardIkasleak[k];
end;
for k:=1 to iLUZERA do
begin
ardKaotikoak[k] := ardLaguntzailea[k].rdIkaslea;
end;
end;
{ ---------------------------------- Programa Nagusia ---------------------------------- }
var
sFitxIzen: tsKateLuze;
ardIkasleak: tardIkasleak;
iLuzera: integer;
ardKaotikoak: tardIkasleak;
begin
clrscr;
writeln;
writeln;
repeat
write('Zenbat ikasle dira? (1 eta ', iZENBATIKASLE, ' artean): ');
readln(iLuzera);
until (iLuzera >= 1) and (iLuzera <= iZENBATIKASLE);
writeln;
sFitxIzen := 'C:\Ikasleak.dat';
FitxategiaSortuEtaBete(sFitxIzen, iLuzera);
writeln('===Fitxategi ordenatuaren edukia===============================================');
FitxategiaIkusi(sFitxIzen);
writeln;
FitxategiArray(sFitxIzen, ardIkasleak);
writeln('---Array Laguntzailea Nahastu aurretik-----------------------------------------');
DatuakIkusi(ardIkasleak, iLuzera);
writeln;
ZerrendaNahastu(ardIkasleak, iLuzera, ardKaotikoak);
writeln('---Array Laguntzailea Nahastu ondoren------------------------------------------');
DatuakIkusi(ardKaotikoak, iLuzera);
writeln;
ArrayFitxategi(ardKaotikoak, iLuzera, sFitxIzen);
writeln('===Fitxategi desordenatuaren edukia============================================');
FitxategiaIkusi(sFitxIzen);
writeln;
writeln;
repeat until keypressed;
end.