# data[].attributes.body
Generar un árbol binario de búsqueda con los nombres y edades de personas que se leen desde teclado. La lectura finaliza con el nombre ‘ZZZ’ y el árbol debe estar ordenado por nombre.
Luego de la carga:
- Imprimir en orden descendente todos los datos de las personas.
- Imprimir la edad promedio

Nueva propuesta (consulten en la práctica sus soluciones):
- Imprimir los nombres de las personas con más de 50 años.
- ¿Cuántas personas tienen nombre que comience con C?

# data[].attributes.body
Comenten este post con sus 5 líneas de código (los begin end no cuentan ;) )

# data[].attributes.body
Aquí copiaremos sus aportes
program Personas;
const
fin = 'ZZZ'; {Corbelleri, Patricio Jose}
tot = 15;
type
cadena15 = string[tot]; {Gustavo Lopez}
persona = record
nombre: cadena15;
edad: integer;
end;

arbol = ^nodoA; {Tomás Mc Nally}
nodoA = record
dato: persona;
HI: arbol;
HD: arbol;
end;

procedure leerPersona(var p:persona); {Felipe Wachlin}
begin
{ Sacar todos los ^ de este módulo - Ettore José Bortolin Gómez}
read(p^.nombre);
if(p^.nombre <> fin )then
read(p^.edad);
end;

procedure insertar_ordenado (var arb : arbol, p : persona); {Iacobuci Juan Bautista}
begin
if (arb = nil)then
begin
new(arb);
arb^.dato := persona;
arb^.HI := nil;
arb^.HD := nil;
end
else
{ Sacar todos los :=nil de este else - Ettore José Bortolin Gómez}
if (a^.dato.nombre > p.nombre) then
insertar_ordenado(arb^.HI := nil, p)
if (a^.dato.nombre < p.nombre) then
insertar_ordenado(arb^.HD := nil, p)
end;
end;

procedure recorer_arbol(a:arbol;var edadT,cantP:integer);  {Alec Valledor}
begin                    //En el procedimiento recorrer_arbol se llama al postOrden, pero la llamada tiene que ser a recorrer_arbol de vuelta
if(a<>nil)then     {Agustin Poire}
begin
postOrden(a^.HD);
write(a^.dato.nombre, ' ');
write(a^.dato.edad, ' ');
cantP:=cantP+1;
edadT:=edadT+a^.dato.edad;
postOrden(a^.HI);
end;
end;

procedure promedio_imprimir (a:arbol); {Arián Troitiño}
var
edadT,cantP,promedioE : integer;
//Es posible que divida por 0 en el caso que el arbol sea vacio, por ende, debemos poner un if(a<>NIL) {Agustin Poire}
begin
edadT:=0;
cantP:=0;
recorer_arbol(a, edadT,cantP);
promedioE :=(edadT div cantP);
writeln('El promedio de edad es ', promedioE);
end;

procedure postOrden( a: arbol );//Lo agrego porque vi que es llamado pero nunca declarado
begin                           {Niz Franco}
if ( a <> nil ) then
begin
postOrden (a^.HD);
write (a^.dato, ' ');
postOrden (a^.HI);
end;
end;

procedure generar_Arbol (var arb: arbol); {Inserta en el arbol hasta que el nombre sea fin - Santiago Cueva}
var p: persona
begin
leerPersona(p);
while p^.nombre<>fin do
begin
insertar_ordenado(arb,p);
leerPersona(p);
end;
end;

procedure enOrden (a:arbol);{Rodriguez Mesa Mariano Agustin}
begin
if (a^.HD <> NIL) then
enOrden (a^.HD);
writeln ('-Nombre: ',a^.dato.nombre,' -Edad: ',a^.dato.edad);
if (a^.HI <> NIL) then
enOrden (a^.HI);
end;

var            {Nicolás Torandel Ballesteros}
ab:arbol;
per:persona;
begin
//a:=nil;   {Lautaro Ian Platz}
//leerpersona(p);
while (leerPersona(per)) then  //while (p.nombre<>fin) do begin
begin
cargarPersona(per);               //insertar_ordenado(a,p);
insertar_ordenado(ab,per);        //leerpersona(p);
end;
//enOrden();
promedio_imprimir(ab);
readln;
end.

# data[].attributes.body
Pregunten lo que necesiten saber acerca del problema a resolver

# data[].attributes.body
var
ab: arbol, per: persona;
begin {Nicolás torandell ballesteros}
while (leerPersona(per)) then
begin
cargarPersona(per);
insertar_ordenado(ab,per);
end;
promedio_imprimir(ab)
end.

# data[].attributes.body
el proceso promedio_imprimir lo convertíria en funcion y cambiaria cosas, quedaría asi

function CalcularPromedio(a:arbol):real; {Ratusny Jerónimo}
var edadT,cantP:integer;
begin:
edadT:=0;
cantP:=0;
recorer_arbol(a,edadT,cantP);
Promedio:=(edadT / cantP);
end;

{el promedio lo definiria como real, y la division podria no ser entera, asi que usaria /. Y creo que teoricamente está mal imprimir en los procesos así que lo devolveria al MainProgram
y en el mainProgram, al final iría esto:}

promedio:=CalcularPromedio(a);
writeln('El promedio de edad es: ',promedio);

# data[].attributes.body
{Modifique varias cosas del codigo en general que estaban mal}
const
fin = 'ZZZ';
tot = 15;
type
cadena15 = string[tot];
persona = record
nombre: cadena15;
edad: integer;
end;

arbol = ^nodoA;
nodoA = record
dato: persona;
HI: arbol;
HD: arbol;
end;

procedure leerPersona(var p:persona);
begin
writeln('Ingresar nombre: ');
readln(p.nombre);
if(p.nombre <> fin )then begin
writeln('Ingresar edad: ');
readln(p.edad);
end;
end;

procedure insertar_ordenado (var arb : arbol; p : persona);
begin
if (arb = nil)then
begin
new(arb);
arb^.dato := p;
arb^.HI := nil;
arb^.HD := nil;
end
else
if (arb^.dato.nombre > p.nombre) then
insertar_ordenado(arb^.HI, p);
if (arb^.dato.nombre < p.nombre) then
insertar_ordenado(arb^.HD, p);
end;

procedure recorer_arbol(a:arbol;var edadT,cantP:integer);  {Alec Valledor}
begin
if(a<>nil)then begin
recorer_arbol(a^.HD,edadT,cantP);
cantP:=cantP+1;
edadT:=edadT+a^.dato.edad;
recorer_arbol(a^.HI,edadT,cantP);
end;
end;

procedure promedio_imprimir (a:arbol);
var
edadT,cantP : integer;
promedioE: real;
begin
edadT:=0;
cantP:=0;
recorer_arbol(a, edadT,cantP);
promedioE :=(edadT / cantP);
writeln('El promedio de edades es ', promedioE);
end;

procedure enOrden (a:arbol);
begin
if (a^.HD <> NIL) then enOrden (a^.HD);
writeln ('-Nombre: ',a^.dato.nombre,' -Edad: ',a^.dato.edad);
if (a^.HI <> NIL) then enOrden (a^.HI);
end;

var
a:arbol;
p:persona;
begin
a:=nil;
leerpersona(p);
while (p.nombre<>fin) do begin
insertar_ordenado(a,p);
leerpersona(p);
end;
enOrden(a);
promedio_imprimir(a);
readln;
end.

# data[].attributes.body
{No habia mucho para hacer pero bueno, organize un poco la consola de ejecucion y limité el numero de digitos del promedio que estaba en tipo real} {Schattmann Tomas}
program personas;
const
fin = 'ZZZ';
tot = 15;
type
cadena15 = string[tot];
persona = record
nombre: cadena15;
edad: integer;
end;

arbol = ^nodoA;
nodoA = record
dato: persona;
HI: arbol;
HD: arbol;
end;

procedure leerPersona(var p:persona);
begin
write('Ingresar nombre: '); readln(p.nombre);
if(p.nombre <> fin )then begin
write('Ingresar edad: '); readln(p.edad);
end;
end;

procedure insertar_ordenado (var arb : arbol; p : persona);
begin
if (arb = nil)then
begin
new(arb);
arb^.dato := p;
arb^.HI := nil;
arb^.HD := nil;
end
else
if (arb^.dato.nombre > p.nombre) then
insertar_ordenado(arb^.HI, p);
if (arb^.dato.nombre < p.nombre) then
insertar_ordenado(arb^.HD, p);
end;

procedure recorer_arbol(a:arbol;var edadT,cantP:integer);  {Alec Valledor}
begin
if(a<>nil)then begin
recorer_arbol(a^.HD,edadT,cantP);
cantP:=cantP+1;
edadT:=edadT+a^.dato.edad;
recorer_arbol(a^.HI,edadT,cantP);
end;
end;

procedure promedio_imprimir (a:arbol);
var
edadT,cantP : integer;
promedioE: real;
begin
edadT:=0;
cantP:=0;
recorer_arbol(a, edadT,cantP);
promedioE :=(edadT / cantP);
writeln('El promedio de edades es ', promedioE:2:2);
end;

procedure enOrden (a:arbol; var contador: integer);
begin
if (a^.HD <> NIL) then enOrden (a^.HD, contador);
writeln(' * Persona ', contador);
contador:= contador + 1;
writeln ('- Nombre: ',a^.dato.nombre,' - Edad: ',a^.dato.edad);
if (a^.HI <> NIL) then enOrden (a^.HI, contador);
end;

var
a:arbol;
p:persona;
c: integer;
begin
a:=nil;
leerpersona(p);
while (p.nombre<>fin) do begin
insertar_ordenado(a,p);
leerpersona(p);
end;

writeln('------------------------');
writeln('Impresion del arbol: ');
enOrden(a, c);
writeln('');
writeln('------------------------');
promedio_imprimir(a);
readln;
end.

# data[].attributes.headline
Código con correcciones (alternativa con módulos separados)

# data[].attributes.subject
Código con correcciones (alternativa con módulos separados)

# data[].attributes.body
program Programa;
const
fin = 'ZZZ';
tot = 15;

type
cadena = string[tot];
persona = record
nombre: cadena;
edad: integer;
end;

arbol = ^nodoA;
nodoA = record
dato: persona;
HI: arbol;
HD: arbol;
end;

procedure leerPersona(var p:persona);
begin
writeln('Ingrese un nombre: ');
readln(p.nombre);
if(p.nombre <> fin )then
begin
writeln('Ingrese una edad: ');
readln(p.edad);
end;
end;

procedure insertar_ordenado (var arb:arbol; p:persona);
begin
if (arb = nil)then
begin
new(arb);
arb^.dato := p;
arb^.HI := nil;
arb^.HD := nil;
end
else
if (arb^.dato.nombre > p.nombre) then
insertar_ordenado(arb^.HI, p)
else
insertar_ordenado(arb^.HD, p);
end;

procedure generar_Arbol (var arb: arbol);
var p: persona;
begin
leerPersona(p);
while p.nombre<>fin do
begin
insertar_ordenado(arb,p);
leerPersona(p);
end;
end;

procedure enOrdenDescendente( a: arbol );
begin
if ( a <> nil ) then
begin
enOrdenDescendente (a^.HD);
writeln ('-Nombre: ',a^.dato.nombre,' -Edad: ',a^.dato.edad);
enOrdenDescendente (a^.HI);
end;
end;

procedure recorer_promedio(a:arbol; var edadT,cantP:integer);
begin
if(a<>nil)then
begin
recorer_promedio(a^.HD, edadT, cantP);
cantP:=cantP+1;
edadT:=edadT+a^.dato.edad;
recorer_promedio(a^.HI, edadT, cantP);
end;
end;

procedure promedio(a:arbol);
var
edadT,cantP: integer;
promedioE : real;
begin
edadT:=0;
cantP:=0;
recorer_promedio(a, edadT,cantP);
if cantP <> 0 then
begin
promedioE := edadT / cantP;
writeln('El promedio de edad es: ', promedioE:2:2);
end
else
writeln('No hay nodos en el arbol ');
end;

var
ab:arbol;
begin
ab:=nil;
generar_Arbol(ab);
enOrdenDescendente(ab);
promedio(ab);
readln;
end.

# data[].attributes.headline
Código con correcciones (con único recorrido)

# data[].attributes.subject
Código con correcciones (con único recorrido)

# data[].attributes.body
program Programa;
const
fin = 'ZZZ';
tot = 15;

type
cadena = string[tot];
persona = record
nombre: cadena;
edad: integer;
end;

arbol = ^nodoA;
nodoA = record
dato: persona;
HI: arbol;
HD: arbol;
end;

procedure leerPersona(var p:persona);
begin
writeln('Ingrese un nombre: ');
readln(p.nombre);
if(p.nombre <> fin )then
begin
writeln('Ingrese una edad: ');
readln(p.edad);
end;
end;

procedure insertar_ordenado (var arb:arbol; p:persona);
begin
if (arb = nil)then
begin
new(arb);
arb^.dato := p;
arb^.HI := nil;
arb^.HD := nil;
end
else
if (arb^.dato.nombre > p.nombre) then
insertar_ordenado(arb^.HI, p)
else
insertar_ordenado(arb^.HD, p);
end;

procedure generar_arbol (var arb: arbol);
var p: persona;
begin
leerPersona(p);
while p.nombre<>fin do
begin
insertar_ordenado(arb,p);
leerPersona(p);
end;
end;

procedure recorer_arbol(a:arbol; var edadT, cantP:integer);
begin
if(a<>nil)then
begin
recorer_arbol(a^.HD, edadT, cantP);
write(a^.dato.nombre, ' ');
write(a^.dato.edad, ' ');
cantP:=cantP+1;
edadT:=edadT+a^.dato.edad;
recorer_arbol(a^.HI, edadT, cantP);
end;
end;

procedure promedio_imprimir (a:arbol);
var
edadT,cantP: integer;
promedioE : real;
begin
edadT:=0;
cantP:=0;
recorer_arbol(a, edadT,cantP);
if cantP <> 0 then
begin
promedioE := edadT / cantP;
writeln('El promedio de edad es: ', promedioE:2:2);
end
else
writeln('No hay nodos en el arbol ');
end;

var
ab: arbol;
begin
ab:=nil;
generar_Arbol (ab);
promedio_imprimir(ab);
readln;
end.

# data[].attributes.body
Todavía no disponible

# data[].attributes.headline
Enlace a actividad similar del semestre pasado

# data[].attributes.subject
Enlace a actividad similar del semestre pasado

# data[].attributes.body
https://padlet.com/silvanalg/44sgry2acq2r

# data[].attributes.body
{Modifique varias cosas del codigo en general que estaban mal}
const
fin = 'ZZZ';
tot = 15;
type
cadena15 = string[tot];
persona = record
nombre: cadena15;
edad: integer;
end;

arbol = ^nodoA;
nodoA = record
dato: persona;
HI: arbol;
HD: arbol;
end;

procedure leerPersona(var p:persona);
begin
writeln('Ingresar nombre: ');
readln(p.nombre);
if(p.nombre <> fin )then begin
writeln('Ingresar edad: ');
readln(p.edad);
end;
end;

procedure insertar_ordenado (var arb : arbol; p : persona);
begin
if (arb = nil)then
begin
new(arb);
arb^.dato := p;
arb^.HI := nil;
arb^.HD := nil;
end
else
if (arb^.dato.nombre > p.nombre) then
insertar_ordenado(arb^.HI, p);
if (arb^.dato.nombre < p.nombre) then
insertar_ordenado(arb^.HD, p);
end;

procedure recorer_arbol(a:arbol;var edadT,cantP:integer);  {Alec Valledor}
begin
if(a<>nil)then begin
recorer_arbol(a^.HD,edadT,cantP);
cantP:=cantP+1;
edadT:=edadT+a^.dato.edad;
recorer_arbol(a^.HI,edadT,cantP);
end;
end;

procedure promedio_imprimir (a:arbol);
var
edadT,cantP : integer;
promedioE: real;
begin
edadT:=0;
cantP:=0;
recorer_arbol(a, edadT,cantP);
promedioE :=(edadT / cantP);
writeln('El promedio de edades es ', promedioE);
end;

procedure enOrden (a:arbol);
begin
if (a^.HD <> NIL) then enOrden (a^.HD);
writeln ('-Nombre: ',a^.dato.nombre,' -Edad: ',a^.dato.edad);
if (a^.HI <> NIL) then enOrden (a^.HI);
end;

var
a:arbol;
p:persona;
begin
a:=nil;
leerpersona(p);
while (p.nombre<>fin) do begin
insertar_ordenado(a,p);
leerpersona(p);
end;
enOrden(a);
promedio_imprimir(a);
readln;
end.