![]() |
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 de la Práctica 4. Programación. Agregado: 17 de JULIO de 2003 (Por Michel Mosse) | Palabras: 4792 | 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
1.1.i)
a) P º {n=N0 Ù m=M0}
1.1.ii)
b) Q º {ret_value = M0*N0}
1.1.iii)
b)Pc º {ret_value = 0
Ù i = 0 Ù n=N0
Ù m=M0}
B º {i < f_abs
n }
I º {ret_value =
m*i Ù 0 £ i £ (f_abs n) Ù n=N0
Ù m=M0}
Fv = (f_abs n) - i
Qc º {ret_value =
(f_abs n) * m Ù n=N0
Ù m=M0}
1.1.iv)
Precondición y postcondición para la
función abs:
P º {n=N0}
Q º
{ret_value = f_abs N0}
1.2.i) a) P º {n=N0
}
1.2.ii) c) Q º {
(ret_value = f_primo(N0) ) }
2i)
function
Potencia (n:integer,m:integer):integer
var
i:integer:=0;
ret_value:=1;
// no hace falta declarar a retvalue porque se declara
// automáticamente con el tipo
declarado en la función
while (i<m) do
i:=i+1;
ret_value:=retvalue*n;
od;
endfunction
2ii)
function Factorial (n:integer):integer
var
i:integer:=0;
ret_value:=1;
while
(i<n) do
i:=i+1;
ret_value:=ret_value*i;
od;
endfunction
2iii) (2do cuat. 99)
function
Fibonacci (n:integer):integer
var
i:integer:=1;
j:integer:=0;
ret_value:=1;
if ((n==0) ||
(n==1)) then
ret_value:=n;
else
while
(i<n) do
ret_value:=ret_value+j;
j:=ret_value-j;
i:=i+1;
od;
fi;
enfunction
2iii)
Está mal la especificación
a-vii) Pº{i=I0 Ù n=N0
Ù I0>0
Ù (f_par(I0)Þ N0³0)}
a-ix) Qº{ret_value=f_raizEnesima
I0 N0}
b-i) Pº{TRUE}
b-iv) Qº{ret_value=101}
4-i)
No concuerda.
La guarda no coincide con lo que se
encuentra adentro del while.
4-ii)
Código
que respeta los estados:
(hay un error en el I?)
function
Hay_algun_cuadrado2 (n:integer, m:integer):bool
var
i:integer:=n;
ret_value:=false;
while
(i<=m) do
ret_value=(cuadrado?(i)
Ú ret_value);
i:=i+1;
od;
Estados
que respetan el código:
P º{ n =
N0 Ù m = M0 }
Pc º { i=m Ù ret_valueºfalse Ù ((N0>=M0)
=> (n=N0 Ù m=M0 ))
Ù
((N0<M0) =>
(n=M0 Ù m=N0)}
//I º { (ret_value º ($k)((n <= k
< i - 1) Ù
es_cuadrado(k))) Ù (n <= i
<= m + 1)
Ù n = N0
Ù m = M0 Ù N0
<= M0 }
B º ( i>n )
//Fv = m – i
//Qc º Q º{ ret_value º ($k)(( N0 <= k <= M0)
Ù es_cuadrado?(k)) }
EL
CODIGO NUNCA ENTRA AL CICLO
5-a-i)
No, pues el invariante está mal. No puede ser que antes de entrar al ciclo
ret_value ya dé la suma.
5-a-ii)
No, por la misma razón que i
5-a-iii)
No, porque en el invariante aparece ret_value=ret_value+i lo cual no tiene
sentido
5-a-iv)
SI
5-b)
function SumMenMul (n:integer, m:integer)
ret_value:=0;
while
(n>0) do
if
(es_mult(n,m) then
ret_value:=ret_value+n;
else
skip;
fi;
n:=n-1;
od;
endfunction
5-c)SI
6-i)
P º {n=N0
Ù m=M0
Ù M0>0
Ù N0³0}
Q º
{ret_value=f_resto N0 M0}
Pc º {ret_value=N0}
Qc º Q
B º {ret_value³m}
I º {(f_resto
ret_value m = f_resto N0 M0) Ù (0≤ret_value≤n)}
Fv = (f_resto N0 M0)
- ret_value
//resto:: Nat -> Nat -> Nat
//resto
n d | (d==0) = error “No se puede dividir por 0”
// | (n==0) = 0
// | (n<d) = n
// | (n==d) = 0
// | otherwise = resto (n-d) d
function
Resto (n:integer,m:integer):integer
ret_value:=n;
while (ret_value³m) do
ret_value:=ret_value-m;
od;
endfunction
6-ii)
P º {n=N0 Ù m=M0 Ù M0>0 Ù N0³0}
Q º {ret_value = f_division N0
M0}
Pc º {ret_value=0}
Qc º Q
B º {n³m}
I º {(f_resto n m = f_resto N0
M0) Ù (ret_value*m + n = N0) Ù (0≤n≤N0)}
Fv = n - (f_resto N0 M0)
//division::
Nat -> Nat -> Nat
//division
n d = division2 n d 0
//division2::
Nat -> Nat -> Nat -> Nat
//division2
n 0 v = error "No sea bruto, no se puede dividir por cero."
//division2
0 d v = 0
//division2
n d v |(n<d) = v
// |(n==d) = v+1
// |
otherwise = division2 (n-d) d (v+1)
function División_entera (n:integer,m:integer):integer
ret_value:=0;
while (n³m) do
n:=n-m;
ret_value:=ret_value+1;
od;
endfunction
6-iii)
P º {n=N0 Ù m=M0 Ù ⌐(N0=0 Ù M0=0) Ù (N0³0) Ù (M0³0)}
Q º {ret_value = f_mcd N0 M0}
Pc º P
Qc º {n=f_mcd N0 M0 Ù m=n}
B º {n¹m}
I º {f_mcd(N0,M0)=f_mcd(n,m)
Ù (f_mcd(N0,M0)≤n≤N0)
Ù (f_mcd(N0,M0)≤m≤M0)}
FV = (n+m) – 2*(f_mcd N0 M0)
//mcd::
Nat -> Nat -> Nat
//mcd
0 m = m
//mcd
n 0 = n
//mcd n m = mcd m (resto n m)
function MCD (n:integer,m:integer):integer
while (n¹m) do
if (n>m) then
n:=n-m;
else
m:=m-n;
od;