-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathImperativoClase3Arboles.pas
236 lines (217 loc) · 7.29 KB
/
ImperativoClase3Arboles.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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
{Escribir un programa que:
a. Implemente un modulo que lea informacion de socios de un club y las almacene en un arbol binario de busqueda. De cada socio se lee numero de socio,
nombre y edad. La lectura finaliza con el numero de socio 0 y el arbol debe quedar ordenado por numero de socio.
b. Una vez generado el arbol, realice modulos independientes que reciban el arbol como parametro y:
i. Informe el numero de socio mas grande. Debe invocar a un modulo recursivo que retorne dicho valor.
ii. Informe los datos del socio con el numero de socio mas chico. Debe invocar a un modulo recursivo que retorne dicho socio.
iii. Informe el numero de socio con mayor edad. Debe invocar a un modulo recursivo que retorne dicho valor.
iv. Aumente en 1 la edad de todos los socios.
v. Lea un valor entero e informe si existe o no existe un socio con ese valor. Debe invocar a un modulo recursivo que reciba el valor leido y
retorne verdadero o falso.
vi. Lea un nombre e informe si existe o no existe un socio con ese valor. Debe invocar a un modulo recursivo que reciba el nombre leido y
retorne verdadero o falso.
vii. Informe la cantidad de socios. Debe invocar a un modulo recursivo que retorne dicha cantidad.
viii. Informe el promedio de edad de los socios. Debe invocar a un modulo recursivo que retorne dicho promedio.
ix. Informe, a partir de dos valores que se leen, la cantidad de socios en el arbol cuyo numero de socio se encuentra entre
los dos valores ingresados. Debe invocar a un modulo recursivo que reciba los dos valores leÃdos y retorne dicha cantidad.
x. Informe los numeros de socio en orden creciente.
xi. Informe los numeros de socio pares en orden decreciente.
}
Program ImperativoClase3;
type rangoEdad = 12..100;
cadena15 = string [15];
socio = record
numero: integer;
nombre: cadena15;
edad: rangoEdad;
end;
arbol = ^nodoArbol;
nodoArbol = record
dato: socio;
HI: arbol;
HD: arbol;
end;
procedure GenerarArbol (var a: arbol);
{ Implemente un modulo que lea informacion de socios de un club y las almacene en un arbol binario de busqueda. De cada socio se lee numero de socio,
nombre y edad. La lectura finaliza con el numero de socio 0 y el arbol debe quedar ordenado por numero de socio. }
procedure LeerSocio (var s: socio);
begin
write ('Ingrese numero del socio: ');
readln (s.numero);
if (s.numero <> 0) then begin
write ('Ingrese nombre del socio: ');
readln (s.nombre);
write ('Ingrese edad del socio: ');
readln (s.edad);
end;
end;
procedure InsertarElemento (var a: arbol; elem: socio);
begin
if (a = nil) then begin
new(a);
a^.dato:= elem;
a^.HI:= nil;
a^.HD:= nil;
end
else
if (elem.numero < a^.dato.numero) then
InsertarElemento(a^.HI, elem)
else
InsertarElemento(a^.HD, elem);
end;
var
unSocio: socio;
begin
a:= nil;
LeerSocio (unSocio);
while (unSocio.numero <> 0) do begin
InsertarElemento (a, unSocio);
writeln;
LeerSocio (unSocio);
end;
end;
procedure InformarNumeroSocioMasGrande (a: arbol);
{Informe el numero de socio mas grande. Debe invocar a un modulo recursivo que retorne dicho valor.}
function NumeroMasGrande (a: arbol): integer;
begin
if (a = nil) then
NumeroMasGrande:= -1
else
if (a^.HD = nil) then
NumeroMasGrande:= a^.dato.numero
else
NumeroMasGrande:= NumeroMasGrande (a^.HD);
end;
var
max: integer;
begin
writeln;
writeln ('----- Informar Numero Socio Mas Grande ----->');
writeln;
max:= NumeroMasGrande (a);
if (max = -1) then
writeln ('Arbol sin elementos')
else begin
writeln;
writeln ('Numero de socio mas grande: ', max);
writeln;
end;
end;
procedure InformarDatosSocioNumeroMasChico (a: arbol);
{ Informe los datos del socio con el numero de socio mas chico. Debe invocar a un modulo recursivo que retorne dicho socio. }
function SocioMasChico (a: arbol): arbol;
begin
if ((a = nil) or (a^.HI = nil)) then
SocioMasChico:= a
else
SocioMasChico:= SocioMasChico (a^.HI);
end;
var
minSocio: arbol;
begin
writeln;
writeln ('----- Informar Datos Socio Numero Mas Chico ----->');
writeln;
minSocio:= SocioMasChico (a);
if (minSocio = nil) then
writeln ('Arbol sin elementos')
else begin
writeln;
writeln ('Socio con numero mas chico: ', minSocio^.dato.numero, ' Nombre: ', minSocio^.dato.nombre, ' Edad: ', minSocio^.dato.edad);
writeln;
end;
end;
procedure InformarNumeroSocioConMasEdad (a: arbol);
{ Informe el numero de socio con mayor edad. Debe invocar a un modulo recursivo que retorne dicho valor. }
procedure NumeroMasEdad (a: arbol; var maxEdad: integer; var maxNum: integer);
var
maxEdad1, maxEdad2, maxNum1, maxNum2: integer;
begin
if (a = nil) then
maxEdad:= -1
else begin
NumeroMasEdad (a^.HI, maxEdad1, maxNum1);
NumeroMasEdad (a^.HD, maxEdad2, maxNum2);
if (maxEdad1 > maxEdad2) then begin
maxEdad:= maxEdad1;
maxNum:=maxNum1;
end
else begin
maxEdad:= maxEdad2;
maxNum:=maxNum2;
end;
if (a^.dato.edad > maxEdad) then begin
maxEdad:= a^.dato.edad;
maxNum:=a^.dato.numero;
end;
end;
end;
var
maxEdad, maxNum: integer;
begin
writeln;
writeln ('----- Informar Numero Socio Con Mas Edad ----->');
writeln;
NumeroMasEdad (a, maxEdad, maxNum);
if (maxEdad = -1) then
writeln ('Arbol sin elementos')
else begin
writeln;
writeln ('Numero de socio con mas edad: ', maxNum);
writeln;
end;
end;
procedure AumentarEdad (a: arbol);
begin
if (a <> nil)
then begin
a^.dato.edad:= a^.dato.edad + 1;
AumentarEdad (a^.HI);
AumentarEdad (a^.HD);
end;
end;
procedure InformarExistenciaNumeroSocio (a: arbol);
{ Lea un valor entero e informe si existe o no existe un socio con ese valor. Debe invocar a un modulo recursivo que reciba el valor leido y
retorne verdadero o falso. }
function Buscar (a: arbol; num: integer): boolean;
begin
if (a = nil)
then Buscar:= false
else If (a^.dato.numero = num)
then Buscar:= true
else if (num < a^.dato.numero)
then Buscar:= Buscar (a^.HI, num)
else Buscar:= Buscar (a^.HD, num)
end;
var numABuscar: integer;
begin
writeln;
writeln ('----- Informar Existencia Numero Socio ----->');
writeln;
write ('Ingrese numero de socio a buscar: ');
Readln (numABuscar);
writeln;
if (Buscar (a, numABuscar))
then writeln ('El numero ', numABuscar, ' existe')
else writeln ('El numero ', numABuscar, ' no existe');
writeln;
end;
// PROGRAMA PRINCIPAL
var
a: arbol;
begin
GenerarArbol (a);
InformarNumeroSocioMasGrande (a);
InformarDatosSocioNumeroMasChico (a);
InformarNumeroSocioConMasEdad (a);
AumentarEdad (a);
InformarExistenciaNumeroSocio (a);
{ InformarExistenciaNombreSocio (a);
InformarCantidadSocios (a);
InformarPromedioDeEdad (a);
InformarCantidadSociosEnRango (a);
InformarNumerosSociosOrdenCreciente (a);
InformarNumerosSociosOrdenDeCreciente (a);
}
readln;
end.