2024(e)ko apirilaren 29(a), astelehena

Irakaslearen irakas-jardueraz duzun iritzia





      Lehen, orai eta bethi
              (Ainhoan jasotako kanta moldatua)
  Lehen, orain eta beti
  ni bizi naiz penatuki.
  Zeren eta behar duzu
  nere inkesta egin.

  Zalantza baldin baduzu,
  zuk bost bat jar ezazu.
  Zeren eta horrelaxe
  asko poztuko nauzu.



 

Galdetegi laburra



2024(e)ko apirilaren 28(a), igandea

14. ASTEA | ikasgelan egindakoa

 14. astea (2024/04/29, tutoretza eta 2023/05/03) ikasgelan egin dena

  • FITXATEGIEN GAINEKO ERAGIKETAK:
    • Fitxategi-array (F→A) eta array-fitxategi (A→F) eragiketak erabiliko dira ondoko lan hauek egiteko:
      1.   Txertaketa, elementu bat edo gehiago fitxategiaren erdi aldean tartekatzeko
      2.   Ezabaketa, elementu bat edo gehiago fitxategiaren erdi aldetik kentzeko
      3.   Sailkatzea, fitxategiaren elementuak ordenatzeko


 

2024(e)ko apirilaren 21(a), igandea

Direktorioak: Non gaude?







Gure programetan sarritan egiten dugu hau, baina zer balio jarriko dugu sBIDEA kostantean:

   write(Fitxategiaren izena eman (LIBURUAK adibidez): ');
   readln(sFitxIzenLiburutegia);
   sFitxIzenLiburutegia := sBIDEA + sFitxIzenLiburutegia + '.DAT';

Beste modu batez galdeturik: datu-fitxategia non sortzen da?

  • HemenGaude direktorio bat sortu ordenadorearen edozein tokitan (mahaigainean adibidez), bere barnean HemenGorde direktorio bat sortu
  • HanGorde direktorio bat sortu C:\Dev-Pas direktorioan


Datu-fitxategia non sortzen da? galderari erantzuteko programa bat erakusten da beherago. Zenbakiak gordetzen dituen FitxategiakEtaDirektorioak programa deskriba dezagun urratsez urrats:

  • Hasieran uneko direktorioa erakusten da pantailan GetCurrentDirectory funtzioari esker
  • Ondoren, datu-fitxategiaren sIzena izena teklatuaren bitartez emango du erabiltzaileaak 
  • Datu-fitxaregiaren izen osoa eraikitzen da aurretik bidea jarriz eta ostean gehiagarri bat eta luzapena jarriz, bidearen aukerak hauek dira:
    1.   ''
    2.   'HemenGorde\'
    3.   GetCurrentDir + ''\''
    4.   'HanGorde\'
    5.   '\Dev-Pas\HanGorde\'
    6.   'C:\Dev-Pas\HanGorde\'
    7.   'E:\Dev-Pas\HanGorde\'
    8.   'E:\'
  • Datu-fitxategiaren izen osoa finkaturik bere existentzia aztertzen du programak, eta horren arabera bi bide irekitzen dira:
    • Datu-fitxategia ez bada existitzen sortu eta elementuak biltegitzen dira
    • Datu-fitxategia existitzen bada elementu berriak gehitzen dira bukaeran 

Iturburu-programa konpilatu ondoren FitxategiakEtaDirektorioak.exe programa exekutagarria lortuko dugu eta egikaratzeko bi modu daude: Dev-Pas programazio-ingurune barrutik eta Dev-Pas programazio-ingurunetik kanpo.




Dev-Pas programazio-ingurunetik kanpo

Iturburu-programa konpilatuz FitxategiakEtaDirektorioak.exe programa exekutagarria lortu ondoren, Dev-Pas ingurunetik irten HemenGaude direktoriora joateko eta FitxategiakEtaDirektorioak.exe gainean klik egiteko.


Uneko direktorioa HemenGaude delarik, datu-fitxategiarentzat bide desberdinak aukeratu eta emaitza hauek ikertu:


Bidea Datu-fitxategia non sortzen da
1 '' datu-fitxategia HemenGaude direktorioan
2 'HemenGorde\' datu-fitxategia HemenGorde direktorioan
3 GetCurrentDir + '\' datu-fitxategia HemenGaude direktorioan
4 'HanGorde\' exekuzio-denborako errorea
5 '\Dev-Pas\HanGorde\' datu-fitxategia HanGorde direktorioan
6 'C:\Dev-Pas\HanGorde\' datu-fitxategia HanGorde direktorioan
7 'E:\Dev-Pas\HanGorde\' errorea E: unitatean dauden direktorioen arabera
8 'E:\' E: unitatearen erroan (E: unitatean diskorik badago)




Dev-Pas programazio-ingurune barrutik

FitxategiakEtaDirektorioak.pas iturburu-programa konpilatu eta Dev-Pas programazio-ingurunearen menuko Run project aukera hautatu programa exekutatzeko.


Kasu honetan uneko direktorioa C:\Dev-Pas dela jakinik, datu-fitxategiarentzat bide desberdinak aukeratu eta emaitza hauek ikertu:


Bidea Datu-fitxategia non sortzen da
1 '' datu-fitxategia C:\Dev-Pas direktorioan
2 'HemenGorde\' exekuzio-denborako errorea
3 GetCurrentDir + '\' datu-fitxategia C:\Dev-Pas direktorioan
4 'HanGorde\' datu-fitxategia C:\Dev-Pas\HanGorde direktorioan
5 '\Dev-Pas\HanGorde\' datu-fitxategia C:\Dev-Pas\HanGorde direktorioan
6 'C:\Dev-Pas\HanGorde\' datu-fitxategia C:\Dev-Pas\HanGorde direktorioan
7 'E:\Dev-Pas\HanGorde\' errorea E: unitatean dauden direktorioen arabera
8 'E:\' E: unitatearen erroan (E: unitatean diskorik badago)



FitxategiakEtaDirektorioak.pas iturburu-programa:
program FitxategiakEtaDirektorioak;
 
uses
   sysutils;    (* GetCurrentDir eta FileExists funtzioek behar dutelako *)
 
type
   tfFitxategia = file of integer;
   tsKatea = string[199];
 
 
procedure FitxategiaIkusi(sFitxIzen: tsKatea);
var
   f: tfFitxategia;
   iElementua: integer;
begin
   { uztartu }
   assign(f, sFitxIzen);
   reset(f);
 
   writeln('"', sFitxIzen, '" fitxategiak ', filesize(f), ' elementu ditu, bere edukia:');
   while not eof(f) do
   begin
      read(f, iElementua);
      writeln(iElementua:5);
   end;
   writeln('.....................................................................');
   writeln;
   { itxi }
   close(f);
end;
 
 
procedure FitxategiaSortuEtaBete(sFitxIzen: tsKatea);
var
   f: tfFitxategia;
   iElementua, i, kopurua: integer;
begin
   { uztartu }
   assign(f, sFitxIzen);
   rewrite(f);
 
   write('Zenbat elementu nahi dituzu "', sFitxIzen, '" fitxategian? ');
   readln(kopurua);
 
   randomize; { random-aren hazia hasieratu }
   for i:=1 to kopurua do
   begin
      iElementua:=random(10); { 0 eta 9 arteko zenbakia }
      write(f,iElementua);    { fitxategian idatzi eta hurrengo elementura pasa }
   end;
   { itxi }
   close(f);
end;
 
 
procedure FitxategiariElementuakGehitu(sFitxIzen: tsKatea);
var
   f: tfFitxategia;
   iElementua: integer;
   cErantz: char;
begin
   { uztartu }
   assign(f, sFitxIzen);
   reset(f);
   seek(f, filesize(f));
   repeat
      write('"', sFitxIzen, '" fitxategian gordetzeko zenbaki bat eman: ');
      readln(iElementua);
      write(f, iElementua);
      write('Datu gehiagorik gorde nahi duzu? (B/E): ');
      readln(cErantz);
      cErantz := upcase(cErantz);
   until cErantz <> 'B';
   { itxi }
   close(f);
end;
 
 
{============================PROGRAMA NAGUSIA============================}
 
var
   sIzena: tsKatea;
   cAukera: char;
 
begin
   writeln;
   writeln;
   writeln('Uneko direktorioa: ', GetCurrentDir);
   writeln;
    
   writeln('Lanerako fitxategiaren izena eman ezazu (luzapenik gabe)...');
   write('Adibidez, "Datuak" izena: ');
   readln(sIzena);
 
   writeln;
 
   writeln;
   repeat
      writeln('     "', sIzena, '" fitxategiaren bidea aukeratu:');
      writeln('     1.  ""');;
      writeln('     2.  "HemenGorde\"');
      writeln('     3.  GetCurrentDir + "\"');
      writeln('     4.  "HanGorde\"');
      writeln('     5.  "\Dev-Pas\HanGorde\"');
      writeln('     6.  "C:\Dev-Pas\HanGorde\"');
      writeln('     7.  "E:\Dev-Pas\HanGorde\"');
      writeln('     8.  "E:\"');
      writeln;
      write('Exekuzio-denborako errorea gerta daitekeen arren, bide bat aukeratu: ');
      readln(cAukera);
   until (cAukera >= '1') and (cAukera <= '8');
    
   case cAukera of
      '1': sIzena := '' + sIzena + '_aukera-' + cAukera + '.DAT';
    //'1': sIzena :=      sIzena + '_aukera-' + cAukera + '.DAT';
      '2': sIzena := 'HemenGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
      '3': sIzena := GetCurrentDir + '\' + sIzena + '_aukera-' + cAukera + '.DAT';
      '4': sIzena := 'HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
      '5': sIzena := '\Dev-Pas\HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
      '6': sIzena := 'C:\Dev-Pas\HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
      '7': sIzena := 'E:\Dev-Pas\HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
      '8': sIzena := 'E:\' + sIzena + '_aukera-' + cAukera + '.DAT';
   end;
 
   writeln;
 
   if fileexists(sIzena) then
   begin
      writeln('"', sIzena, '" fitxategia existitzen da, lan egin dezagun.');
      writeln;
      FitxategiaIkusi(sIzena);
      FitxategiariElementuakGehitu(sIzena);
      FitxategiaIkusi(sIzena);
   end
   else
   begin
      writeln('"', sIzena, '" fitxategia ez da existitzen, sortuko dugu.');
      writeln;
      FitxategiaSortuEtaBete(sIzena);
      FitxategiaIkusi(sIzena);
   end;
 
   writeln;
   write('RETURN sakatu programa bukatzeko');
   readln;
end.
 

2024(e)ko apirilaren 20(a), larunbata

13. astea | kaosa sortzen (fitxategi ordenatu bat desordenatzen)

  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.
 

13. astea | fitxategi bat bitan banatu








Aurreko 13. astea | bi fitxategi nahastu ariketaren aurkakoa dela esan genezake!


Zenbakien fitxategi bateko datuak banatu

Demagun abiapuntuko fitxategiak zenbaki osoak dituela, eta datuak sailkatzeko baldintza zenbakia bakoitia/bikoitia izatea dela. Horren arabera progamak banaketa hau egingo du: zenbaki bakoitak fitxategi batera eta zenbaki bikoitiak beste fitxategi batera.

Abiapuntuko fitxategia ez da existitzen horregatik berria sortzen da

Abiapuntuko fitxategia existitzean datuak gehitzen dira

Hasierako fitxategiaren izena erabiltzaileak erabakiko du, goiko irudietan sartzen den izena Zenbakiak da eta programak C:\Datuak\Zenbakiak.DAT osatzen du. Ariketaren emaitza diren bi fitxategien izenak ez ditu erabiltzaileak hautatzen, emaitza diren fitxategiak hauek izango dira:
  • C:\Datuak\Bakoitiak.DAT
  • C:\Datuak\Bikoitiak.DAT   (0 zenbakia bikoititzak hartu)

Hona hemen, proposatutako ariketaren emaitza:
 

Fitxategi bat bitan banatzen duen programa hau izan daiteke:

program FitxategiBatBitanBanatzen;

uses
   sysutils;

type
   tfFitxategia = file of integer;
   tsKatea199 = string[199];


procedure FitxategiaIkusi(sFitxIzen: tsKatea199);
var
   f: tfFitxategia;
   iElementua: integer;
begin
   { uztartu }
   assign(f, sFitxIzen);
   reset(f);

   writeln(sFitxIzen, ' fitxategiak ', filesize(f), ' elementu ditu, bere edukia:');
   while not eof(f) do
   begin
      read(f, iElementua);
      write(iElementua:5);
   end;
   writeln;
   { itxi }
   close(f);
end;


procedure FitxategiaBete(sFitxIzen: tsKatea199);
var
   f: tfFitxategia;
   iElementua, k, iKopurua: integer;
begin
   { uztartu }
   assign(f, sFitxIzen);
   rewrite(f);

   write('Zenbat elementu nahi dituzu ', sFitxIzen, ' fitxategian? ');
   readln(iKopurua);

   randomize; { Random-aren hazia hasieratu }
   for k:=1 to iKopurua do
   begin
      iElementua:=random(10); { 0 eta 9 arteko zenbakia }
      write(f,iElementua);    { fitxategian idatzi eta hurrengo elementura pasa }
   end;
   { itxi }
   close(f);
end;


procedure FitxategiariElementuakGehitu(sFitxIzen: tsKatea199);
var
   f: tfFitxategia;
   iElementua: integer;
   cErantz: char;
begin
   {uztartu}
   assign(f, sFitxIzen);
   reset(f);
   seek(f, filesize(f));
   repeat
      write(sFitxIzen, ' fitxategian gordetzeko zenbaki bat eman: ');
      readln(iElementua);
      write(f, iElementua);
      write('Datu gehiagorik gorde nahi duzu?(B/E): ');
      readln(cErantz);
      cErantz := Upcase(cErantz);
   until cErantz <> 'B';
   { itxi }
   close(f);
end;


procedure FitxategiaBanatu(sFitxIzen, sFitxIzen1, sFitxIzen2: tsKatea199);
var
   f, f1, f2: tfFitxategia;
   iElementua: integer;
begin
   { uztartu }
   assign(f, sFitxIzen);
   reset(f);
   assign(f1, sFitxIzen1);
   rewrite(f1);
   assign(f2, sFitxIzen2);
   rewrite(f2);

   while not eof(f) do
   begin
      read(f, iElementua);
      if iElementua mod 2 <> 0 then
         write(f1, iElementua)
      else
         write(f2, iElementua);
   end;

   { itxi }
   close(f);
   close(f1);
   close(f2);
end;


{===================PROGRAMA NAGUSIA=====================}

var
   sIzena, sIzen1, sIzen2: tsKatea199;

begin
   writeln('Zenbakiak gordeko dituen fitxategiaren izena ''Zenbakiak'' izan daiteke');
   write('Fitxategiaren izena: ');
   readln(sIzena);
   sIzena := 'C:\' + sIzena + '.DAT';

   if fileexists(sIzena) then
   begin
      FitxategiaIkusi(sIzena);
      FitxategiariElementuakGehitu(sIzena);
      FitxategiaIkusi(sIzena);
   end
   else
   begin
      FitxategiaBete(sIzena);
      FitxategiaIkusi(sIzena);
   end;

   sIzen1 := 'C:\' + 'Bakoitiak' + '.DAT';
   sIzen2 := 'C:\' + 'Bikoitiak' + '.DAT';
   writeln('Datuak banatzean ', sIzen1, ' eta ', sIzen2, ' fitxategietan gordeko dira');

   FitxategiaBanatu(sIzena, sIzen1, sIzen2);
   FitxategiaIkusi(sIzen1);
   FitxategiaIkusi(sIzen2);

   writeln;
   write('RETURN sakatu programa bukatzeko');
   readln;
end.
 

13. astea | bi fitxategi nahastu








Ezaguna den ariketa hau fitxategiak erabiliz egin!


Erregistroen bi bektore fitxategi nahastu


Laborategiko gelan, gehienez, 25 ikasle izango dira. Ikasleen datuak bi arrayetan biltzen dira, array bat lehen azterketari dagokio eta beste arraya bigarren azterketari dagokio.

Arrayaren elementuak kateak dira, eta bertan izena eta zenbaki bat / batez banaturik daude, zenbakien kopuru maximoa 9.9 izango eta minimoa 0.0 izango da.

Datuak teklatuaren bitartez ematen dira eta ikasleen posizioak arrayetan zaindu behar dira berdinak izan daitezan, hurrengo adibidean erakusten den bezala. asAzterketa1 eta asAzterketa2 abiapuntuko arrayak dira eta ardAzterketak arraya lortu behar dena. Hona hemen datuen adibide bat:


asAzterketa1
‘Josu/6.1’
‘Ane/7.6’
‘Mikel/2.7’
1
2
3

asAzterketa2
‘Josu/6.9’
‘Ane/5.4’
‘Mikel/6.3’
1
2
3

iLuzera
3



ardAzterketak
‘Josu’
‘Josu’
‘Ane’
‘Ane’
‘Mikel’
‘Mikel’
6.1
6.9
7.6
5.4
2.7
6.3
1
2
3
4
5
6

iZenbat
6



Datu zerrenda bat array batean gorde daiteke, edo bestela fitxategi batean ere gorde daiteke. Ondoko ariketa egin dezagun: bi fitxategietatik abiatuta aurreko biak nahastuz fitxategi bakarra lortu.

Hona hemen, proposatutako ariketaren hasiera:

program ErregistroenBiFitxategiNahastenEMATEKOA;

type
   tsKate30 = string[30];
   tsKate250 = string[250];
   tfsAgendaZahar = file of tsKate30;

procedure DatuakSartu(sFitxIzen1, sFitxIzen2: tsKate250);
var
   f1, f2: tfsAgendaZahar;
   iZenbatElementu: integer;
   sDatua: tsKate30;
   sIzena: tsKate30;
   sZenbakiUnitate: tsKate30;
   sZenbakiHamarreko: tsKate30;
   iZenbakiUnitate: integer;
   iZenbakiHamarreko: integer;
   n: integer;
begin
   assign(f1, sFitxIzen1);
   rewrite(f1);
   assign(f2, sFitxIzen2);
   rewrite(f2);
   
   repeat
      write('Zenbat elementu gordeko dira bi fitxategietan? ');
      readln(iZenbatElementu);
   until iZenbatElementu > 0;
   
   for n:=1 to iZenbatElementu do
   begin
      write(n, '. lagunaren izena eman: ');
      readln(sIzena);
   
      iZenbakiUnitate := random(10);         (* 0 eta 9 artean *)
      Str(iZenbakiUnitate, sZenbakiUnitate);
      iZenbakiHamarreko := random(10);       (* 0 eta 9 artean *)
      Str(iZenbakiHamarreko, sZenbakiHamarreko);
      
      sDatua := sIzena + '/' + sZenbakiUnitate + '.' + sZenbakiHamarreko;
      write(f1, sDatua);     (* Fitxategi batean idatzi *)
   
      iZenbakiUnitate := random(10);         (* 0 eta 9 artean *)
      Str(iZenbakiUnitate, sZenbakiUnitate);
      iZenbakiHamarreko := random(10);       (* 0 eta 9 artean *)
      Str(iZenbakiHamarreko, sZenbakiHamarreko);
      
      sDatua := sIzena + '/' + sZenbakiUnitate + '.' + sZenbakiHamarreko;
      write(f2, sDatua);     (* Fitxategi batean idatzi *)   
   end;

   close(f1);    (* Fitxategiak itxi *)
   close(f2);
end;


procedure DatuakIkusi(sFitxIzen: tsKate250);
var
   f: tfsAgendaZahar;
   sDatua: tsKate30;
begin
   assign(f, sFitxIzen);
   reset(f);

   while not eof(f) do
   begin
      read(f, sDatua);
      writeln(FilePos(f)-1, '. posizioko datua: ', sDatua);
   end;

   close(f);    (* Fitxategia itxi *)
   writeln;
end;


{ ============================================================== }


var
   sAgendaIzen1, sAgendaIzen2: tsKate250;

begin
   write('1. agenda fitxategiaren izena eman: ');
   readln(sAgendaIzen1);
   
   write('2. agenda fitxategiaren izena eman: ');
   readln(sAgendaIzen2);
   
   DatuakSartu(sAgendaIzen1, sAgendaIzen2);
   writeln;
   
   writeln('1. agendaren datuak: ');
   DatuakIkusi(sAgendaIzen1);
   writeln;

   writeln('2. agendaren datuak: ');
   DatuakIkusi(sAgendaIzen2);
   writeln;

   { hemen idatzi ariketan eskatzen dena }

   writeln('Programa amaitzera doa');
   readln;
end.



Ariketen iturburu programak




Array datu-mota erabiliz
Fitxategien bitartez
 

13. astea | fitxategi beraren edukia modu desberdinez pantailaratzen








Demagun erregistroen fitxategi bat sortu dugula. Fitxategiaren elementu bakoitza erregistro bat da, eta erregistroak bi eremu ditu: lehena Integer datu-motakoa eta bigarrena Real datu-motakoa.
     trdIntReal = RECORD
                     Lehena   : integer ;
                     Bigarrena: real ;
                  END ;
Demagun sortutako fitxategiaren izena Zenbakiak.dat dela eta bere edukia datu-mota desberdineko fitxategien bitartez pantailaratzea nahi dugula. Eduki bera pantailaratzeko lau fitxategiren datu-motak erabiliko dira.

1


Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun datu-mota DM_rdIntReal da, hots, sorrerako datu-mota berbera. Ondorioz, pantailaratuko den informazioa "jatorrizkoa" izango da. Adibidean:
1. eremuan 163 balioa eta 2. eremuan 1.1295338E+001 balioa.

2


Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun datu-mota DM_rdRealInt da, jatorrizkoaren antzekoa baina eremuen datu-motak elkar trukaturik (lehena Real datu-motakoa eta bigarrena Integer datu-motakoa):
     trdRealInt = RECORD
                     Lehena   : real ;
                     Bigarrena: integer ;
                  END ;
Ondorioz, nahiz eta Zenbakiak.dat fitxategiaren edukia ez den aldatu, pantailaratuko den informazioa bestelakoa izango da. Adibidean:
1. eremuan 9.7150463E+302 balioa eta 2. eremuan 1076270902 balioa.

3


Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun FILE datu-mota DM_fbyBytak da, hots, fitxategian BYTE datu-motako informazioa dagoela interpretatzen duen fitxategia. Horregatik, Zenbakiak.dat fitxategiaren edukia hainbat byten sorta delakoan, byte guztiak banan-banan pantailaratuko dira.


4


Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun FILE datu-mota DM_fcKaraktereak da, hots, fitxategian CHAR datu-motako informazioa dagoela interpretatzen duen fitxategia. Horregatik, Zenbakiak.dat fitxategiaren edukia hainbat karakteren sorta delakoan, karaktere guztiak banan-banan pantailaratuko dira; bide batez, karaktere bakoitzaren ordinala ere erakusten da (3 urratseko informazio bera da).



Hona hemen, fitxategi beraren edukia modu desberdinez pantailaratzen duen programa:

{----------------------------------------------------------------
  Erregistroak gordetzen dituen "Zenbakiak.dat" fitxategia sortu 
  eta datu-mota desberdineko fitxategien bitartez atzitu.
 ----------------------------------------------------------------}

program Fitxategi_integerrealbytechar;

type
   tsKate99 = string[99];

   trdIntReal = record
                   Lehena   : integer;
                   Bigarrena: real;
                end;
 
   tfrdIntReal = file of trdIntReal;

   trdRealInt = record
                   Lehena   : real;
                   Bigarrena: integer;
                end;

   tfrdRealInt = file of trdRealInt;

   tfbyBytak = file of byte;

   tfcKaraktereak = file of char;

{--------------bakarra den fitxategia sortu--------------}
procedure INTEGER_REAL_FitxategiaSortu(sFitxIzen: tsKate99);
var
   f: tfrdIntReal;
   rdZenbakiak: trdIntReal;
   k, iZenbat: integer; 
begin
   assign(f, sFitxIzen);
   rewrite(f);
   
   write('Zenbat elementu nahi dituzu (2 elementu adibidez): ');
   readln(iZenbat);
   
   randomize;
   for k:=1 to iZenbat do
   begin 
      rdZenbakiak.Lehena := random(256);      (* byte baten balioak    *)
      rdZenbakiak.Bigarrena := random*100;    (* 0.0 eta 99.99 artekoa *)
      write(f, rdZenbakiak);
   end;
   
   close(f);
end;

{-----bakarra den fitxategia INTEGER_REAL bezala ikusi-----}
procedure INTEGER_REAL_FitxategiaIkusi(sFitxIzen: tsKate99);
var
   f: tfrdIntReal;
   rdZenbakiak: trdIntReal;
begin
   assign(f, sFitxIzen);
   reset(f);
   
   while not eof(f) do
   begin
      read(f, rdZenbakiak);
      writeln(filepos(f)-1, ' posizioan    1. eremua = ', rdZenbakiak.Lehena:3, '2. eremua = ':25, rdZenbakiak.Bigarrena:0:2);
   end;
   
   close(f);
end;

{-----bakarra den fitxategia REAL_INTEGER bezala ikusi-----}
procedure REAL_INTEGER_FitxategiaIkusi(sFitxIzen: tsKate99);
var
   f: tfrdRealInt;
   rdZenbakiak: trdRealInt;
begin
   assign(f, sFitxIzen);
   reset(f);
   
   while not eof(f) do
   begin
      read(f, rdZenbakiak);
      writeln(filepos(f)-1, ' POSIZIOAN    1. EREMUA =', rdZenbakiak.Lehena:12, '2. EREMUA = ':16, rdZenbakiak.Bigarrena:2);
   end;
   
   close(f);
end;

{-----bakarra den fitxategia CHAR bezala ikusi-----}
procedure CHAR_FitxategiaIkusi(sFitxIzen: tsKate99);
var
   f: tfcKaraktereak;
   cKarakterea: char;
   k: integer;
begin
   assign(f, sFitxIzen);
   reset(f);
   
   k:= 0;
   while not eof(f) do
   begin
      read(f, cKarakterea);
      k := k + 1;
      writeln(k:3, '. elementua = |', cKarakterea, '|    ', Ord(cKarakterea):3);
   end;
   
   close(f);
end;

{-----bakarra den fitxategia BYTE bezala ikusi-----}
procedure BYTE_FitxategiaIkusi(sFitxIzen: tsKate99);
var
   f: tfbyBytak;
   byByte: byte;
   k: integer;
begin
   assign(f, sFitxIzen);
   reset(f);
   
   k:= 0;
   while not eof(f) do
   begin
      read(f, byByte);
      k := k + 1;
      writeln(k:3, '. elementua = ', byByte:3);
   end;
   
   close(f);
end;

var {---------------------- Programa Nagusiko aldagaiak ---------------}
   sFitxIzen: tsKate99;

begin {--------------------------- Programa Nagusia -------------------}
   
   { sFitxIzen := 'C:\Datuak\Zenbakiak.dat';
     writeln('Fitxategi bitarraren izena: ', sFitxIzen); }
   
   sFitxIzen := 'Zenbakiak.dat'; 
   writeln('Fitxategi bitarraren izena: ', sFitxIzen);
   
   writeln;
   writeln('sizeof(tsKate99)   = ', sizeof(tsKate99):3, ' byte');
   writeln('sizeof(integer)    = ', sizeof(integer):3, ' byte');
   writeln('sizeof(real)       = ', sizeof(real):3, ' byte');
   writeln('sizeof(byte)       = ', sizeof(byte):3, ' byte');
   writeln('sizeof(char)       = ', sizeof(char):3, ' byte');
   writeln('sizeof(trdIntReal) = ', sizeof(trdIntReal):3, ' byte');
   writeln('sizeof(trdRealInt) = ', sizeof(trdRealInt):3, ' byte');
   writeln;
   writeln('RETURN sakatu aurrera egiteko!');
   readln;
   
   INTEGER_REAL_FitxategiaSortu(sFitxIzen);  { Lehen eremua integer }
   writeln;                                  { Bigarren eremua real }
   
   writeln('Zenbakiak.dat fitxategiaren edukia integer-real bezala azterturik:');
   writeln('------------------------------------------------------------');
   INTEGER_REAL_FitxategiaIkusi(sFitxIzen);
   writeln('------------------------------------------------------------');
   writeln;
   
   writeln('Zenbakiak.dat fitxategi bera real-integer bezala azterturik:');
   writeln('------------------------------------------------------------');
   REAL_INTEGER_FitxategiaIkusi(sFitxIzen);
   writeln('------------------------------------------------------------');
   writeln;
   
   writeln('Zenbakiak.dat fitxategi bera BYTE bezala azterturik:');
   writeln('------------------------------------------------------------');
   BYTE_FitxategiaIkusi(sFitxIzen);
   writeln('------------------------------------------------------------');
   writeln;
   
   writeln('Zenbakiak.dat fitxategi bera CHAR bezala azterturik:');
   writeln('------------------------------------------------------------');
   CHAR_FitxategiaIkusi(sFitxIzen);
   writeln('------------------------------------------------------------');
   writeln;
   
   writeln;
   writeln ('Programa amaitzeko RETURN tekla sakatu');
   readln;
   
end.   { PROGRAMAREN BUKAERA }
 

13. ASTEA | ikasgelan egindakoa

 13. astea (2024/04/22, tutoretza eta 2023/04/26) ikasgelan egin dena

  • FILE datu-mota artikulutik abiatuta kontzeptu hauek zeharka berrikusi ditugu:
    • DATU-MOTA SORTZEN
    • OINARRIZKO ERAGIKETAK:
      • Irakurri elementu oso bat fitxategitik memoria ekarriz (read)
      • Idatzi elementu oso bat fitxategian memoriatik hartuz (write)
    • LAN EGITEKO BALIABIDEAK:
      • read (prozedura)
      • write (prozedura)
    • LAN EGITEKO BALIABIDEAK:
      • assign (prozedura)
      • rewrite (prozedura)
      • reset (prozedura)
      • close (prozedura)
      • fileexists (funtzio, programa nagusian eta sysutils unitatea behar da)
      • seek (prozedura)
      • filepos (funtzio)
      • filesize (funtzio)
      • eof (funtzio)
      • truncate (prozedura, fitxategia mozteko)
      • erase (prozedura, fitxategia ezabatzeko)
      • rename (prozedura, fitxategia berrizendatzeko)
    • PARAMETRO IZATEAN JOKAMOLDEA
    • FITXATEGIEN GAINEKO ERAGIKETAK:
      • Fitxategia sortu
      • Fitxategiaren existentzia
      • Fitxategi osoa prozesatu
      • Bilaketa fitxategian
      • Elementu bat fitxategiari gehitu
      • Fitxategiaren datu baten aldaketa
      • Fitxategian elementu bat txertatu (F → A → F)    [datorren asteko laborategirako] 
      • Fitxategitik elementu bat kendu (F → A → F)      [datorren asteko laborategirako
      • Fitxategitik elementuak kendu (F → A → F)       [datorren asteko laborategirako
      • Fitxategi bat ordenatu (F → A → F)        [hurrengo asteetako laborategietan egitekoa] 
  • 13. astea | fitxategi bat bitan banatu ariketa       [aste honetako laborategian egingo dugu] 

  • Batez ere Azp-3 ikasleentzat zuzendurik dago 14. asteko praktika galduko dutelako, baina tutoretza bezala planteaturik dagoelako edozein ikasle etor daiteke. Hau egin dugu:
    • Proiektua: 2023ko maiatzeko programa azterketaren enuntziatua irakurriko dugu
    • Proiektuaren J aukeraren programazioa bukatuko dugu:
      1. Bilaketa, jokalari baten sNor edo sJokalari katea teklatuz eman eta bilatuko dugu prozedura batean erregistro osoa itzuli behar badu eta funtzio batean bilatu nahi den elementuaren posizioa itzuli behar badu   [Hau eginik daukagu]
      2. Ezabaketa, posizio jakin bateko elementua fitxategitik kentzeko array laguntzaile bat edo beste fitxategi laguntzaile bat beharko da (guk fitxategi laguntzaile bat erabili dugu)   [Hau eginik daukagu]
      3. Posizioa, elementu baten posizioa fitxategian teklatuz eman eta fitxategiaren posizio horretan elementu berri bat txertatu   [Hau egingo dugu]
      4. Txertaketa, fitxategiaren posizio jakin batean elementu berri bat sartzeko array laguntzaile bat edo beste fitxategi laguntzaile bat beharko da (guk array laguntzaile bat erabili dugu)   [Hau egingo dugu]
      5. Aldaketa, fitxategiaren duen aldaketa egingo dugu kromo guztien iZenbakia eremuaren balioak 1-etik hasita sekuentzialki jarriz   [Hau egingo dugu]
    • Proiektuaren K aukerari buruz hitz egingo dugu zuen zalantzak argituz

  • FILE datu-mota artikulutik abiatuta kontzeptu hauek zeharka berrikusi ditugu:
    • DATU-MOTA SORTZEN
    • OINARRIZKO ERAGIKETAK:
      • Irakurri elementu oso bat fitxategitik memoria ekarriz (read)
      • Idatzi elementu oso bat fitxategian memoriatik hartuz (write)
    • LAN EGITEKO BALIABIDEAK:
      • read (prozedura)
      • write (prozedura)
    • LAN EGITEKO BALIABIDEAK:
      • assign (prozedura)
      • rewrite (prozedura)
      • reset (prozedura)
      • close (prozedura)
      • fileexists (funtzio, programa nagusian eta sysutils unitatea behar da)
      • seek (prozedura)
      • filepos (funtzio)
      • filesize (funtzio)
      • eof (funtzio)
      • truncate (prozedura, fitxategia mozteko)
      • erase (prozedura, fitxategia ezabatzeko)
      • rename (prozedura, fitxategia berrizendatzeko)
    • TRUNCATE, RENAME ETA ERASE ADIBIDE BANA:
      1. Erdiko posizioa, elementu baten posizioa fitxategian teklatuz eman eta fitxategiaren posizio horretan elementu berri bat txertatu (edo kendu) fitxategi laguntzaile bat erabiliz, azkenean jatorrizko fitxategiari erase(f) aplikatu eta laguntzaileari rename(f,sFitxIzen) 
      2. Azken posizioa, fitxategiaren azken elementua kendu nahi denean bertan kokatu seek(f,filesize(f)-1) eginez eta truncate(f) aplikatu (hortik aurrerako elementuak ezabatuko dira, egia esan elementu bakarra ezabatuko da)
      3. Azken posizioa, fitxategiaren azken elementuan ostean berri bat gehitu nahi denean seek(f,filesize(f)) eta ondoren write(f,rdElem) eginez bertan idatzi
    • PARAMETRO IZATEAN JOKAMOLDEA
    • FITXATEGIEN GAINEKO ERAGIKETAK:
      • Fitxategia sortu
      • Fitxategiaren existentzia
      • Fitxategi osoa prozesatu
      • Bilaketa fitxategian
      • Elementu bat fitxategiari gehitu
      • Fitxategiaren datu baten aldaketa
      • Fitxategian elementu bat txertatu (F → A → F)      [datorren astelehenean]    
      • Fitxategitik elementu bat kendu (F → A → F)     [datorren astelehenean]       
      • Fitxategitik elementuak kendu (F → A → F)     [datorren astelehenean]    
      • Fitxategi bat ordenatu (F → A → F)        [hau ez da galdetuko
  • 13. astea | fitxategi beraren edukia modu desberdinez pantailaratzen artikulua
  • Direktorioak: Non gaude? artikulua aipatu eta laborategian sakonago azalduko dugu