|
Algoritmos y Estructuras de Datos I
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
Primer Cuatrimestre de 2000
Resolución del Parcial 18
Ejercicio 1
1-a) Es un procedimiento porque cambia a uno de los parámetros de Entrada. Si fuera función en la postcondición tendría que figurar ret_value.
1-b) Si, la postcondición no aclara qué valor tiene cada B[j] (con 0≤j<dim(B)) al finalizar el programa
1-c) A se modifica.Vale 0 en las posiciones en las cuales A0 era distinto a B0 y el valor opuesto a cada A0 en las posiciones en las cuales A0 era igual a B0
1-d)
Pc {i=0} P
Qc {i=dim(A) ("j)(0≤j<dim(A0) => Propiedad (A,A0,j,B0)) B=B0}
B {i<dim(A)}
I {0≤i≤dim(A) ("j)(0≤j<i => Propiedad (A,A0,j,B0)) B=B0
("j)(i≤j<dim(A) => A[j]=A0[j])}
FV = dim(A) - i
1-e)
procedure ej1(in-out:A:Arreglo de integer,in:B:arreglo)
var
i:integer:=0;
while (i<dim(A)) do
if (A[i]=B[i]) then A[i]:=-B[i];
else A[i]:=0;
fi;
i:=i+1;
od;
endprocedure
1-f) Estaria mal porque podria pasar lo siguiente:
a) dim(A)<dim(B)
En la forma en la cual yo elegí implementar el ciclo, haría lo mismo que si B fuera igual a la dimension de A (o sea, no tomando en cuenta los B[i] con dim(B)>idim(A)). En este caso no hace falta cambiar nada (pero hay que ver si sigue haciendo lo que se quiere)
b) dim(A)>dim(B)
Esta mal porque a partir de un cierto momento (cuando idim(A)) estoy comparando elementos de A con elementos de B que no existen...
O sea que en este caso habria que cambiar la precondición y postcondicion (y por supuesto el programa) para que tenga en cuenta este problema (por ejemplo
Q {("j)(0≤j<(f_min dim(A0) dim(B0)) => Propiedad(A,A0,j,B0))} )
1-g)
P {A=A0 B=B0 Dim(A)=Dim(B) (0≤j<dim(A0) => A0[j]0 B0[j]0)}
Q {ret_value=f_contarceros (f_ej1 A0 B0)}
Pc {i=0 ("j)(0≤j<dim(A0) => Propiedad(A,A0,j,B0)) ret_value=0}
Qc {i=dim(A) ret_value=f_contarceros (f_take (f_ej1 A0 B0) i) B=B0
("j)(0≤j<dim(A0) => Propiedad(A,A0,j,B0))}
B {i<dim(A)}
I {0≤i≤dim(A) ret_value=f_contarceros (f_take A i) B=B0
("j)(0≤j<dim(A0) => Propiedad(A,A0,j,B0))}
FV = dim(A)-i
ej1:: [Int] -> [Int] -> [Int]
ej1 [] [] = []
ej1 (x:xs) (y:ys) | x==y = (-y):(ej1 xs ys)
| otherwise = 0:(ej1 xs ys)
contarceros:: [Int] -> Int
contarceros [] = 0
contarceros (x:xs) | x==0 = 1+contarceros xs
| otherwise = contarceros xs
function No_coinciden(A:Arreglo de Integer,B:Arreglo de Integer):integer
var
i:integer:=0;
ej1(A,B);
while (i<dim(A)) do
if (A[i]=0] then ret_value:=ret_value+1;
else skip;
i:=i+1;
od;
endfunction
Ejercicio 2
I ⌐B {f_long L≤0 0≤i≤f_long L0 0≤f_long L≤f_long L0
ret_value=f_suma (f_take L0 i) L=f_drop L0 (f_long L0-f_long L)}
I ⌐B {f_long L=0 L=[] 0≤i≤f_long L0 ret_value=f_suma (f_take L0 i)
El invariante está mal porque no se deduce de I ⌐B la postcondición del ciclo (lo único que se deduce es que L=[], o sea f_long L=0, pero no se deduce que i=f_long L0
Ejercicio 3
P {L=L0 n=N0 N0>0}
Q {ret_value=f_promn L0 N0}
Pc {i=0 ret_value=[]}
Qc {i=f_div_entera (f_long L0) N0 ret_value=f_take (f_promn L0 N0) i
L=L0 n=N0}
B {i<f_div_entera (f_long L) n}
I {0≤i≤f_div_entera (f_long L) n L=L0 n=N0
ret_value=f_take (f_promn L0 N0) i}
FV = f_div_entera (f_long L) n - i
-- NOTA: Habria que usar Float y el div ser la division con decimales...
promn:: [Int] -> Int -> [Int]
promn [] _ = []
promn xs n | longitud xs < n = []
| otherwise = (prom_aux (take n xs) n):(promn (drop n xs) n)
prom_aux:: [Int] -> Int -> Int
prom_aux xs n = div (suma xs) n
suma:: [Int] -> Int
suma [] = 0
suma (x:xs) = x+suma xs
function PromN(L:lista de integer,n:integer):lista de integer
var
i:integer:=0;
ret_value:=[];
while (i<Division_Entera(Long(L),n) do
AgregarAtras(ret_value,CalcProm(L,n,i));
i:=i+1;
od;
endfunction
//FUNCION AUXILIAR CalcProm
P {L=L0 n=N0 ind=ind0 f_long Lind0*N0}
Q {ret_value=f_suma (f_take (f_drop L0 ind0*N0) N0)/2}
Pc {i=0 ret_value=0}
Qc {i=n ret_value=f_suma (f_take (f_drop L0 ind0*N0) i)}
I {0≤i≤n ret_value=f_suma (f_take (f_drop L0 ind0*N0) i)}
B {i<n}
Fv = n-i
function CalcProm(L:lista de integer,n:integer,ind:integer):integer
var
i:integer:=0;
ret_value:=0;
while (i<n) do
ret_value:=ret_value+Iesimo(L,ind*n+i);
i:=i+1;
od;
ret_value:=ret_value/n;
endfunction
Aún no hay comentarios para este recurso.
Monografias, Exámenes, Universidades, Terciarios, Carreras, Cursos, Donde Estudiar, Que Estudiar y más: Desde 1999 brindamos a los estudiantes y docentes un lugar para publicar contenido educativo y nutrirse del conocimiento.
Contacto »