Taldean lan eginez proiektu hau garatu duzue, orain soluzio hau azter ezazue
Hau da proiektuaren enuntziatua:
Proiektuaren balizko soluzio bat
Soluzio hau bi programetan ematen da:
- Radarrak2019.pas (eskatzen den ariketaren programa da).
- Radarrak2019_DatuakLortzen.pas (aurreko programa horrek erabil ditzan datuak lor ditzakeen programa).
Radarrak2019_DatuakLortzen.pas programa exekutatu
Radarrak2019_DatuakLortzen.pas programa exekutatu eta C:\Radarrak karpetan datuen bi fitxategi lortuko dituzu, adibidez A_190430.dat fitxategia eta B_190430.dat fitxategia. Fitxategi horien datuak honelakoak dira:
Radarrak2019_DatuakLortzen.pas programa
{------------------------------------------------------------------------------
2019ko talde-ariketa.
Demagun datuak eskaintzen dituen programa hau dela. Programa honi esker
lortzen diren fitxategiak 'Radarrak.pas' programak prozesatu behar ditu.
'A_uuhhee.DAT' eta 'B_uuhhee.DAT' fitxategiak 'C:\Radarrak' karpetan sortzen
dira. Fitxategi biren elementu kopurua berbera da baina kopuru finkoa ez da.
Fitxategi biak 'rdUnea' eremuaren arabera sailkatzen direnez ibilgailuen
posizioak (matrikulen posizioak) desberdinak dira fitxategi batetik bestera.
-------------------------------------------------------------------------------}
PROGRAM RadarrenDatuak_2019 ;
TYPE
tsKateIzena = String[200] ;
tsKateMatrikula = String[10] ;
trdUnea = RECORD
iOrduak, iMinutuak, iSegundoak : Integer ;
END ;
trdIbilgailua = RECORD
sMatrikula : tsKateMatrikula ;
cIbilgailuMota : Char ;
rdUnea : trdUnea ;
rAbiadura : Real ;
END ;
tfrdRadarrenFitxategia = FILE OF trdIbilgailua ;
tardArrayLaguntzailea = ARRAY[1..50] OF trdIbilgailua ;
CONST
sBIDEA = 'C:\Radarrak\' ;
PROCEDURE FitxategiakSortu(sFitxIzenA, sFitxIzenB : tsKateIzena) ;
VAR
f1, f2 : tfrdRadarrenFitxategia ;
rdFitxa : trdIbilgailua ;
iZenbat, iAusazkoa, iKont, k : Integer ;
rAusazkoa : Real ;
sMatrikula, sMatrikulaZifra : tsKateMatrikula ;
BEGIN
Assign(f1, sFitxIzenA) ;
Rewrite(f1) ;
Assign(f2, sFitxIzenB) ;
Rewrite(f2) ;
Randomize ;
iZenbat := 12 + Random(12) ;
FOR iKont:=1 TO iZenbat DO
BEGIN
sMatrikula := '' ;
FOR k:=1 TO 4 DO
BEGIN
iAusazkoa := Random(10) ;
Str(iAusazkoa, sMatrikulaZifra) ;
sMatrikula := sMatrikula + sMatrikulaZifra ;
END ;
iAusazkoa := Random(12) ;
CASE iAusazkoa OF
0: rdFitxa.sMatrikula := sMatrikula + ' XYZ' ;
1: rdFitxa.sMatrikula := sMatrikula + ' BPK' ;
2: rdFitxa.sMatrikula := sMatrikula + ' ZTE' ;
3: rdFitxa.sMatrikula := sMatrikula + ' QQZ' ;
4: rdFitxa.sMatrikula := sMatrikula + ' KMY' ;
5: rdFitxa.sMatrikula := sMatrikula + ' TLE' ;
6: rdFitxa.sMatrikula := sMatrikula + ' YRS' ;
7: rdFitxa.sMatrikula := sMatrikula + ' BCZ' ;
8: rdFitxa.sMatrikula := sMatrikula + ' EFZ' ;
9: rdFitxa.sMatrikula := sMatrikula + ' ZTE' ;
10: rdFitxa.sMatrikula := sMatrikula + ' FAK' ;
11: rdFitxa.sMatrikula := sMatrikula + ' HUT' ;
END ;
iAusazkoa := Random(4) ;
CASE iAusazkoa OF
0: rdFitxa.cIbilgailuMota := 'A' ;
1: rdFitxa.cIbilgailuMota := 'B' ;
2: rdFitxa.cIbilgailuMota := 'C' ;
3: rdFitxa.cIbilgailuMota := 'D' ;
END ;
rdFitxa.rdUnea.iOrduak := 14 ; (* 14:45:00 eta 14:55:59 artean *)
rdFitxa.rdUnea.iMinutuak := 45 + Random(11) ;
rdFitxa.rdUnea.iSegundoak := Random(60) ;
rAusazkoa := Random ;
rdFitxa.rAbiadura := Random(200) * rAusazkoa ;
Write(f1, rdFitxa) ;
rdFitxa.rdUnea.iOrduak := 15 ; (* 15:05:00 eta 15:15:59 artean *)
rdFitxa.rdUnea.iMinutuak := 5 + Random(11) ;
rdFitxa.rdUnea.iSegundoak := Random(60) ;
rAusazkoa := Random ;
rdFitxa.rAbiadura := Random(200) * rAusazkoa ;
Write(f2, rdFitxa) ;
END ;
Close(f1) ;
Close(f2) ;
END ;
PROCEDURE FitxategiaErakutsi(sFitxIzen : tsKateIzena) ;
VAR
f : tfrdRadarrenFitxategia ;
rdFitxa : trdIbilgailua ;
iKont : Integer ;
BEGIN
Assign(f, sFitxIzen) ;
Reset(f) ;
iKont := 0 ;
WriteLn('Matrikula':35, 'Mota':7, 'Unea':13, 'Abiadura':12) ;
WHILE NOT Eof(f) DO
BEGIN
Read(f, rdFitxa) ;
iKont := iKont + 1 ;
Write(iKont:7, '. datua --->') ;
Write(rdFitxa.sMatrikula:16, rdFitxa.cIbilgailuMota:7) ;
Write(rdFitxa.rdUnea.iOrduak:7,
':', rdFitxa.rdUnea.iMinutuak:2,
':', rdFitxa.rdUnea.iSegundoak:2,
rdFitxa.rAbiadura:12:1) ;
WriteLn ;
END ;
Close(f) ;
END ;
PROCEDURE FitxategiArray(sFitxIzen : tsKateIzena;
VAR ardArrayLaguntzailea : tardArrayLaguntzailea;
VAR iLuzera : Integer) ;
VAR
f : tfrdRadarrenFitxategia ;
rdFitxa : trdIbilgailua ;
BEGIN
Assign(f, sFitxIzen) ;
Reset(f) ;
iLuzera := 0 ;
WHILE NOT Eof(f) DO
BEGIN
Read(f, rdFitxa) ;
iLuzera := iLuzera + 1 ;
ardArrayLaguntzailea[iLuzera] := rdFitxa ;
END ;
Close(f) ;
END ;
PROCEDURE ArrayFitxategi( sFitxIzen : tsKateIzena;
CONST ardArrayLaguntzailea : tardArrayLaguntzailea;
iLuzera : Integer) ;
VAR
f : tfrdRadarrenFitxategia ;
rdFitxa : trdIbilgailua ;
iIndizea : Integer ;
BEGIN
Assign(f, sFitxIzen) ;
Rewrite(f) ;
FOR iIndizea:=1 TO iLuzera DO
BEGIN
rdFitxa := ardArrayLaguntzailea[iIndizea] ;
Write(f, rdFitxa) ;
END ;
Close(f) ;
END ;
FUNCTION fnliSegundoak(CONST rdUnea: trdUnea) : LongInt ;
BEGIN
WITH rdUnea DO
fnliSegundoak := iOrduak * 3600 + iMinutuak * 60 + iSegundoak ;
END ;
PROCEDURE ArrayaOrdenatu(VAR ardBekt : tardArrayLaguntzailea; iLuzera : Integer) ;
VAR
iPos, j, k : Integer ;
liMin : LongInt ;
rdIbilgailua : trdIbilgailua ;
BEGIN
FOR k:=1 TO iLuzera-1 DO
BEGIN
liMin := fnliSegundoak(ardBekt[k].rdUnea) ;
rdIbilgailua := ardBekt[k] ;
iPos := k ;
FOR j:=k+1 TO iLuzera DO (* ordenatu gabekoen artean *)
BEGIN
IF liMin > fnliSegundoak(ardBekt[j].rdUnea) THEN (* minimoa aurkitu *)
BEGIN
liMin := fnliSegundoak(ardBekt[j].rdUnea) ;
rdIbilgailua := ardBekt[j] ;
iPos := j ;
END ;
END ;
ardBekt[iPos] := ardBekt[k] ; (* trukatu, tokiz aldatuz *)
ardBekt[k] := rdIbilgailua ;
END;
END ;
PROCEDURE FitxategiaUnearekikoOrdenatu(sFitxIzen : tsKateIzena) ;
VAR
ardArrayLaguntzailea : tardArrayLaguntzailea ;
iLuzera : Integer ;
BEGIN
FitxategiArray(sFitxIzen, ardArrayLaguntzailea, iLuzera) ;
ArrayaOrdenatu(ardArrayLaguntzailea, iLuzera) ;
ArrayFitxategi(sFitxIzen, ardArrayLaguntzailea, iLuzera) ;
END ;
{ ---------------- Programa Nagusia ----------------}
VAR
sFitxIzenA, sFitxIzenB : tsKateIzena ;
BEGIN
Writeln ;
WriteLn('''', sBIDEA, ''' karpetan lan eginez...') ;
Writeln ;
WriteLn('Sarrerako radarrari dagokion fitxategiaren izena eman. Adibidez: A_190430') ;
WriteLn('Sistemak DAT luzapena gehituko dio eta "C:\Radarrak" karpetan kokatuko du') ;
Write('Sarrerako radarraren izena eman: ') ;
ReadLn(sFitxIzenA) ;
sFitxIzenA := sBIDEA + sFitxIzenA + '.DAT' ;
WriteLn('Irteerako radarrari dagokion fitxategiaren izena eman. Adibidez: B_190430') ;
WriteLn('Sistemak DAT luzapena gehituko dio eta "C:\Radarrak" karpetan kokatuko du') ;
Write('Irteerako radarraren izena eman: ') ;
ReadLn(sFitxIzenB) ;
sFitxIzenB := sBIDEA + sFitxIzenB + '.DAT' ;
FitxategiakSortu(sFitxIzenA, sFitxIzenB) ;
FitxategiaUnearekikoOrdenatu(sFitxIzenA) ; (* sarrerako unerik txikiena lehenik *)
FitxategiaUnearekikoOrdenatu(sFitxIzenB) ; (* irteerako unerik txikiena lehenik *)
WriteLn ;
WriteLn ;
WriteLn('Sarrerako radarraren informazioa gordetzen duen fitxategiaren edukia ikusi: ') ;
FitxategiaErakutsi(sFitxIzenA) ;
WriteLn ;
WriteLn ;
WriteLn('Irteerako radarraren informazioa gordetzen duen fitxategiaren edukia ikusi: ') ;
FitxategiaErakutsi(sFitxIzenB) ;
WriteLn ;
WriteLn ;
WriteLn('====================================================') ;
WriteLn(' RETURN sakatu amaitzeko') ;
Write('====================================================') ;
ReadLn ;
END. { PROGRAMAREN BUKAERA }
Radarrak2019.pas programa exekutatu
Radarrak2019.pas programa exekutatu eta C:\Radarrak karpetan dauden A_190430.dat eta B_190430.dat fitxategien prozesaketari ekingo zaio. Horretarako, radarren arteko distantzia emango da eta horrekin batera abiadura maximoa ere emango da.
Gero, hiru aukerako menu batek gidatuko du programaren exekuzioa:
Radarrak2019.pas programa
{------------------------------------------------------------------------------
2019ko talde-ariketa.
'Radarrak_DatuakLortzen.pas' programak ematen dituen fitxategiak prozesatu
nahi dira 'Radarrak.pas' programaren bitartez (bere menuak 3+1 aukera ditu).
-------------------------------------------------------------------------------}
PROGRAM Radarrak_2019 ;
USES
Crt, SysUtils ;
TYPE
tsKateIzena = String[200] ;
tsKateMatrikula = String[10] ;
trdUnea = RECORD
iOrduak, iMinutuak, iSegundoak : Integer ;
END ;
trdIbilgailua = RECORD
sMatrikula : tsKateMatrikula ;
cIbilgailuMota : Char ;
rdUnea : trdUnea ;
rAbiadura : Real ;
END ;
tfrdRadarrenFitxategia = FILE OF trdIbilgailua ;
trdArauHauslea = RECORD
sMatrikula : tsKateMatrikula ;
rdUnea : trdUnea ;
rAbiadura : Real ;
END ;
tfrdArauHausleenFitxategia = FILE OF trdArauHauslea ;
taiEstatistikaDatuak = ARRAY['A'..'D'] OF Integer ;
CONST
sBIDEA = 'C:\Radarrak\' ;
FUNCTION fncAukeraIrakurri : Char ;
VAR
cAukera : Char ;
BEGIN
ClrScr ;
Writeln('========== Aukerak ==========') ;
Writeln(' 1 Estatistikak') ;
Writeln(' 2 Arau-hausteak kalkulatu') ;
Writeln(' 3 Arau-hausteak pantailaratu') ;
Writeln ;
Writeln(' 0 Programatik irten') ;
Writeln ;
Write(' Aukerari dagokion zenbakia sakatu: ') ;
REPEAT
cAukera := ReadKey ;
UNTIL ('0' <= cAukera) AND(cAukera <= '3') ;
Writeln(cAukera) ;
Writeln ;
fncAukeraIrakurri := cAukera ;
END ;
PROCEDURE EstatistikenArrayaSortu(sRadarFitxIzen: tsKateIzena ;
VAR aiEstatistikak: taiEstatistikaDatuak) ;
VAR
cIndizea : Char ;
frdRadar : tfrdRadarrenFitxategia ;
rdIbilgailua : trdIbilgailua ;
BEGIN
FOR cIndizea := 'A' TO 'D' DO
aiEstatistikak[cIndizea] := 0 ;
Assign(frdRadar, sRadarFitxIzen) ;
Reset(frdRadar) ;
WHILE NOT EOF(frdRadar) DO
BEGIN
Read(frdRadar, rdIbilgailua) ;
cIndizea := rdIbilgailua.cIbilgailuMota ;
aiEstatistikak[cIndizea] := aiEstatistikak[cIndizea] + 1 ;
END ;
Close(frdRadar) ;
END ;
PROCEDURE EstatistikakErakutsi(CONST aiEstatistikak : taiEstatistikaDatuak) ;
VAR
cIndizea : Char ;
BEGIN
Writeln ;
Writeln('Ibilgailuen kopurua mota bakoitzeko') ;
Writeln ;
FOR cIndizea := 'A' TO 'D' DO
Write('Mota ':9, cIndizea) ;
Writeln ;
FOR cIndizea := 'A' TO 'D' DO
Write(aiEstatistikak[cIndizea]:10) ;
Writeln ;
END ;
FUNCTION fnrSegundoakLortu(CONST rdUnea: trdUnea) : Real ;
BEGIN
WITH rdUnea DO
fnrSegundoakLortu := iOrduak * 3600.0 + iMinutuak * 60.0 + iSegundoak ;
END ;
PROCEDURE IrteerakoUneaBilatu(sMatrikulaHauBilatu : tsKateMatrikula ;
CONST rdSarrerakoUnea : trdUnea ;
sIrteeraFitxIzen : tsKateIzena ;
VAR rdIrteerakoUnea : trdUnea ;
VAR boTartetikIrtenDa : Boolean) ;
VAR
frgIrteera : tfrdRadarrenFitxategia ;
rdIbilgailua : trdIbilgailua ;
sSarreraUnekoSegundoak : Real ;
BEGIN
boTartetikIrtenDa := FALSE ;
Assign(frgIrteera, sIrteeraFitxIzen) ;
Reset(frgIrteera) ;
sSarreraUnekoSegundoak := fnrSegundoakLortu(rdSarrerakoUnea) ;
WHILE NOT boTartetikIrtenDa AND NOT EOF(frgIrteera) DO
BEGIN
Read(frgIrteera, rdIbilgailua) ;
WITH rdIbilgailua DO
IF(sMatrikula = sMatrikulaHauBilatu) AND
(sSarreraUnekoSegundoak < fnrSegundoakLortu(rdUnea)) THEN
BEGIN
boTartetikIrtenDa := TRUE ;
rdIrteerakoUnea := rdUnea
END ;
END ;
Close(frgIrteera) ;
END ;
FUNCTION fnrBatazbestekoAbiaduraKalkulatu(CONST rdSarrerakoUnea, rdIrteerakoUnea : trdUnea ;
rDistantzia: Real) : Real ;
VAR
rSarrerakoSegundoak, rIrteerakoSegundoak : Real ;
BEGIN
rSarrerakoSegundoak := fnrSegundoakLortu(rdSarrerakoUnea) ;
rIrteerakoSegundoak := fnrSegundoakLortu(rdIrteerakoUnea) ;
{ batazbesteko abiadura Km/H }
fnrBatazbestekoAbiaduraKalkulatu := rDistantzia /(rIrteerakoSegundoak - rSarrerakoSegundoak) * 3600.0 ;
END ;
PROCEDURE HausteakFitxategiaSortu(sSarreraFitxIzen, sIrteeraFitxIzen, sArauHausleFitxIzen: tsKateIzena ;
rTartearenDistantzia, rAbiaduraMuga: Real) ;
VAR
fR : tfrdRadarrenFitxategia ;
rdSarrerakoIbilgailua : trdIbilgailua ;
fH : tfrdArauHausleenFitxategia ;
rdIbilgailuUrratzailea : trdArauHauslea ;
rBatazbestekoAbiadura : Real ;
rdIrteerakoUnea : trdUnea ;
boTartetikIrtenDa : Boolean ;
BEGIN
Assign(fR, sSarreraFitxIzen) ;
Reset(fR) ;
Assign(fH, sArauHausleFitxIzen) ;
Rewrite(fH) ;
WHILE NOT EOF(fR) DO
BEGIN
Read(fR, rdSarrerakoIbilgailua) ;
IrteerakoUneaBilatu(rdSarrerakoIbilgailua.sMatrikula,
rdSarrerakoIbilgailua.rdUnea,
sIrteeraFitxIzen,
rdIrteerakoUnea, boTartetikIrtenDa) ;
IF boTartetikIrtenDa THEN { Irteerako daturik aurkitu bada }
BEGIN
rBatazbestekoAbiadura := fnrBatazbestekoAbiaduraKalkulatu
(rdSarrerakoIbilgailua.rdUnea,
rdIrteerakoUnea,
rTartearenDistantzia) ;
IF rBatazbestekoAbiadura > rAbiaduraMuga THEN
BEGIN
rdIbilgailuUrratzailea.sMatrikula := rdSarrerakoIbilgailua.sMatrikula ;
rdIbilgailuUrratzailea.rdUnea := rdSarrerakoIbilgailua.rdUnea ;
rdIbilgailuUrratzailea.rAbiadura := rBatazbestekoAbiadura ;
Write(fH, rdIbilgailuUrratzailea) ;
END ;
END ;
END ;
Close(fH) ;
Close(fR) ;
END ;
PROCEDURE HausteakFitxategiaErakutsi(sArauHausleFitxIzen: tsKateIzena) ;
VAR
fAH : tfrdArauHausleenFitxategia ;
rdIbilgailuUrratzailea : trdArauHauslea ;
BEGIN
Assign(fAH, sArauHausleFitxIzen) ;
Reset(fAH) ;
Writeln('--------------- Arau-hausteak(hasiera) ---------------------------') ;
Writeln('Matrikula': 12, 'Sarrera':14, 'Batazbesteko abiadura KM/H':36) ;
WHILE NOT EOF(fAH) DO
BEGIN
Read(fAH, rdIbilgailuUrratzailea) ;
WITH rdIbilgailuUrratzailea, rdUnea DO
WriteLn(sMatrikula: 12,
iOrduak:8, ':', iMinutuak:2, ':', iSegundoak:2,
rAbiadura:24:2) ;
END ;
Writeln('--------------- Arau-hausteak(bukaera) ---------------------------') ;
Close(fAH) ;
END ;
{----------------------- Programa Nagusia -----------------------}
VAR
cAukera, cItxoin : Char ;
sFitxategienData : tsKateMatrikula ;
sSarreraFitxIzen, sIrteeraFitxIzen : tsKateIzena ;
sArauHausleFitxIzen : tsKateIzena ;
rTartearenDistantzia, rAbiaduraMuga : Real ;
aiEstatistikak : taiEstatistikaDatuak ;
BEGIN
Writeln ;
WriteLn('''', sBIDEA, ''' karpetan lan eginez...') ;
Writeln ;
WriteLn('Egunari dagokion data eman UUHHEE formatuan. Adibidez: 190430.') ;
WriteLn('Sarrerako radarraren fitxategiaren izena A_190430 izango da eta') ;
WriteLn('irteerako radarraren fitxategiaren izena B_190430 izango da. Sistemak') ;
WriteLn('DAT luzapena gehitu ondoren "C:\Radarrak" karpetan kokatuko ditu.') ;
Write('UUHHEE data eman: ') ;
ReadLn(sFitxategienData) ;
sSarreraFitxIzen := sBIDEA + 'A_' + sFitxategienData + '.DAT' ;
sIrteeraFitxIzen := sBIDEA + 'B_' + sFitxategienData + '.DAT' ;
IF FileExists(sSarreraFitxIzen) AND FileExists(sIrteeraFitxIzen) THEN
BEGIN
Writeln ;
Write('Eman kontrolatu beharreko tartearen distantzia (KM), adibidez 40 KM: ') ;
ReadLn(rTartearenDistantzia) ;
Write('Eman batazbesteko abidura maximoa tartean (KM/H), adibidez 120 KM/H: ') ;
ReadLn(rAbiaduraMuga) ;
REPEAT
cAukera := fncAukeraIrakurri ;
CASE cAukera OF
'1' : BEGIN
EstatistikenArrayaSortu(sSarreraFitxIzen, aiEstatistikak) ;
EstatistikakErakutsi(aiEstatistikak) ;
END ;
'2' : BEGIN
sArauHausleFitxIzen := sBIDEA + 'I_' + sFitxategienData + '.DAT' ;
Write('Arau urratzaileei dagokien fitxategiaren izena: ') ;
Writeln(sArauHausleFitxIzen) ;
HausteakFitxategiaSortu(sSarreraFitxIzen,
sIrteeraFitxIzen,
sArauHausleFitxIzen,
rTartearenDistantzia, rAbiaduraMuga)
END ;
'3' : BEGIN
sArauHausleFitxIzen := sBIDEA + 'I_' + sFitxategienData + '.DAT' ;
Write('Arau urratzaileei dagokien fitxategiaren izena: ') ;
Writeln(sArauHausleFitxIzen) ;
WriteLn ;
Write('Tartearen distantzia ', rTartearenDistantzia:0:1, ' Km');
WriteLn('Abiaduraren muga tartean ':40, rAbiaduraMuga:0:1, ' Km/h') ;
IF FileExists(sArauHausleFitxIzen) THEN
HausteakFitxategiaErakutsi(sArauHausleFitxIzen)
ELSE
Writeln('ERROREA: ''', sArauHausleFitxIzen, ''' fitxategia ez da existitzen!') ;
END ;
END ; { CASE }
IF cAukera <> '0' THEN
BEGIN
Writeln ;
cItxoin := ReadKey ;
WriteLn(cItxoin) ;
END ;
UNTIL cAukera = '0' ;
END { IF existentzia }
ELSE
BEGIN
IF NOT FileExists(sSarreraFitxIzen) THEN
WriteLn('ERROREA: ''', sSarreraFitxIzen, ''' fitxategia ez da existitzen!') ;
IF NOT FileExists(sIrteeraFitxIzen) THEN
WriteLn('ERROREA: ''', sIrteeraFitxIzen, ''' fitxategia ez da existitzen!') ;
WriteLn('Programa amaitzera doa.') ;
ReadLn ;
END;
END. { PROGRAMAREN BUKAERA }



iruzkinik ez:
Argitaratu iruzkina