Orrialdeak

2020-04-10

AZP-3 | Proiektua, BI: Biziaren Jokoa





Enuntziatua

Lehen faseko Biziaren Jokoa programarekin jarraituko dugu. Biziaren Jokoa simulagailu bat da, eta, dakigunez, gizarte bat irudikatzen du. Gizarteak 20x20=400 kide ditu eta bakoitzari taula baten gelaxka dagokio. Kideak 20x20 array bateko posizioak dira, nahiz eta kalkuluak egin ahal izateko 22x22 neurriko taula bat beharko dugun. Kide jakin batek hiru egoera izan ditzake:
  1. Hilda egotea, gelaxka horren tokia hutsik balego bezala da. Gelaxka bat hutsik dagoela (edo bere kidea hilik dagoela) adierazteko -1 balioa erabiltzen da.
  2. Kutsatuta egotea. Gelaxka baten kidea gaixorik dagoela adierazteko 0 balioa erabiltzen da.
  3. Bizirik egotea. Gelaxka baten kidea osasuntsu dagoela adierazteko +1 balioa erabiltzen da.
Biziaren Jokoa simulagailuan abiapuntua, gizartearen hasierako egoera bat da. Gizartearen egoera orokorra, gizarteko kide guztien egoren bilduma da. Gizartearen hasierako egoera TaulaDatuzBete prozedurak ematen du zorizko balioak lortuz. Ikusi, simulagailu programaren egikaritze batean eskuratu den gizartearen hasierako egoera:

Irudi 1. Programan 22x22 array bat erabiliko da: gizartea adierazteko 20x20 taula bat eta horrez gain, leiho-marko bat osatzen duten taularen inguruko gelaxkak (guztiz beharrezkoak kalkuluak egin ahal izateko). Egun jakin batean, gelaxka bakoitzean hiru balio hauetarik bat egon ahal da: -1, 0 edo 1(lehen eguneko hiru balio horiek Random funtzioak ematen ditu).

Biziaren Jokoa simulatzen duen programan gizartea bilakatuz doa denboraren arabera. Horrela, egun batetik bestera, gizarteko kide guztien egoera berria kalkulatzen da (EgoeraEguneratu prozedura arduratzen da zeregin horretaz). Biztanleen egoerak egunero aldatzen dira, irudi honetan erakusten den bezala:

Irudi 2. Egoeren aldaketak denborarekin ematen dira, gelaxka baten balio berria: gelaxkaren inguruko 8 gelaxken egoerek erabakiko dute.


Kideen egoerak aldatzeko arauak lau dira, taula honetan eta ondoko bi irudietan erakusten dira:

Koord. E-1 E-2 H / K /B Aldaketaren Araua
(12, 10) 0 1 0 / 1 / 7 B > Hx3 7 > 0x3
(1, 1) 0 -1 2 / 1 / 5 B < Hx3 5 < 2x3
(16, 18) -1 1 3 / 0 / 5 B >= 4 5 >= 4
(10, 1) 1 0 3 / 2 / 3 H+K > B 3+2 > 3
Taularen Koord. lehen zutabean hurrengo bi irudietako adibideen koordenatuak daude. E-1 eta E-2 zutabeak egun batetik besterako aldaketak dira. Laugarren zutabea H/K/B gelaxkaren inguruko kopuruak dira (hildakoak-kutsatuak-bizidunak). Aldaketaren Araua azken zutabea: arauak eta haien aplikazioak.








Irudi 3. Egunak igaro ahala, gizartea irudikatzen duten 20x20 gelaxken balioak aldatuko dira (leiho-markoa osatzen duten balioak ez dira aldatzen). Egun batetik hurrengora, gelaxka batek nozitzen duen aldaketa gelaxkaren inguruko balioen araberakoa da, hots, gelaxka inguratzen duten 8 balioek erabakiko dute gelaxka horren egoera berria hurrengo egunean (-1, 0 edo 1).




Abiapuntuko exekutagarria


Lehen faseko Biziaren Jokoa simulazioaren programa abiapuntua delako, berreskura dezagun Windows sistema baterako, lehen faseko programa exekutagarria:


Lehen faseko Biziaren Jokoa simulazioaren programa abiapuntua delako, berreskura dezagun Macintosh sistema baterako, lehen faseko programa exekutagarria:




Zer eskatzen da

Bigarren faseko Biziaren Jokoa simulazioaren zeregina dela eta, egin behar dituzun lanak A eta B dira. A zatiak iturburu-programa bat izango du eta B zatiak beste iturburu programa bat izango du:
  • A zatia: Datuen fitxategiak sortuko dira, eta fitxategi horien informazioa bilduko duen datu-basea sortuko da.
  • B zatia: Datu-basea kudeatuko da.




A zatia

Biziaren Jokoaren bigarren faseko A zatia, lehen faseko programaren jarraipena da. A zatiaren azken helburua C:\Herriak\2020-03-29_DB.dat tankerako izenak dituzten fitxategiak lortzea da, bakoitzak data jakin bateko hainbat herriren informazioa biltzen du eta horregatik datu-basea deituko diogu. Datu-base bat, egutegiko egun bakoitzeko. Datu-base guztiak C:\Herriak karpetan kokaturik.

Edozein datu-basek gordeko duen informazioa erregistroetan antolaturik dago. Datu-base jakin batek (adibidez C:\Herriak\2020-03-29_DB.dat izeneko datu-baseak) hainbat fitxategitik hartuko ditu bere datuak; esate baterako, adibidearen datu-base horren edukia bi herri hauen informazioa izan daiteke (2x5=10 erregistro):
  • C:\Herriak\2020-03-29_Arizkun.dat
  • C:\Herriak\2020-03-30_Arizkun.dat
  • C:\Herriak\2020-03-31_Arizkun.dat
  • C:\Herriak\2020-04-01_Arizkun.dat
  • C:\Herriak\2020-04-02_Arizkun.dat
  • C:\Herriak\2020-03-29_Hondarrabia.dat
  • C:\Herriak\2020-03-30_Hondarrabia.dat
  • C:\Herriak\2020-03-31_Hondarrabia.dat
  • C:\Herriak\2020-04-01_Hondarrabia.dat
  • C:\Herriak\2020-04-02_Hondarrabia.dat
C:\Herriak\2020-03-29_DB.dat izeneko datu-baseak bi herriren informazioa biltzen badu 10 erregistro izango ditu, eta erregistro bakoitzaren datuak dagokion fitxategitik jasoko du. Beltzez nabarmendu den data (2020ko martxoaren 29a) datu-basea izendatzeko erabiltzen da, eta data horrek balio du ere herri jakin baten lehen fitxategia identifikatzeko, hau da, adibidearen 2020-03-29 datako datu-baseak hartuko ditu: 2020ko martxoaren 29ko herri baten fitxategikoa eta herriaren hurrego lau egunen fitxategien datuak.
 
Adibidearekin jarraituz, ikus dezagun orain C:\Herriak\2020-03-29_Arizkun.dat izeneko fitxategiaren edukia zein den. Erantzun laburra: zenbaki osoen 22x22 neurriko taula bakar bat. Beraz, XXXX-XX-XX datako eta YYYYYYY eguneko C:\Herriak\XXXX-XX-XX_YYYYYY.dat izena duen fitxategiaren edukia elementu bakar dat da, lehen faseko 22x22 neurriko aaiTaulak array bat (lehen faseko aiTaula1, aiTaula2, aiTaula3, aiTaula4 edo aiTaula5 aldagai baten edukia).

Irudi 4. Bost taulen taaiTaulak datu-motako aaiTaulak arrayaren bitartez bost fitxategi erdiesten dira (irudia handiago ikusteko bere gainean klik egin).


Beherago ematen den kodean, HERRIEN DATUAK ESKURATU atala ikusi.

Urratsak:
  1. iDataHila eta iDataEgun aldagaien balioak teklatuaren bidez hartu ondoren, fnboEgunEgokia funtzio boolearra aplikatu (lehen faseko D zatian egiten zen bezalaxe).
  2. fnsDataEraiki funtzioari deia egin (lehen faseko D zatian egiten zen bezalaxe). Hurrengo hiru urratsak haibat aldiz errepikatu…
  3. sHerria aldagaiaren balioa teklatuz hartu eta fnboDataHerriBerriaDa(sData, sHerria, ardDatakHerriak, iDatakHerriakLuzera) funtzio boolearrari esker, data-herri bikote hori dagoeneneko ardDatakHerriak array laguntzailean dagoen ala ez aztertu. Aintzat hartu, ardDatakHerriak array laguntzaileak gehienez MUGA=45 elementu izan ditzakeela.
  4. Lehen faseko aiTaula1, aiTaula2, aiTaula3, aiTaula4 eta aiTaula5 aldagaien ordez, bigarren fasean aaiTaulak array lineala erabiliko da:
    { Proiektu I zatiaren A atala berreskuratu eta horri esker aaiTaulak }
    { arrayari balioak eman, lehena random eta beste lauak hedapen legez }
       TaulaBatArrayanGorde(aaiTaulak, k) ;  { 22x22 neurriko osoen 5 taula }
  5. BostFitxategiSortu prozeduraren bitartez bost herrien fitxategiak sortu.


1., 2. eta 3. urratsen argibidea

Array laguntzailearen datu-mota:

   trdDataHerria = RECORD
                      sDataBat: tsKate10 ;  
                      sHerriBat: tsKate30 ;
                   END ;
   tardDatakHerriak = ARRAY[1..MUGA] OF trdDataHerria ;

Array laguntzailearen aldagaiak:

   ardDataHerriak : tardDataHerriak ;  (* array laguntzailea *) 
   arDataHerriakLuzera : Integer ;     (* MUGA=45            *)



Hasiera-hasiera batean, dena hutsik dago:
  • ardDatakHerriak arraya hutsik dago, hau da, berarekin batera doan iDatakHerriakLuzera aldagaian 0 bat dago.
  • C:\Herriak karpetan fitxategirik ez dago.
Lehen data-herri [2020-03-29|Arizkun] bikoterako, ardDatakHerriak arraya aztertu ondoren arazorik ez dagoelako:
  • ardDatakHerriak  arrayan erregistro bat, ondorioz iDatakHerriakLuzera=1.
  • C:\Herriak karpetan 5 fitxategi daude, Arizkun herriari dagozkion 5 fitxategiak.
Bigarren data-herri [2020-03-29|Hondarrabia] bikoterako, ardDatakHerriak arraya aztertu eta datu berriak direlako:
  • ardDatakHerriak arrayan bi erregistro eta iDatakHerriakLuzera=2.
  • C:\Herriak karpetan 10 fitxategi daude, Arizkun eta Hondarrabia herriei dagozkion 5+5 fitxategiak.
Hirugarren data-herri [2020-05-01|Hondarrabia] bikoterako, ardDatakHerriak arraya aztertu eta datu berriak direlako, Hondarrabia herriko daturik badago baina dauden fitxategien izenak 2020-03-29_Hondarrabia.dat, 2020-03-30_Hondarrabia.dat, 2020-03-31_Hondarrabia.dat, 2020-04-01_Hondarrabia.dat eta 2020-04-02_Hondarrabia.dat direlako arazorik ez dago bikote honekin:
  • ardDatakHerriak  arrayan hiru erregistro eta iDatakHerriakLuzera=3.
  • C:\Herriak karpetan 15 fitxategi daude.
Laugarren data-herri [2020-03-31|Arizkun] bikoterako, ardDatakHerriak arraya aztertu eta ez onartu fitxategien kointzidentziak egongo direlako (adibidez: dagoeneko 2020-03-31_Arizkun.dat fitxategia badago C:\Herriak karpetan, eta ardDatakHerriak arrayaren informazioa arakatuz jakiterik dago). Ez onartu, baina nola erantzun? Ezezkoan, programak zer egin behar duen zuei utziko dizuet erabakitzen (posibilitate desberdinak daude: batzuk hobeak eta astunagoak programatzeko, beste batzuk errazagoak programatzeko baina eskasagoak programaren malgutasunaren aldetik). Laugarren saiakera horren osteko egoera hirugarrenekoa litzateke:
  • ardDatakHerriak  arrayan hiru erregistro eta iDatakHerriakLuzera=3.
  • C:\Herriak karpetan 15 fitxategi daude.

Beherago ematen den kodean, HERRIEN DATUAK ESKURATU atala ikusi ondoren...





Beherago ematen den kodean, HERRIEN DATU-BASEA SORTU atala azter dezagun.

Hasteko, deskriba dezagun datu-basearen elementuek zer nolako egiturari erantzuten dioten. Datu-basea rdInformazio erregistroetan oinarritzen da, hiru eremuko erregistroetan hain zuzen ere. Eremuak hauek dira:
  1. rdDatuak, bi eremuko erregistro hau:
      1.1.  aaiLaginak, bost elementuen arraya (lehen faseko C zatian lortzen ziren 3x3 bost arrayak).
      1.2.  asDatak, bost kateen arraya.
  2. sHerria, 30 karakteredun kararaktere-katea.
  3. sKalifikazioa, 11 karakteredun kararaktere-katea.
Irudi 5. Datu-basearen elementu bakoitzak ondoko informazioa biltzen du: 9 zenbakiren 5 taulen sorta bat, 5 daten sorta bat, izen bat eta beste izen bat. Erregistroaren datu-motaren identifikadorea rdInformazio izan daiteke eta rdElem edo rdFitxa datu-mota horretako aldagai bat (irudia handiago ikusteko bere gainean klik egin).


rdInformazio datu-motako hiru eremu dituzten erregistroak izango dira datu-baseaen elementuak. Adibidez, C:\Herriak\2020-03-29_DB.dat datu-basearen lehen bi elementuen eskema hau izan daiteke:

Irudi 6. 2020-03-29_DB.dat datu-basearen lehen elementua Arizkun eta bigarrena Hondarrabia, herri biren pandemiaren datuak 2020-03-29 datan hasi zien hartzen (irudia handiago ikusteko bere gainean klik egin).

Urratsak:
  1. iDataHila eta iDataEgun aldagaien balioak teklatuaren bidez hartu ondoren, fnboEgunEgokia funtzio boolearra aplikatu (lehen faseko D zatian egiten zen bezalaxe).
  2. fnsDataEraiki funtzioa erabili sFitxIzenDB aldagaiaren balioa lortzeko. Hurrengo 3. eta 4. urratsak hainbat aldiz errepikatu...
  3. sHerria aldagaiaren balioa teklatuz hartu eta konprobatu C:\Herriak karpetan dagoela.
    • Baiezkoan,  HerriaErregistratuDBan prozedurari esker elementu berri bat erregistratu datu-basean.
    • Ezezkoan,  mezu bat pantailaratu.
  4. Datu-basera herri gehiago gehitu nahi den galdetu.
Biziaren Jokoaren bigarren faseko A zatia, hementxe bukatzen da datu-basearen fitxategia sortu ondoren. Hau guztia egiten duen iturburu-programa eskatzen da.




A zatiaren kodea

Hona hemen balizko soluzioren eskema bat:
   (* -------------------------------------------------------- *)
   (* DATU-BASEA: C:\Herriak\2020-03-29_DB.dat fitxategia eta  *)
   (*                                          bere barnean    *)
   (*                                          fitxategi hauen *)
   (*                                          edukia:         *)
   (*                                                          *)
   (*             C:\Herriak\2020-03-29_Arizkun.dat            *)
   (*             C:\Herriak\2020-03-30_Arizkun.dat            *)
   (*             C:\Herriak\2020-03-31_Arizkun.dat            *)
   (*             C:\Herriak\2020-04-01_Arizkun.dat            *)
   (*             C:\Herriak\2020-04-02_Arizkun.dat            *)
   (*             C:\Herriak\2020-03-29_Hondarrabia.dat        *)
   (*             C:\Herriak\2020-03-30_Hondarrabia.dat        *)
   (*             C:\Herriak\2020-03-31_Hondarrabia.dat        *)
   (*             C:\Herriak\2020-04-01_Hondarrabia.dat        *)
   (*             C:\Herriak\2020-04-02_Hondarrabia.dat        *)
   (* -------------------------------------------------------- *)

PROGRAM BiziarenJokoa_II_A_Azp3 ;

USES
   SysUtils ;  { FileExists erabiltzeko }
   
CONST
   X_MAX = 20 ;
   Y_MAX = 20 ;
   LAGIN3x3 = 3 ;
   MUGA = 45 ;
   
TYPE
   taiTaula = ARRAY[0..X_MAX+1, 0..Y_MAX+1] OF Integer ;
   
   taaiTaulak = ARRAY[1..5] OF taiTaula ;
   
   tFitxategiTaulaBat = FILE OF taiTaula ;

   tsKate99 = STRING[99] ;
   tsKate30 = STRING[30] ;
   tsKate11 = STRING[11] ;
   tsKate10 = STRING[10] ;
   
   trdDataHerria = RECORD
                     sDataBat: tsKate10 ;   (* array laguntzailerako *)
                     sHerriBat: tsKate30 ;
                   END ;
   tardDatakHerriak = ARRAY[1..MUGA] OF trdDataHerria ;  (* array laguntzailerako *)
   
   tasDatak = ARRAY[1..5] OF tsKate10 ;
   
   taiLagin = ARRAY[1..LAGIN3x3, 1..LAGIN3x3] OF Integer ;
   
   taaiLaginak = ARRAY[1..5] OF taiLagin ;
   
   trdDatuak = RECORD
                  aaiLaginak: taiLagin ;
                  asDatak: tasDatak ;
               END ;
              
   trdInformazio = RECORD
                      rdDatuak: trdDatuak ;
                      sHerria: tsKate30 ;
                      sKalifikazioa: tsKate11 ;
                  END ;
                         
   tDBfitxategi = FILE OF trdInformazio ; 
                        
    
{ ------------------------- Programa Nagusia ------------------------- }

VAR
   //aiTaula1, aiTaula2, aiTaula3, aiTaula4, aiTaula5 : taiTaula ;
   aaiTaulak : taaiTaulak ; 
   iDataHila, iDataEgun, k : Integer ;
   sData : tsKate10 ;
   sHerria : tsKate30 ;
   sDataHerriFitxIzen, sFitxIzenDB : tsKate99 ;
   ardDatakHerriak : tardDatakHerriak ;  (* data-herri bikotearen datu berriak kontrolatzeko array laguntzailea *)
   iDatakHerriakLuzera : Integer ;       (* array laguntzailearen luzera MUGA=45                                *)
   cErantz : Char ;
      
BEGIN
   WriteLn ;
   WriteLn ;
   
   { ================================================================= }
   { 2020KO DATA BATEKO HERRIEN DATUAK ESKURATU                        }
   { ------------------------------------------                        }
   { Data bateko herrien datu-basea sortu aurretik datuak jasoko dira. }
   { 2020ko data bat teklatuaren bitartez hartu eta hainbat herriren   }
   { izenak emango ditu erabiltzaileak, herri bakoitzari datu sorta    }
   { bat dagokio (22x22ko bost array) eta bost taula horiekin bost     }
   { fitxategi lortulo dira, taula bakoitzetik fitxategi bat. 22x22ko  }
   { taulen edukia balio osoak dira eta proiektuaren I zatian bezala,  }
   { lehen taula random bitartez betetzen da eta beste lau taulak      }
   { pandemiaren hedapena simulatzen duten arauak aplikatuta; baina    }
   { proiektuaren I zatian ez bezala, 22x22ko taulak ez dira 5 aldagai }
   { izango, baizik aaiTaulak izeneko array baten elementuak, hau da,  }
   { bost array karratu biltegitzen dituen array lineala. Bost taulen  }
   { array horri esker eskuratuko dira herriari dagozkion datuen bost  }
   { fitxategiak.                                                      }
   {                                                                   } 
   { Programaren hasiera hau izan daiteke, non azpiprogramen ardurak   }
   { hauek diren:                                                      }
   {                                                                   }   
   { fnboEgunEgokia funtzio bolearrak hile baterako eman den egunaren  }
   {                zenbakia ondo dagoen kontrolatzen duen             }
   { fnsDataEraiki funtzioak data karaktere-kate bezala itzultzen du   }
   { fnboHerriBerriaDa funtzio bolearrak asHerrienZerrenda arraya ara- }
   {                   katzen du teklatuz emandako herria datu-basean  }
   {                   birritan ez gordetzeko                          }
   { TaulaBatArrayanGorde prozedurari esker bost egunen aaiTaulak      }   
   {                      arraya betetzen da (lehen eguna random bidez }
   {                      eta beste lauak pandemia hedatzeko arauez)   }
   { BostFitxategiSortu prozedurak, aurreko informazioan oinarrituta,  }
   {                    izen hauetako fitxategiak sortuko ditu, esate  }
   {                    baterako:     2020-03-29_Arizkun.dat           }   
   {                                  2020-03-30_Arizkun.dat           }
   {                                  2020-03-31_Arizkun.dat           }
   {                                  2020-04-01_Arizkun.dat           }
   {                                  2020-05-02_Arizkun.dat           }
   { ================================================================= }
   
   REPEAT
      Write('Datuak noiz hasi ziren hartzen? 2020ko zein hiletan: ') ; 
      ReadLn(iDataHila) ;  
   UNTIL (iDataHila >= 1) AND (iDataHila <= 12) ;
   
   REPEAT
      Write('2020ko ', fnsHilabetea(iDataHila),'ren eguna eman: ') ; 
      ReadLn(iDataEgun) ;
   UNTIL fnboEgunEgokia(iDataEgun, iDataHila) ;
   
   sData := fnsDataEraiki(iDataHila, iDataEgun) ; 
   
   iDatakHerriakLuzera := 0 ;
   REPEAT
      WriteLn(sData, ' datarako herrien datuak sortzen') ;
      REPEAT
         Write('Eman herriaren izena, ''Arizkun'' adibidez: ') ; 
         ReadLn(sHerria) ;
         sDataHerriFitxIzen := 'C:\Herriak\' + sData + '_' + sHerria + '.dat' ;
      UNTIL fnboDataHerriBerriaDa(sData, sHerria, ardDatakHerriak, iDatakHerriakLuzera) ;
      
      FOR k:=1 TO 5 DO
      BEGIN
         { Proiektu I zatiaren A atala berreskuratu eta horri esker aaiTaulak }
         { arrayari balioak eman, lehena random eta beste lauak hedapen legez }
         TaulaBatArrayanGorde(aaiTaulak, k) ;  { 22x22 neurriko osoen 5 taula }
      END ;
      BostFitxategiSortu(sData, sHerria, aaiTaulak) ;
      
      Write('Herri gehiagoren fitxategirik sortu nahi duzu? (B/E): ') ;
      ReadLn(cErantz) ;
      cErantz := Upcase(cErantz) ;  
   UNTIL (cErantz = 'E') OR (iDatakHerriakLuzera = MUGA) ;
   
   { ================================================================= }
   { 2020 URTEKO HERRIEN DATU-BASEA SORTU                              }
   { ------------------------------------                              }   
   { 2020ko herrien datu-basea erregistroen fitxategi bat izango da,   }
   { datu-basearen erregistroek hiru eremu izango dituzte:             }
   {   1. eremua, rdDatuak erregistroa, bi eremu:                      }
   {       1.1 eremua: aiDatak bost kateen arraya                      }
   {       1.2 eremua: aiLaginak bost osoen arraya                     }
   {   2. eremua, sHerria kararaktere-katea                            }
   {   3. eremua, sKalifikazioa 11 karakteredun kararaktere-katea      }
   {                                                                   }
   { Datu-base sortzeko eta betetzeko, erabiltzaileak data bat finkatu }
   { ondoren, hainbat herriren izenak emango ditu. Datu-baseak izango  }
   { duen izen osoa 'C:\Herriak\XXXX-XX-XX_DB.dat' izan daiteke, non   }
   { XXXX-XX-XX data bat den. Programak kontrolatu beharko du data     }
   { jakin bateko herriren datuak, ez direla behin baino gehiagotan    }
   { datu-basean grabatuko.                                            }   
   {                                                                   } 
   { Programaren jarraipena hau izan daiteke, non azpiprogramen lanak  }
   { hauek diren:                                                      }   
   {                                                                   }   
   { fnboEgunEgokia funtzio bolearrak hile baterako eman den egunaren  }
   {                zenbakia ondo dagoen kontrolatzen duen             }
   { fnsDataEraiki funtzioak data karaktere-kate bezala itzultzen du   }
   { fnboHerriaDBn funtzio boolearraren lana da frogatzea herri jakin  }
   {               bat ote dagoen XXXX-XX-XX data bateko datu-basean,  }
   {               hau da, C:\Herriak\XXXX-XX-XX_DB.dat fitxategian    }
   {               herri jakin hori dagoen ala ez dagoen               }
   { HerriaErregistratuDBn prozedurak kalkuluak egin ondoren, elementu }
   {                       berri bat gehitzen dio datu-baseari         }
   { ================================================================= }
 
   REPEAT
      Write('Zein eguneko datu-basea sortuko da? Eman 2020ko hilea: ') ; 
      ReadLn(iDataHila) ;  
   UNTIL (iDataHila >= 1) AND (iDataHila <= 12) ;
   
   REPEAT
      Write('2020ko ', fnsHilabetea(iDataHila),'ren eguna eman: ') ; 
      ReadLn(iDataEgun) ;
   UNTIL fnboEgunEgokia(iDataEgun, iDataHila) ;
   
   sData := fnsDataEraiki(iDataHila, iDataEgun) ;
   sFitxIzenDB := 'C:\Herriak\' + sData + '_DB.dat' ;
   
   WriteLn(sData, ' datarako herrien datuak datu-basean erregistratzen') ;
   REPEAT   
      Write('Eman herriaren izena, ''Arizkun'' adibidez: ') ; 
      ReadLn(sHerria) ;
      
      sDataHerriFitxIzen := 'C:\Herriak\' + sData + '_' + sHerria + '.dat' ;
      
      IF FileExists(sDataHerriFitxIzen) THEN
         ErregistratuDataHerriaDBan(sDataHerriFitxIzen, sFitxIzenDB)
      ELSE
         WriteLn(sDataHerriFitxIzen, ' izeneko data-herri bikoterik ez dago!') ;
      
      Write('Herri gehiago datu-basera gehitu nahi duzu? (B/E): ') ;
      ReadLn(cErantz) ;
      cErantz := Upcase(cErantz) ; 
   UNTIL (cErantz = 'E') ; 
   
   WriteLn ;
   WriteLn('=======================') ;
   WriteLn('RETURN sakatu amaitzeko') ;
   WriteLn('=======================') ;
   ReadLn ;
END.



B zatia

Biziaren Jokoaren bigarren faseko B zatia, aurrekoaren jarraipena da. B zatiaren helburua C:\Herriak\2020-03-29_DB.dat tankerako izenak dituzten fitxategien gainean eragiketak egitea. Horretarako, beherago ematen den kodea ikusi, non 2020 URTEKO HERRIEN DATU-BASEA KUDEATU atalean hiru eragiketa dituen menua erakusten den (menu hori lehen faseko D zatian programatu zen bera da).

Urratsak:
  1. iDataHila eta iDataEgun aldagaien balioak teklatuaren bidez hartu ondoren, fnboEgunEgokia funtzio boolearra aplikatu (lehen faseko D zatian egiten zen bezalaxe).
  2. fnsDataEraiki funtzioa erabili sFitxIzenDB aldagaiaren balioa lortzeko.
  3. sFitxIzenDB izeneko datu-basea C:\Herriak karpetan dagoela konprobatu:
    • Ezezkoan, mezu bat pantailaratu eta programa bukatu.
    • Baiezkoan, datu-basea kudeatzeko menura sartu.
  4. Datu-basea kudeatzeko menuak aukera bat hautatu:
    • Herri baten izena eskatu eta bere datuak pantailaratzea.
    • Herri baten izena eskatu eta datu guztiak datu-basetik ezabatzea.
    • Herri baten lehen laginaren balio bat aldatzea, laginaren koordenatuak teklatuz emango dira.
    • Menutik irten eta programa bukatu.
Biziaren Jokoaren bigarren faseko B zatia programatzea eta bere iturburu-programa eskatzen da.




B zatiaren kodea

Hona hemen balizko soluzioren eskema bat:
   (* -------------------------------------------------------- *)
   (* DATU-BASEA: C:\Herriak\XXXX-XX-XX_DB.dat fitxategia eta  *)
   (*                                          bere barnean    *)
   (*                                          fitxategi hauen *)
   (*                                          edukia:         *)
   (*                                                          *)
   (*             C:\Herriak\2020-03-29_Arizkun.dat            *)
   (*             C:\Herriak\2020-03-30_Arizkun.dat            *)
   (*             C:\Herriak\2020-03-31_Arizkun.dat            *)
   (*             C:\Herriak\2020-04-01_Arizkun.dat            *)
   (*             C:\Herriak\2020-04-02_Arizkun.dat            *)
   (* -------------------------------------------------------- *)

   { ================================================================= }
   { 2020KO DATA BATEKO HERRIEN DATUAK ESKURATUTA                      } 
   { --------------------------------------------                      }
   {                                                                   } 
   { Adibidez:     'C:\Herriak\2020-03-29_Arizkun.dat'                 } 
   {               'C:\Herriak\2020-03-30_Arizkun.dat'                 }
   {               'C:\Herriak\2020-03-31_Arizkun.dat'                 }
   {               'C:\Herriak\2020-04-01_Arizkun.dat'                 }
   {               'C:\Herriak\2020-04-02_Arizkun.dat'                 }
   {                                                                   }
   { ================================================================= }
   { 2020 URTEKO HERRIEN DATU-BASEA SORTUTA                            }
   { --------------------------------------                            }
   {                                                                   }
   { Adibidez:                                                         }
   {               'C:\Herriak\2020-03-29_DB.dat'                      }
   {                                                                   }
   { ================================================================= }
   
PROGRAM BiziarenJokoa_II_B_Azp3 ;

USES
   SysUtils ;  { FileExists erabiltzeko }
   
CONST
   X_MAX = 20 ;
   Y_MAX = 20 ;
   LAGIN3x3 = 3 ;
   MUGA = 45 ;
   
TYPE
   tsKate99 = STRING[99] ;
   tsKate30 = STRING[30] ;
   tsKate11 = STRING[11] ;
   tsKate10 = STRING[10] ;
  
   tasDatak = ARRAY[1..5] OF tsKate10 ;
   
   taiLagin = ARRAY[1..LAGIN3x3, 1..LAGIN3x3] OF Integer ;
   
   taaiLaginak = ARRAY[1..5] OF taiLagin ;
   
   trdDatuak = RECORD
                  aaiLaginak: taiLagin ;
                  asDatak: tasDatak ;
               END ;
              
   trdInformazio = RECORD
                      rdDatuak: trdDatuak ;
                      sHerria: tsKate30 ;
                      sKalifikazioa: tsKate11 ;
                  END ;
                         
   tDBfitxategi = FILE OF trdInformazio ; 
   
   
{ ------------------------- Programa Nagusia ------------------------- }

VAR
   iDataHila, iDataEgun : Integer ;
   sData : tsKate10 ;
   sFitxIzenDB : tsKate99 ;
   cAukera : Char ;      
   
   { ================================================================= }
   { 2020 URTEKO HERRIEN DATU-BASEA KUDEATU                            }
   { --------------------------------------                            }
   { Datu-basea erabili: erabiltzaileak data bat finkatu ondoren, menu }
   { baten bitartez eragiketa desberdinak egingi dira, adibidez:       }
   {    + Herri baten datuak pantailaratzea                            }
   {    + Herri baten datuak ezabatzea                                 }
   {    + Herri baten lehen laginaren balio bat aldatzea               }    
   { ================================================================= }    

BEGIN
   WriteLn ;
   WriteLn ;
   
   REPEAT
      Write('Zein datu-basearekin lan egingo dugu? Eman 2020ko hilea: ') ; 
      ReadLn(iDataHila) ;  
   UNTIL (iDataHila >= 1) AND (iDataHila <= 12) ;
   
   REPEAT
      Write('2020ko ', fnsHilabetea(iDataHila),'ren eguna eman: ') ; 
      ReadLn(iDataEgun) ;
   UNTIL fnboEgunEgokia(iDataEgun, iDataHila) ;
   
   sData := fnsDataEraiki(iDataHila, iDataEgun) ;
   
   sFitxIzenDB := 'C:\Herriak\' + sData + '_DB.dat' ;
      
   IF NOT FileExists(sFitxIzenDB) THEN
      WriteLn(sData, ' datarako datu-baserik ez da aurkitu!')
   ELSE
   BEGIN   
      { ----------------------------------------------------------------- }
      { Proiektuaren I zatian kodetu zen menua probestu daiteke II zatian }
      { ----------------------------------------------------------------- }      
      WriteLn ;
      REPEAT
         WriteLn('     +----------------------------------+') ;
         WriteLn('     |  Kalifikazioen araberako egunak  |') ;
         WriteLn('     +----------------------------------+') ;
         WriteLn('     |    K  Kontrolpeko egunak         |') ;
         WriteLn('     |    A  Arriskuko egunak           |') ;
         WriteLn('     |    L  Larrialdiko egunak         |') ;
         WriteLn('     |    S  Salbuespeneko ehunak       |') ;
         WriteLn('     |                                  |') ;
         WriteLn('     |    I  Irten                      |') ;
         WriteLn('     +----------------------------------+') ;
         REPEAT   
            Write('     Letra bat aukeratu: ') ;
            ReadLn(cAukera) ;
            cAukera := UpCase(cAukera) ;
         UNTIL (cAukera = 'K') OR (cAukera = 'A') OR
               (cAukera = 'L') OR (cAukera = 'S') OR (cAukera = 'I');
      
         WriteLn ;
         CASE cAukera OF
            'K' :  ;
            'A' :  ;
            'L' :  ;
            'S' :  ;
         END ;  
         WriteLn ;
         IF cAukera <> 'I' THEN
         BEGIN
            Write('Aurrera egiteko RETURN sakatu -> ') ;
            ReadLn ;
         END ;   
      UNTIL cAukera = 'I' ;   
   END ;
   
   WriteLn ;
   WriteLn('=======================') ;
   WriteLn('RETURN sakatu amaitzeko') ;
   WriteLn('=======================') ;
   ReadLn ;
END.