Loading repository data…
Loading repository data…
Fabian-Martinez-Rincon / repository
🎓 Apuntes, teorías, practicas, parciales, finales y toda la data que use para aprobar la materia. Aca se utilizo Pascal, R-Info y Java
[!IMPORTANT]
Si encuentran algun link roto o tienen alguna duda, no duden en decirme por mail fabianmartinezrincon.123@gmail.com
En esta página voy a tratar de explicar todo lo que se necesita para aprobar el final independientemente del tema. Hay muchas cosas que uno lo puede deducir, pero en esta cátedra el más mínimo error es motivo para un 2(dos).
Si te toca este final, tenes 2 opciones nada más.
Para ambos temas te tenes que saber si o si:
Procedure AgregarAdelante (var L:lista; x:integer);
Var
nue:Lista;
Begin
New(nue);
nue^.datos:=x;
nue^.sig:=L;
L:=nue;
End;
procedure AgregarAlFinal(var l,ult:lista;x:integer);
var
nue : lista;
begin
new (nue);
nue^.dato:= x;
nue^.sig := NIL;
if l <> Nil then
ult^.sig := nue
else
l := nue;
ult := nue;
end;
Procedure InsertarElemento ( var pri: lista; x: Integer);
var
ant, nue, act: lista;
begin
new (nue);
nue^.dato := x;
act := pri;
ant := pri;
while (act<>NIL) and (act^.dato < x) do
begin
ant := act;
act := act^.sig ;
end;
if (ant = act) then
pri := nue
else
ant^.sig := nue;
nue^.sig := act ;
end;
Mira, para probar los codigos yo lo que hago es hacer una lista de numeros enteros y, insertando lo que quiera probar y despues imprimo la lista para ver si esta bien.
procedure ImprimirLista (L:lista);
begin
while (L <> nil) do
begin
writeln (L^.dato);
L:= L^.sig;
end;
end;
IMPORTANTE: Yo no avanzaria hasta saber bien estos codigos, ya que si tenes algun error en estos es causa de desaprobar :,(
Y con esto nos aseguramos de tener todo en orden.
Bien, una vez que sabemos que funcionan los codigos, vamos a resolver el siguiente final.
En este final no me acordaba el insertar ordenado y el modulo recursivo del punto c, lo habia hecho mal
Tenemos los datos relevantes con colores que seria denuncia que contiene lo siguiente:
Bien una vez que tenemos estos datos, podemos empezar a ver los puntos dados.
Bien, en este caso, yo lo que hago siempre es hacer el module en forma iterativa, para probar y despues lo paso a recursivo. Basicamente cambias el while por el if y despues llavas cambias en donde se incrementa la variable, por una llamada a la funcion con el incremento o modificación correspondiente.
program imperativo;
const
DIMF = 6;
type
categoria = 1..DIMF;
direccion = record
nroCalle:integer;
nroAltura:integer;
end;
denuncia = record
cat:categoria;
DNI:integer;
dir:direccion;
mes:integer;
dia:integer;
hora:integer;
end;
lista = ^nodo;
nodo = record
dato:denuncia;
sig:lista;
end;
vectorContador = array [1..DIMF] of lista;
datoNuevo = record
nroCalle:integer;
denunciasTotales:integer;
denunciasJulio:integer;
end;
listaNueva = ^nodoNuevo;
nodoNuevo = record
dato:datoNuevo;
sig:listaNueva;
end;
procedure insertarOrdenado(var l:lista;d:denuncia);
var
act,ant,nue:lista;
begin
new(nue);
nue^.dato:=d;
act:=l;
ant:=l;
while (act <> nil) and (act^.dato.DNI < d.DNI) do
begin
ant:=act;
act:=act^.sig;
end;
if (act = ant) then
l:=nue
else
ant^.sig:=nue;
nue^.sig:=act;
end;
procedure imprimirLista(l:lista);
begin
while l <> nil do
begin
WriteLn(l^.dato.DNI);
l:=l^.sig;
end;
end;
procedure agregarAtras(var l,ult:listaNueva; nro:datoNuevo);
var
nue:listaNueva;
begin
new(nue);
nue^.dato:=nro;
nue^.sig:=nil;
if (l = nil) then
l:=nue
else
ult^.sig:=nue;
ult:=nue;
end;
procedure leerDenuncia(var d:denuncia);
begin
writeln('Ingresar dni: '); ReadLn(d.DNI);
if (d.DNI <> 0) then
begin
writeln('Ingresar categoria: '); ReadLn(d.cat);
writeln('Ingresar nroCalle: '); ReadLn(d.dir.nroCalle);
writeln('Ingresar nroAltura: '); ReadLn(d.dir.nroAltura);
writeln('Ingresar mes: '); ReadLn(d.mes);
writeln('Ingresar dias: '); ReadLn(d.dia);
writeln('Ingresar hora: '); ReadLn(d.hora);
end;
end;
procedure cargarDenuncias(var vc:vectorContador);
var
d:denuncia;
begin
leerDenuncia(d);
while (d.DNI <> 0) do
begin
insertarOrdenado(vc[d.cat],d);
leerDenuncia(d);
end;
end;
procedure inicializarVector (var vc:vectorContador);
var
i:integer;
begin
for i:=1 to DIMF do
begin
vc[i]:=nil;
end;
end;
procedure minimo(vc:vectorContador; var min:denuncia);
var
posMin:integer;
i:integer;
begin
posMin:=-1;
min.DNI:=9999;
for i:=1 to DIMF do
begin
if (vc[i] <> nil) and (vc[i]^.dato.DNI < min.DNI) then
begin
min.DNI:=vc[i]^.dato.DNI;
posMin:=i;
end;
end;
if (posMin <> -1) then
begin
min:=vc[posMin]^.dato;
vc[posMin]:=vc[posMin]^.sig;
end;
end;
procedure mergeAcumulador(vc:vectorContador;var ln:listaNueva);
var
min:denuncia;
actual:datoNuevo;
ult:listaNueva;
begin
ult:=nil;
minimo(vc,min);
while (min.DNI <> 9999) do
begin
actual.nroCalle:=min.DNI;
actual.denunciasTotales:=0;
actual.denunciasJulio:=0;
while (min.DNI <> 9999) and (actual.nroCalle = min.DNI) do
begin
actual.denunciasTotales:=actual.denunciasTotales + 1;
if (min.mes = 6) then
actual.denunciasJulio:=actual.denunciasJulio + 1;
minimo(vc,min);
end;
agregarAtras(ln,ult,actual);
end;
end;
procedure calleDenuncias(l:listaNueva;var nroCalle:integer;calleMax:integer);
begin
if l <> nil then
begin
if (calleMax < l^.dato.denunciasTotales) then
begin
calleMax:=l^.dato.denunciasTotales;
nroCalle:=l^.dato.nroCalle;
end;
calleDenuncias(l^.sig,nroCalle,calleMax)
end;
end;
var
vc:vectorContador;
l:listaNueva;
calleDenuncias:integer;
calleMaxima:integer;
begin
inicializarVector(vc);
cargarDenuncias(vc);
mergeAcumulador(vc,l);
calleDenuncias:=0;
calleMaxima:=-1;
calleMasDenuncias(l,calleDenuncias,calleMaxima);
writeln('La calle con mas denuncias es: ', calleDenuncias);
end.
En este final tenia mal el recorrido del arbol, lo puse dos condicionales en la condicion base. (Y siempre va <> nil en la condicion base)
IMPORTANTE: Primero te diria que resuelvas este parcial con full enteros y despues le agregues los datos compuestos, ya que es mas facil/rapido de testear
En los teoricos suelen tomar el recorrido optimo del arbol
Tenemos recital con los siguientes datos
Bien, una vez que tenemos estos datos, podemos empezar a ver los puntos dados.
program arboles;
type
recital = record
nombreBanda:String;
fecha:String;
cantTocadas:integer;
montoRecaudado:real;
end;
arbol = ^nodo;
nodo = record
dato:recital;
HI:arbol;
HD:arbol;
end;
lista = ^nodoNuevo;
nodoNuevo = record
dato:recital;
sig:lista;
end;
procedure crearArbol(var abb:arbol;nro:recital);
begin
if (abb = nil) then
begin
new(abb);
abb^.dato:=nro;
abb^.HI:=nil;
abb^.HD:=nil;
end
else
if (abb^.dato.montoRecaudado > nro.montoRecaudado) then
crearArbol(abb^.HI,nro