Algoritmos y Programación II FACYT – Universidad de Carabobo Solución de la Prueba Diagnóstica Respuesta pregunta 1 Implementación func ack(m, n) : integer begin if m = 0 return n + 1; else if n = 0 return ack(m-1, 1); else return ack(m-1, ack(m, n-1)); endif endif end Corrida A(2,2) A(1, A(2, A(1, A(1, A(1, A(1, A(1, A(1, A(1, A(1, A(1, A(1, A(1, A(1, A(1, A(0, A(1, A(0, A(1, A(0, A(1, A(0, A(1, A(0, A(1, A(0, A(1, A(0, A(1, 5) A(0, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 6) 7 1)) A(2, A(1, A(0, A(0, A(0, 3)) A(1, A(0, A(0, A(0, A(0, A(0, 4)) 4)) A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 5)) 0))) 1))) A(1, 0)))) A(0, 1)))) 2))) 2))) A(1, A(0, A(0, A(0, 3))) 1)))) A(1, 0))))) A(0, 1))))) 2)))) 3))) A(1, A(0, A(0, A(0, A(0, A(0, 4))) 2)))) A(1, 1))))) A(0, A(1, 0)))))) A(0, A(0, 1)))))) A(0, 2))))) 3)))) 2005/2006 Algoritmos y Programación II FACYT – Universidad de Carabobo 2005/2006 Respuesta pregunta 2 ¦ proc p1 (in a : integer) ¦ begin ¦ if a > 0 then ¦ begin ¦ writeln( a ); ¦ p1( a - 1 ); ¦ end ¦ else ¦ writeln ( 'Fin' ) ¦ endif; ¦ end Salida de este programa para a = 6: 6 5 4 3 2 1 Fin Al añadir las siguientes dos ultimas instrucciones a p1: proc p1 (in a : integer) ¦ begin ¦ if a > 0 then ¦ begin ¦ writeln( a ); ¦ p1( a - 1 ); ¦ end ¦ else ¦ writeln ( 'Fin' ) ¦ endif; ¦ writeln ( a ); ¦ writeln ('Fin de verdad'); ¦ end Salida de este programa para a = 6: 6 5 4 3 2 1 Fin 0 Fin 1 Fin 2 Fin 3 Fin 4 Fin 5 Fin 6 Fin de verdad de verdad de verdad de verdad de verdad de verdad de verdad Algoritmos y Programación II FACYT – Universidad de Carabobo 2005/2006 Respuesta pregunta 3 Sintaxis Crear: Asignar: Numerador: Denominador: Sumar: Restar: Multiplicar: Dividir: Racional x Entero x Entero Racional Racional Racional x Racional Racional x Racional Racional x Racional Racional x Racional Æ Æ Æ Æ Æ Æ Æ Æ Racional Racional Entero Entero Racional Racional Racional Racional Especificación Operacional {Pre: } Func crear() : Racional; ⎧p ⎫ / p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ ; p = 0, q = 1;} ⎩q ⎭ {Post: crear Å Q = ⎨ {Pre: ∃b ∈ Ζ / b ≠ 0 } Func asignar(in r : Racional; in a, b : integer) : Racional; ⎧p ⎫ / p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ ; p = a, q = b;} ⎩q ⎭ {Post: crear Å Q = ⎨ {Pre: } Func numerador(in r : Racional) : integer; ⎧p ⎫ / p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ } ⎩q ⎭ {Post: crear Å p; Q = ⎨ {Pre: } Func denominador(in r : Racional) : integer; ⎧p ⎫ / p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ } ⎩q ⎭ {Post: crear Å q; Q = ⎨ {Pre: } Func sumar(in r1, r2 : Racional) : Racional; {Post: crear Å r1 + r2; ∀r1, r 2 ∈ Q / r1 = p1 + p 2 p1 p2 } , r2 = , r1 + r 2 = q1 q2 q1 + q 2 {Pre: } Func restar(in r1, r2 : Racional) : Racional; {Post: crear Å r1 - r2; ∀r1, r 2 ∈ Q / r1 = p1 p2 p1 − p 2 , r2 = , r1 − r 2 = } q1 q2 q1 − q 2 {Pre: } Func multiplicar(in r1, r2 : Racional) : Racional; {Post: crear Å r1 * r2; ∀r1, r 2 ∈ Q / r1 = p1 p2 p1 * p 2 } , r2 = , r1 * r 2 = q1 q2 q1 * q 2 {Pre: } Func dividir(in r1, r2 : Racional) : Racional; {Post: crear Å r1 / r2; ∀r1, r 2 ∈ Q / r1 = p1 p 2 r1 p1 * q 2 } , r2 = , = q1 q 2 r 2 q1 * p 2 Algoritmos y Programación II FACYT – Universidad de Carabobo 2005/2006 Register Racional Numerador : integer; Denominador : integer; End register Func multiplicar(in r1, r2 : Racional) : Racional; begin aux : integer; out : Racional; aux Å MCD(r1.numerador * r2.numerador, r1.denominador * r2.denominador); out.numerador Å (r1.numerador * r2.numerador)/aux; out.denominador Å (r1.denominador * r2.denominador)/aux; return out; end Func dividir(in r1, r2 : Racional) : Racional; begin aux : integer; out : Racional; aux Å MCD(r1.numerador * r2.denominador, r1.denominador * r2.numerador); out.numerador Å (r1.numerador * r2.denominador)/aux; out.denominador Å (r1.denominador * r2.numerador)/aux; return out; end Func MCD(in m, n : intenger) begin rem : integer; while(n ≠ 0) do begin rem Å m mod n; m Å n; n Å rem; end return m; end