-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparcialImperativo12-9-2022_Tema1.pas
184 lines (172 loc) · 4.64 KB
/
parcialImperativo12-9-2022_Tema1.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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// PARCIAL IMPERATIVO - Fecha 12/9/2022 - Tema 1
{
Un comercio necesita el procesamiento de las compras realizadas por sus clientes durante el mes de Julio de 2022.
De cada compra se conoce código del cliente, día, cantidad de productos y monto pagado.
A) Implementar un módulo que lea compras, genere y retorne un estructora adecuada para la busqueda por código del cliente,
donde para cada codigo de cliente se almacenan juntas todas sus compras (día, cantidad de productos y monto) que realizó.
La lectura finaliza con cantidad de productos 0. Se sugiere usar el módulo leerRegistro ().
B) Implementar un módulo que reciba la estructura generada en a) y un código de cliente y retorne todas las compras de dicho
cliente.
C) Realizar un módulo recursivo que reciba la estructura que retorna el inciso b) y retorne el monto de la compra con mayor
cantidad de productos.
NOTA: Implementar en el programa principal, que invoque a los incisos a, b y c.
}
program parcialImperativo12_9_2022;
type
rangoDias = 1..31;
compra = record
cod: integer;
dia: rangoDias;
cantProd: integer;
monto: real;
end;
lista = ^nodoL;
nodoL = record
dato: compra;
sig: lista;
end;
arbol = ^nodoA;
nodoA = record
dato: lista;
HI: arbol;
HD: arbol;
end;
procedure imprimirLista(L: lista);
begin
write(' L --->');
while (L <> nil) do begin
write('|Codigo: ',L^.dato.cod);
write(' CantProductos: ',L^.dato.cantProd);
write(' Monto: ',L^.dato.monto:5:2);
write('|---> ');
L:= L^.sig;
end;
writeln(' nil');
end;
procedure procesarCompras(var a: arbol);
procedure leerCompra(var c: compra);
begin
c.cantProd:= random(30);
if (c.cantProd <> 0) then begin
write('Cantidad de productos: ');
writeln(c.cantProd);
c.cod:= 1 + random(100);
write('Codigo de cliente: ');
writeln(c.cod);
c.monto:=150.8 + random(8000);
write('Monto del producto: ');
writeln(c.monto:5:2);
c.dia:= 1 + random(31);
write('Cantidad de dias: ');
writeln(c.dia);
end;
end;
procedure agregarLista(var L: lista; c: compra);
var
aux: lista;
begin
new(aux);
aux^.dato:= c;
aux^.sig:= L;
L:= aux;
end;
procedure agregarArbol(var a: arbol; c: compra);
begin
if (a = nil) then begin
new(a);
a^.dato:= nil; // Lista inicializada en nil
agregarLista(a^.dato, c);
a^.HI:= nil;
a^.HD:= nil;
end
else begin
if (a^.dato^.dato.cod = c.cod) then
agregarLista(a^.dato, c)
else
if (c.cod < a^.dato^.dato.cod) then
agregarArbol(a^.HI, c)
else
agregarArbol(a^.HD, c);
end;
end;
var
c: compra;
begin
writeln('======= SISTEMA DE COMPRAS =======');
leerCompra(c);
writeln;
while (c.cantProd <> 0) do begin
agregarArbol(a, c);
leerCompra(c);
writeln;
end;
// imprimirLista(a):
end;
procedure buscarProductosDeCliente(a: arbol; var nodo: lista);
function buscarCliente(a: arbol; num: integer): lista;
begin
if (a = nil) then
buscarCliente := nil
else begin
if (a^.dato^.dato.cod = num) then
buscarCliente := a^.dato
else begin
if (num < a^.dato^.dato.cod) then
buscarCliente:= buscarCliente(a^.HI, num)
else
buscarCliente:= buscarCliente(a^.HD, num);
end;
end;
end;
var
num: integer;
begin
write('Ingrese un NUMERO DE CLIENTE a buscar (si existe): ');
readln(num);
nodo:= buscarCliente(a, num);
if (nodo = nil) then
writeln('No se encontro el cliente especificado.')
else
imprimirLista(nodo);
end;
function mayorMonto(n: lista): real;
function mayorCantProductos(n: lista; max, maxMonto: real): real;
begin
if (n = nil) then
mayorCantProductos:= maxMonto
else begin
if (n^.dato.cantProd > max) then begin
max:= n^.dato.cantProd;
maxMonto:= n^.dato.monto;
end
else
if (n^.dato.cantProd = max) then
if (n^.dato.monto > maxMonto) then
maxMonto:= n^.dato.monto;
mayorCantProductos:= mayorCantProductos(n^.sig, max, maxMonto);
end;
end;
var
max: integer;
maxMonto: real;
begin
max:=-9999;
maxMonto:= -1;
mayorMonto:= mayorCantProductos(n, max, maxMonto);
end;
// PROGRAMA PRINCIPAL
var
a: arbol;
nodo: lista;
begin
Randomize;
a:=nil; // Arbol principal para guardar las compras por cliente, y la lista de cada cliente
nodo:= nil; // Nodo auxiliar de lista para buscar si existe en el arbol
procesarCompras(a);
buscarProductosDeCliente(a, nodo);
if (nodo <> nil) then
writeln('Monto de la compra con mayor cantidad de productos: ',mayorMonto(nodo):5:2)
else
writeln('No hay monto mayor porque el numero de cliente no existe.');
readln();
end.