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:
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 | { 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | 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.