Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1101
II Semestre 2013
[<=] [home] [<>] [\/] [=>]
CI-1101 Programación I

Examen #2 [solución]

      Duración: Ciento veinte minutos. Lea bien el examen antes de hacerlo. El examen es a libro abierto. Cuenta la documentación. Cuenta la redacción y la ortografía. Puede hacer el examen con lápiz. Resuelva las tres preguntas. ¡No haga más de lo que se le pide!

1) [33 pts]
public static long gcd(long m, long n) {
    if ( m<0 ) { return gcd(-m,n); }
    if ( n<0 ) { return gcd(m,-n); }

    if (n==0) { return m; }
    else if (m<n) { return gcd(n,m); }
    else { return gcd(n,m%n); }
}

1.a) [9 pts] Escriba la especificación de la rutina gcd() que calcula el Máximo Común Divisor usando una versión recursiva del algoritmo de Euclides. Incluya como ejemplos “assertTrue()” el resultado de ejecutar tanto gcd(2,3) como gcd(2*3*5 , 2*2*2 * 3*3 * 5*5*5) y gcd(30,9000).

1.b) [12 pts] Dibuje los registros de activación que mostraría Jeliot al ejecutar gcd(2,3).

1.c) [12 pts] Implemente de nuevo gcd() de manera que produzca los mismos resultados que la versión recursiva de la rutina. No use recursividad para esta nueva implementación.

 

2) [33 pts] El método voySubiendo() sirve para determinar el tamaño del pedazo ascendente de un vector, aún si no está ordenado.
{
    { int V[]= {00,10,20,30,-1};       assertTrue( 4 == voySubiendo( 0, V ) ); }
    { int V[]= {00,10,20,30,30,60,-1}; assertTrue( 3 == voySubiendo( 3, V ) ); }
    { int V[]= {00,-1};                assertTrue( 1 == voySubiendo( 0, V ) ); }
    { int V[]= {00};                   assertTrue( 1 == voySubiendo( 0, V ) ); }
    { int V[]= null;                   assertTrue( 0 == voySubiendo( 0, V ) ); }
}

2.a) [5 pts] Escriba la especificación de voySubiendo(). No olvide incluir ejemplos de uso assertTrue() y assertFalse().

2.b) [11 pts] Implemente voySubiendo(). Incluya documentación interna que explique por qué los índices usados en su algoritmo no se salen del vector.

2.c) [6 pts] Escriba la especificación de soyColina() que sirve para determinar si los valores de un vector primero ascienden y luego descienden. No olvide incluir ejemplos de uso assertTrue() y assertFalse().

2.d) [11 pts] Suponga que usted cuenta ya con la rutina voyBajando(): úsela junto con voySubiendo() para implementar soyColina().

 

3) [33 pts]

[3(21)] [4(33)] [5(45)]
 21  22
   47
 25  26 
 33     34
   35 36
   37 38
 39     40 
 45      46
   47  48
     99
   51  52
 53      54 

3.a) [7 pts] El método estático "laEquis()" de la clase "Biblio" recibe dos números e imprime una equis de varios niveles a partir del segundo valor. Escriba la especificación completa de "laEquis()".

3.b) [26 pts] Implemente "laEquis()". En el ejemplo se muestra "laEquis()" para los valores [3(21)], [4(33)] y [5(45)].

 

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2013
Derechos de autor reservados © 2013
[home] <> [/\]