-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2dafecha.pas
145 lines (117 loc) · 4.72 KB
/
2dafecha.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
//Un salon de eventos necesita administrar la informacion de las reservas de marzo de 2024.
//Se dispone de una lista con la informacion de las reservas. De cada reserva se conoce:
//numero de reserva, DNI del cliente, dia del evento (1..31), hora de inicio, hora de fin
//y categoria de servicio (1..18). Ademas, se dispone de un vector con el precio por hora
//de reserva de acuerdo a cada categoria de servicio. Se pide recorrer la lista una sola vez
//para:
// a)Generar una nueva lista con numero y precio total de cada reserva. Esta estructura debe
//generarse ordenada por el precio total de cada reserva.
// b)Informar los dos dias del mes con menor cantidad de reservas de clientes con DNI impar.
// c)Informar el porcentaje de reservas de eventos que inciden despues de las 12 hs y se produzcan
// en la segunda quincena.
//NOTA: La hora de fin no excede las 23 hs. Hacer el programa principal. Modularizar.
program segundafecha;
uses GenericLinkedList;
const
dimCat = 18;
type
eventos = record
numReserva: integer;
dniCliente: integer;
diaEvento: integer;
horaInicio: integer;
horaFin: integer;
catServicio: integer;
end;
precios = array [1..dimCat] of real;
listaEvento = specialize LinkedList<eventos>;
resumenReserva = record
numReserva: integer;
precioTotal: real;
end;
listaResumen = specialize LinkedList<resumenReserva>;
var
listaEventos: listaEvento;
preciosPorHora: precios; // Se dispone de este vector
listaResumenes: listaResumen;
//Este procedimiento recorre la lista de eventos.
//Para cada evento, calcula el precio total de la reserva (número de horas multiplicado por el precio por hora de la categoría de servicio).
procedure generarListaResumen(var eventos: listaEvento; var precios: precios; var resumenes: listaResumen);
var
eventoActual: eventos;
resumen: resumenReserva;
precioHora: real;
begin
eventos.reset();
while not eventos.eol() do
begin
eventoActual := eventos.current();
precioHora := precios[eventoActual.catServicio];
resumen.numReserva := eventoActual.numReserva;
resumen.precioTotal := (eventoActual.horaFin - eventoActual.horaInicio) * precioHora;
resumenes.addFirst(resumen);
eventos.next();
end;
end;
procedure diasMenorCantidadReservasDNIImpar(var eventos: listaEvento);
var
contadorDias: array[1..31] of integer;
i, diaMin1, diaMin2, min1, min2: integer;
begin
for i := 1 to 31 do
contadorDias[i] := 0;
eventos.reset();
while not eventos.eol() do
begin
if eventos.current().dniCliente mod 2 <> 0 then
contadorDias[eventos.current().diaEvento] := contadorDias[eventos.current().diaEvento] + 1;
eventos.next();
end;
min1 := MaxInt;
min2 := MaxInt;
for i := 1 to 31 do
begin
if contadorDias[i] < min1 then
begin
min2 := min1;
diaMin2 := diaMin1;
min1 := contadorDias[i];
diaMin1 := i;
end
else if contadorDias[i] < min2 then
begin
min2 := contadorDias[i];
diaMin2 := i;
end;
end;
writeln('Los dos días con menor cantidad de reservas de clientes con DNI impar son: ', diaMin1, ' y ', diaMin2);
end;
//Este procedimiento recorre la lista de eventos y cuenta el total de reservas y las reservas que ocurren después de las 12 hs en la segunda quincena.
//Calcula el porcentaje de reservas que cumplen las condiciones y lo informa.
procedure porcentajeReservasSegundaQuincena(var eventos: listaEvento);
var
totalReservas, reservasSegundaQuincena: integer;
begin
totalReservas := 0;
reservasSegundaQuincena := 0;
eventos.reset();
while not eventos.eol() do
begin
if (eventos.current().diaEvento > 15) and (eventos.current().horaInicio >= 12) then
reservasSegundaQuincena := reservasSegundaQuincena + 1;
totalReservas := totalReservas + 1;
eventos.next();
end;
if totalReservas > 0 then
writeln('El porcentaje de reservas después de las 12 hs en la segunda quincena es: ', (reservasSegundaQuincena / totalReservas) * 100:0:2, '%')
else
writeln('No hay reservas registradas.');
end;
//programa principal
begin
// Se dispone la lista de eventos y el vector de precios por hora ya cargados
listaEventos := listaEvento.create();
listaResumenes := listaResumen.create();
// Generar lista de resumen ordenada por precio total
generarListaResumen(listaEventos, preciosPorHora, listaResumenes);
end.