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

Examen #1 [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 todas las preguntas. ¡No haga más de lo que se le pide!

 

1) [33 pts] La gran ventaja de la función intlist() es que permite hacer ejemplos para listas usando valores escritos dentro de una hilera, como se muestra en este ejemplo que complementa la especificación de la función swapNext().
{{  // test::swapNext()
    std::list<int> L = intlist( "[ 0 1 2 3 4 5 ]" );
    std::list<int>::iterator it;
    it = L.begin();
    for ( int i=0; i<3; ++i ) { it++; }                // <!~!>
    swapNext( L , it ); assertTrue( L == intlist( "[ 0 1 2 4 3 5 ]" ) );

    L = intlist( "[ 0 1 2 3 4 5 ]" );                   // <!~!>
    swapNext( L , L.begin() ); assertTrue( L == intlist( "[ 1 0 2 3 4 5 ]" ) );
}}

1.a) [11 pts] Especifique la función noDescendente() que sirve para determinar hasta qué punto está ordenada una lista. Incluya los datos de prueba BUnit.

1.b) [11 pts] Especifique la función swapNext(). Incluya los datos de prueba BUnit.

1.c) [11 pts] Implemente ordenador() que usa, repetidamente, noDescendente(), hasta que la lista queda totalmente ordenada en orden no descendente.

1.d) [0 pts] Explique cómo usar los inicializadores de listas de la nueva versión C++11 para obtener un efecto similar al de usar las listas producidas por intlist().

 

2) [33 pts] Suponga que usted cuenta con una rutina list<string> tokens(string) que toma una hilera y retorna una lista de las palabras que están entre espacios. La función check_ok() sirve para verificar si en una lista de hileras las barritas '|' vienen en parejas lo mismo que los paréntesis '(' y ')', sin que estén anidados. Además, dentro de las barritas o los paréntesis debe haber por lo menos una palabra:
{
    assertTrue(  check_ok( tokens( "kkk = # | 1 2 3 | algo etc c++ ( 0 1 ) .." ) ) );
    assertTrue(  check_ok( tokens( "= 1 2 3 " ) ) );    // No hace falta llave

    assertFalse( check_ok( tokens( "kk = |  " ) ) );    // falta barrita emparejada
    assertFalse( check_ok( tokens( "kk = ( )" ) ) );    // falta palabra entre paréntesis
}

2.a) [0 pts] Explique si la palabra token significa o no “componente léxico”.

2.b) [11 pts] Escriba en formato Doxygen la especificación de check_ok(). Incluya los datos de prueba BUnit junto con una lista exhaustiva de todos los posibles errores que check_ok() debe detectar.

2.c) [15 pts] Implemente check_ok().

2.d) [7 pts] Modifique la especificación de check_ok() de manera que reporte todos los detalles sobre el error detectado.

 

3) [33 pts] Considere el siguiente programa “empacado”:
#include<map> // se dice diccionario
#include<iostream>
class chunga:private std::map<long,long>{public:long Qty(long n)
const{std::map<long,long>::const_iterator it;it=this->find(n);if(
it==this->end()){return 0;}else{return it->second;}}long
operator[](long n)const{return Qty(n);}void inc(long n)
{std::map<long,long>::iterator it; it=this->find(n);if(
it==this->end()){this->insert(std::map<long,long>::value_type(n,1));}
else{(it->second)++;}}};int main(){chunga B;long n;while(std::cin>>
n){B.inc(n);std::cout<<" "<<n;}for(n=0;n<32000;++n){if(0!=
B[n]){std::cout<<"\nB["<<n<<"]"<<"=="<<B.Qty(n);}}return 0;}

3.a) [0 pts] Justifique cada una de las reglas de indentación usadas en el curso. Discuta si esas reglas son convenciones de programación apropiadas para C++.

3.b) [11 pts] Dele formato a este programa usando las reglas de indentación definidas en el curso.

3.c) [18 pts] Escriba en formato Doxygen la especificación para la clase y cada una de los métodos de este programa. Incluya los datos de prueba BUnit.

3.d) [4 pts] Muestre el resultado de ejecutar este programa si los datos de entrada son 1 2 3 3 3 3 3 3 3 3 3 3 3 3 4 5 6 7 8 3 123 123 123. Recuerde que std::cin>>n sirve para leer el siguiente número entero y luego dejarlo en la variable n. Explique por qué se produce ese resultado.

 

Soluciones

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