![]() |
Haga click para publicitar en Alipso.com |
| Buscando Secundarios
| Universidades
| Carreras
| Test
Orientación Vocacional | Medios
| Profesores particulares
| Institutos
| Campus Material Monografias | Exámenes Secundarios | Exámenes Universitarios | Enlaces | Enviar material | Diversión Postales | Humor | Descargas | Juegos Comunidad Foros | Institucional Publicite | En su sitio | Contáctese Cursos en Buenos Aires Cursos de Informática | Cursos de apoyo al CBC | Carreras y Cursos de Diseño, Comunicación, Arte y Fotografía |
|
|
Imprimir apunte |
Recomendar a un amigo |
Recordarme el recurso |
|
Más sobre este recurso: Catalogado en base de datos como: Algoritmos y Estructuras de Datos I: 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. Agregado: 17 de JULIO de 2003 (Por Michel Mosse) | Palabras: 806 | Votar! | Sin Votos | Sin comentarios | Agregar Comentario Categoría: Apuntes y Monografías > Computación > Programación > |
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)>i³dim(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 i³dim(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 L³ind0*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
| ||||