program
AparkalekuakDerrigorrezkoAginduak_2024;
uses
crt, sysutils;
const
ZENBAT_APARKALEKU =
100
;
GAU_BATEN_KOSTUA =
15
;
MINUTU_BATEN_KOSTUA =
0.011
;
GAU_KOPURU_MAXIMOA =
2
;
MAX =
4080
;
sBIDEA = 'C:\Datuak\';
type
integer
=
smallint
;
real
=
double
;
tsKate200 =
string
[
200
];
tsKate10 =
string
[
10
];
tsKate8 =
string
[
8
];
tsKate2 =
string
[
2
];
trdData =
record
iUrtea, iHila, iEguna:
integer
;
end
;
trdUnea =
record
iOrduak, iMinutuak, iSegundoak:
integer
;
end
;
trdAutoarenDatuak =
record
sMatrikula : tsKate8;
rdSarreraData: trdData;
rdSarreraUnea: trdUnea;
rdIrteeraData: trdData;
rdIrteeraUnea: trdUnea;
iGauKopurua :
integer
;
rZenbatekoa :
real
;
end
;
tardParking =
array
[
1..
MAX]
of
trdAutoarenDatuak;
tfrdParking =
file
of
trdAutoarenDatuak;
procedure
prFitxategiaSortu(sFitxIzen: tsKate200);
var
f: tfrdParking;
begin
assign(f, sFitxIzen);
REWRITE(f);
close(f);
writeln
(
'"'
, sFitxIzen,
'" izeneko fitxategia berriki sortu da'
);
end
;
procedure
prFitxategitikArrayra( sFitxIzen : tsKate200;
var
ardParking: tardParking;
var
iLuzera :
integer
);
var
f: tfrdParking;
begin
iLuzera :=
0
;
assign(f, sFitxIzen);
reset(f);
while
not
eof(f)
do
begin
iLuzera := iLuzera +
1
;
READ(f, ardParking[iLuzera]);
ARDPARKING[iLuzera].iGauKopurua := ardParking[iLuzera].iGauKopurua +
1
;
end
;
close(f);
end
;
function
fniZenbatAutoBarruan(
const
ardAparkalekua: tardParking;
iLuzera :
integer
):
integer
;
var
iKont, iZenbat:
integer
;
begin
iZenbat :=
0
;
for
iKont:=
1
to
iLuzera
do
begin
if
ardAparkalekua[iKont].rZenbatekoa =
0.0
then
iZenbat := iZenbat +
1
;
end
;
fniZenbatAutoBarruan := iZenbat;
end
;
function
fncAukeraIrakurri:
char
;
var
cAukera:
char
;
begin
clrscr;
writeln
;
writeln
;
writeln
(
'**************************** MENUA ****************************'
);
writeln
(
' 1. Auto baten sarrera'
);
writeln
(
' 2. Auto baten irteera'
);
writeln
(
' 3. Parking-ean dauden autoen informazioa pantailaratu'
);
writeln
;
writeln
(
' 0. Amaitu'
);
writeln
(
'***************************************************************'
);
writeln
;
write
(
' Zure aukera hautatu: '
);
repeat
READLN(cAukera);
until
(cAukera >=
'0'
)
and
(cAukera <=
'3'
);
FNCAUKERAIRAKURRI := cAukera;
end
;
procedure
SartutakoAutoarenDatuakLortu(
var
rdAutoa: trdAutoarenDatuak);
begin
writeln
(
'Sartu berria den autoaren sarrerako datuak eskuratu dira:'
);
writeln
(
'matrikula, sarrera-data eta sarrera-unea (gainerakoak 0 dira)'
);
with
rdAutoa
do
begin
sMatrikula :=
'1234-XYZ'
;
rdSarreraData
.
iUrtea :=
2024
;
rdSarreraData
.
iHila :=
6
;
rdSarreraData
.
iEguna :=
28
;
rdSarreraUnea
.
iOrduak :=
9
;
rdSarreraUnea
.
iMinutuak :=
20
;
rdSarreraUnea
.
iSegundoak :=
2
;
rdIrteeraData
.
iUrtea :=
0
;
rdIrteeraData
.
iHila :=
0
;
rdIrteeraData
.
iEguna :=
0
;
rdIrteeraUnea
.
iOrduak :=
0
;
rdIrteeraUnea
.
iMinutuak :=
0
;
rdIrteeraUnea
.
iSegundoak :=
0
;
iGauKopurua :=
0
;
rZenbatekoa :=
0.0
;
writeln
(
'"'
, sMatrikula,
'"'
,
' autoaren sarrerako data: '
, rdSarreraData
.
iUrtea,
'-'
,
rdSarreraData
.
iHila,
'-'
,
rdSarreraData
.
iEguna);
writeln
(
'"'
, sMatrikula,
'"'
,
' autoaren sarrerako unea: '
, rdSarreraUnea
.
iOrduak,
':'
,
rdSarreraUnea
.
iMinutuak,
':'
,
rdSarreraUnea
.
iSegundoak);
end
;
end
;
procedure
DataIrakurri(
var
rdIrteerarenData: trdData);
begin
rdIrteerarenData
.
iUrtea :=
2024
;
rdIrteerarenData
.
iHila :=
6
;
rdIrteerarenData
.
iEguna :=
28
;
end
;
procedure
UneaIrakurri(
var
rdIrteerarenUnea: trdUnea);
begin
rdIrteerarenUnea
.
iOrduak :=
10
;
rdIrteerarenUnea
.
iMinutuak :=
50
;
rdIrteerarenUnea
.
iSegundoak :=
7
;
end
;
function
fniMatrikulaBilatu( sZeinMatrikula: tsKate8;
const
ardParking : tardParking;
iLuzera :
integer
):
integer
;
var
boAurkitua:
Boolean
;
i:
integer
;
begin
boAurkitua :=
FALSE
;
i :=
1
;
while
(
not
boAurkitua)
and
(i <= iLuzera)
do
if
(ardParking[i].sMatrikula = sZeinMatrikula)
and
(ardParking[i].rZenbatekoa =
0.0
)
then
boAurkitua :=
TRUE
else
i := i +
1
;
if
boAurkitua
then
FNIMATRIKULABILATU := i
else
FNIMATRIKULABILATU := -
1
;
end
;
function
fnliSegundoakKalkulatu(
const
rdUnea: trdUnea):
longint
;
begin
FNLISEGUNDOAKKALKULATU := rdUnea
.
iOrduak*
3600
+ rdUnea
.
iMinutuak*
60
+ rdUnea
.
iSegundoak;
end
;
function
fnsDataBihurtu(
const
rdData: trdData): tsKate10;
var
sKatea : tsKate10;
sBiDigitu: tsKate2;
begin
str(rdData
.
iUrtea, sKatea);
if
length(sKatea) =
1
then
sKatea :=
'000'
+ sKatea;
sKatea := sKatea +
'-'
;
str(rdData
.
iHila, sBiDigitu);
if
length(sBiDigitu) =
1
then
sBiDigitu :=
'0'
+ sBiDigitu;
sKatea := sKatea + sBiDigitu +
'-'
;
str(rdData
.
iEguna, sBiDigitu);
if
length(sBiDigitu) =
1
then
sBiDigitu :=
'0'
+ sBiDigitu;
sKatea := sKatea + sBiDigitu;
FNSDATABIHURTU := sKatea;
end
;
function
fnsUneaBihurtu(
const
rdUnea: trdUnea): tsKate8;
var
sKatea : tsKate8;
sBiDigitu: tsKate2;
begin
str(rdUnea
.
iOrduak, sKatea);
if
length(sKatea) =
1
then
sKatea :=
'0'
+ sKatea;
sKatea := sKatea +
':'
;
str(rdUnea
.
iMinutuak, sBiDigitu);
if
length(sBiDigitu) =
1
then
sBiDigitu :=
'0'
+ sBiDigitu;
sKatea := sKatea + sBiDigitu +
':'
;
str(rdUnea
.
iSegundoak, sBiDigitu);
if
length(sBiDigitu) =
1
then
sBiDigitu :=
'0'
+ sBiDigitu;
sKatea := sKatea + sBiDigitu;
FNSUNEABIHURTU := sKatea;
end
;
procedure
prAutoBatenDatuakPantailaratu(
const
rdAutoa: trdAutoarenDatuak);
var
sData: tsKate10;
sUnea: tsKate8;
begin
with
rdAutoa
do
begin
sData := fnsDataBihurtu(rdSarreraData);
sUnea := fnsUneaBihurtu(rdSarreraUnea);
WRITELN
(sMatrikula:
9
,
' '
:
3
, sData,
' '
, sUnea, iGauKopurua:
9
);
end
;
end
;
procedure
prGoikoLerroaErakutsi;
var
i:
integer
;
begin
writeln
(
'MATRIKULA'
,
'SARRERA'
:
22
,
'GAUAK'
:
9
);
for
i:=
1
to
40
do
WRITE
(
'-'
);
WRITELN
;
end
;
procedure
prBarruanDaudenAutoakErakutsi(
const
ardAparkalekua: tardParking;
iLuzera :
integer
);
var
i:
integer
;
begin
writeln
;
prGoikoLerroaErakutsi;
FOR
i :=
1
TO
iLuzera
DO
if
ardAparkalekua[i].rZenbatekoa =
0.0
then
prAutoBatenDatuakPantailaratu(ardAparkalekua[i]);
end
;
procedure
prZenbatekoaKalkulatu(
var
rdAutoa: trdAutoarenDatuak);
var
rEuroak :
real
;
iMinutuKopurua:
longint
;
begin
if
rdAutoa
.
iGauKopurua >
0
then
rEuroak := rdAutoa
.
iGauKopurua*GAU_BATEN_KOSTUA
else
begin
iMinutuKopurua := fnliSegundoakKalkulatu(rdAutoa
.
rdIrteeraUnea) -
fnliSegundoakKalkulatu(rdAutoa
.
rdSarreraUnea);
iMinutuKopurua := iMinutuKopurua
div
60
;
rEuroak := iMinutuKopurua*MINUTU_BATEN_KOSTUA;
end
;
RDAUTOA
.
RZENBATEKOA := rEuroak;
end
;
procedure
prDatuakFitxategietanGorde(
const
ardParking : tardParking;
iLuzera :
integer
;
sFitxIzenHistorikoa,
sFitxIzenBezpera,
sFitxIzenGarabia : tsKate200);
var
i :
integer
;
fH, fB, fG: tfrdParking;
begin
assign(fH, sFitxIzenHistorikoa);
RESET(fH);
SEEK(fH, fileSize(fH));
assign(fB, sFitxIzenBezpera);
REWRITE(fB);
assign(fG, sFitxIzenGarabia);
REWRITE(fG);
for
i:=
1
to
iLuzera
do
begin
with
ardParking[i]
do
if
rZenbatekoa <>
0.0
then
WRITE
(fH, ardParking[i])
else
if
iGauKopurua = GAU_KOPURU_MAXIMOA
then
WRITE
(fG, ardParking[i])
else
WRITE
(fB, ardParking[i]);
end
;
close(fH);
close(fB);
close(fG);
end
;
var
sFitxIzenHistorikoa, sFitxIzenBezpera, sFitxIzenGarabia: tsKate200;
cAukera, cItxaron :
char
;
ardParking : tardParking;
iPlazaLibreak, iLuzeraArray, iPosizioa :
integer
;
rdIrteerarenUnea : trdUnea;
rdGaurkoData : trdData;
sGaurkoData : tsKate10;
sMatrikula : tsKate8;
rdAutoa : trdAutoarenDatuak;
begin
writeln
;
writeln
(
'Aparkaleku bat kudeatzeko programa'
);
writeln
(
'----------------------------------'
);
writeln
(
'Informazioa gordeko duten fitxategien direktorioa: "'
, sBIDEA,
'"'
);
writeln
(
'Informazioa gordeko duten fitxategien izenak eman...'
);
writeln
;
write
(
'Parking-aren informazio historikoa (adib. HISTORIKOA): '
);
readln(sFitxIzenHistorikoa);
sFitxIzenHistorikoa := sBIDEA + sFitxIzenHistorikoa +
'.DAT'
;
if
not
fileExists(sFitxIzenHistorikoa)
then
begin
prFitxategiaSortu(sFitxIzenHistorikoa);
end
;
write
(
' Bezperako jardueraren informazioa (adib. BEZPERAKOA): '
);
readln(sFitxIzenBezpera);
sFitxIzenBezpera := sBIDEA + sFitxIzenBezpera +
'.DAT'
;
if
not
fileExists(sFitxIzenBezpera)
then
begin
prFitxategiaSortu(sFitxIzenBezpera);
end
;
write
(
' Garabiaren fitxategiaren izena (adib. GARABIA): '
);
readln(sFitxIzenGarabia);
sFitxIzenGarabia := sBIDEA + sFitxIzenGarabia +
'.DAT'
;
prFitxategitikArrayra(sFitxIzenBezpera, ardParking, iLuzeraArray);
iPlazaLibreak := ZENBAT_APARKALEKU - fniZenbatAutoBarruan(ardParking, iLuzeraArray);
writeln
;
writeln
(
'Egunaren hasieran '
, iPlazaLibreak,
' plaza-libre eskaintzen dira'
);
writeln
;
writeln
(
'Edozein tekla sakatu aurrera egiteko...'
);
cItxaron := readKey;
write
(cItxaron);
repeat
cAukera := fncAukeraIrakurri;
writeln
;
case
cAukera
of
'1'
:
if
iPlazaLibreak =
0
then
writeln
(
'Aparkalekua beterik dago!'
)
else
begin
SartutakoAutoarenDatuakLortu(rdAutoa);
iLuzeraArray := iLuzeraArray +
1
;
ardParking[iLuzeraArray] := rdAutoa;
iPlazaLibreak := iPlazaLibreak -
1
;
writeln
;
writeln
(iPlazaLibreak,
' aparkaleku-plaza libre geratzen dira oraindik'
);
end
;
'2'
:
begin
write
(
'Irtetera doan autoaren matrikula eman (1234-XYZ): '
);
readln(sMatrikula);
sMatrikula := upcase(sMatrikula);
iPosizioa := fniMatrikulaBilatu(sMatrikula, ardParking, iLuzeraArray);
if
iPosizioa = -
1
then
begin
writeln
(sMatrikula,
' matrikuladun auto hori ez dago aparkalekuan'
);
end
else
begin
writeln
;
DataIrakurri(rdGaurkoData);
writeln
(
'Autoaren irteerako data: '
, rdGaurkoData
.
iUrtea,
'-'
,
rdGaurkoData
.
iHila,
'-'
,
rdGaurkoData
.
iEguna);
UneaIrakurri(rdIrteerarenUnea);
writeln
(
'Autoaren irteerako unea: '
, rdIrteerarenUnea
.
iOrduak,
':'
,
rdIrteerarenUnea
.
iMinutuak,
':'
,
rdIrteerarenUnea
.
iSegundoak);
ardParking[iPosizioa].rdIrteeraData := rdGaurkoData;
ardParking[iPosizioa].rdIrteeraUnea := rdIrteerarenUnea;
prZenbatekoaKalkulatu(ardParking[iPosizioa]);
writeln
(
'Egonaldiaren zenbatekoa '
, ardParking[iPosizioa].rZenbatekoa:
0
:
2
,
' euro dira'
);
iPlazaLibreak := iPlazaLibreak +
1
;
writeln
;
writeln
(
'Orain '
, iPlazaLibreak,
' plaza-libre geratzen dira'
);
end
;
end
;
'3'
:
if
iPlazaLibreak = ZENBAT_APARKALEKU
then
writeln
(
'Autorik ez, aparkalekua hutsik dago!'
)
else
prBarruanDaudenAutoakErakutsi(ardParking, iLuzeraArray);
'0'
:
prDatuakFitxategietanGorde(ardParking, iLuzeraArray,
sFitxIzenHistorikoa,
sFitxIzenBezpera,
sFitxIzenGarabia);
end
;
if
cAukera <>
'0'
then
begin
writeln
;
writeln
(
'Edozein tekla sakatu aurrera egiteko...'
);
cItxaron := readKey;
write
(cItxaron);
end
;
until
cAukera =
'0'
;
DataIrakurri(rdGaurkoData);
sGaurkoData := fnsDataBihurtu(rdGaurkoData);
writeln
(
'Gaurko ('
, sGaurkoData,
') lana bukatu denez, programa amaituko da.'
);
writeln
;
writeln
(
'======================='
);
writeln
(
'RETURN sakatu amaitzeko'
);
write
(
'======================='
);
readln;
end
.