| ZER DAKIDAN: Erregistroen fitxategi batean, fitxategia nola sailkatu ikasi dut bere elementuak ordenatuz. Horretarako datu-egitura laguntzaileren bat erabili behar da (array laguntzaile bat edo fitxategi laguntaile bat). ZER IKASIKO DUDAN: Ordenaturik dagoen erregistroen fitxategi bat, desordenatzen ikasiko dugu. Sailkaturik dauden datuen fitxategia desordenatzeko array laguntzaile bat erabili dugu. |
ESKATZEN DEN PROGRAMA
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. 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. Irudi honek programaren helburua adierazi nahi du, sailkaturik dagoen fitxategia desordenaturik gertuko da:
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
iKOPURUMAX = 15;
sBIDEA = 'C:\Datuak\';
type
tsKateLuze = string[199];
tsKate49 = string[49];
trdFitxa = record
sIzenDeiturak: tsKate49;
byDeialdia: byte; (* osoa, txikia eta positiboa *)
rNota: real;
end ;
tfrdFitxategi = file of trdFitxa ;
tasIzenenZerrenda = array[1..iKOPURUMAX] of tsKate49;
tarNotenZerrenda = array[1..iKOPURUMAX] 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
'JOMA GABILONDO, ASIER', // 13
'KRUGER GARAI, LUDWING', // 14
'LANDA ASTORQUIZA, UNAI'); // 15
type
tardIkasleak = array[1..iKOPURUMAX] of trdFitxa;
{ ikasleen izenak eta notak array konstanteetan daude, deialdia auzaz }
procedure FitxategiaBete(sFitxIzen: tsKateLuze; iLuzera: integer);
var
f: tfrdFitxategi;
rdFitxa: trdFitxa;
k: integer;
begin
assign(f, sFitxIzen);
rewrite(f);
randomize;
for k:=1 to iLuzera do
begin
rdFitxa.sIzenDeiturak := asIZENAK[k];
rdFitxa.byDeialdia := random(4) + 1; (* 1etik 4ra *)
rdFitxa.rNota := random(9) + 0.1*random(9); (* 0tik 9ra eta 0tik 9ra *)
write(f, rdFitxa);
end;
close(f);
end;
procedure IkasleaErakutsi(const rdFitxa: trdFitxa);
begin
writeln(rdFitxa.sIzenDeiturak:40, rdFitxa.byDeialdia:8, rdFitxa.rNota:10:1);
end;
procedure FitxategiaIkusi(sFitxIzen: tsKateLuze);
var
f: tfrdFitxategi;
rdFitxa: trdFitxa;
k: integer;
begin
assign(f, sFitxIzen);
reset(f);
k := 1;
while not eof(f) do
begin
read(f, rdFitxa);
write(k:5, ' . ikaslea: ');
IkasleaErakutsi(rdFitxa);
k := k + 1;
end;
close(f);
end;
procedure FitxategitikArrayra( sFitxIzen: tsKateLuze;
var ardIkasleak: tardIkasleak;
var iLuz: integer);
var
f: tfrdFitxategi;
rdFitxa: trdFitxa;
begin
assign(f, sFitxIzen);
reset(f);
iLuz := 0;
while not eof(f) do
begin
read(f, rdFitxa);
iLuz := iLuz + 1;
ardIkasleak[iLuz] := rdFitxa;
end;
close(f);
end;
procedure ArraytikFitxategira( sFitxIzen: tsKateLuze;
const ardKaotikoak: tardIkasleak;
iLuz: integer);
var
f: tfrdFitxategi;
rdFitxa: trdFitxa;
k: integer;
begin
assign(f, sFitxIzen);
rewrite(f);
for k:=1 to iLuz do
begin
rdFitxa := ardKaotikoak[k];
write(f, rdFitxa);
end;
close(f);
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: trdFitxa;
boGordeta: boolean;
end;
tardLaguntzaile = array[1..iKOPURUMAX] 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;
until not ardLaguntzailea[iZbk].boGordeta;
ardLaguntzailea[iZbk].boGordeta := TRUE;
ardLaguntzailea[iZbk].rdIkaslea := ardIkasleak[k];
end;
for k:=1 to iLUZERA do
begin
ardKaotikoak[k] := ardLaguntzailea[k].rdIkaslea;
end;
end;
{
procedure ArrayaIkusi(const ardIkasleak: tardIkasleak; iLuzera: integer);
var
k: integer;
begin
for k:=1 to iLuzera do
begin
writeln(k:5, ' . ikaslea: ', ardIkasleak[k].sIzenDeiturak:40,
ardIkasleak[k].byDeialdia:8,
ardIkasleak[k].rNota:10:1);
end;
end;
}
procedure FitxategiaNahastu(sFitxIzen: tsKateLuze);
var
ardIkasleak: tardIkasleak;
ardKaotikoak: tardIkasleak;
iLuz: integer;
begin
FitxategitikArrayra(sFitxIzen, ardIkasleak, iLuz);
// ArrayaIkusi(ardIkasleak, iLuz);
ZerrendaNahastu(ardIkasleak, iLuz, ardKaotikoak);
ArraytikFitxategira(sFitxIzen, ardKaotikoak, iLuz);
// ArrayaIkusi(ardKaotikoak, iLuz);
end;
{ ---------------------------------- Programa Nagusia ---------------------------------- }
var
sFitxIzen: tsKateLuze;
iLuzera: integer;
begin
clrscr;
repeat
write('Zenbat ikasle dira? (1 eta ', iKOPURUMAX, ' artean): ');
readln(iLuzera);
until (iLuzera >= 1) and (iLuzera <= iKOPURUMAX);
writeln(iLuzera, ' ikasleen datuak gordetzen...');
write('Fitxategiaren izena eman ("Talde31" adibidez): ');
readln(sFitxIzen);
sFitxIzen := sBIDEA + sFitxIzen + '.dat';
FitxategiaBete(sFitxIzen, iLuzera);
writeln;
writeln('--Nahastu aurretik-----------------------------------------------------------');
FitxategiaIkusi(sFitxIzen);
writeln;
FitxategiaNahastu(sFitxIzen);
writeln('--Nahastu ondoren------------------------------------------------------------');
FitxategiaIkusi(sFitxIzen);
writeln;
repeat until keypressed;
end.
Programaren balizko exekuzio bat hurrrengo irudian erakusten da:


iruzkinik ez:
Argitaratu iruzkina
Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.