Universidad de Costa Rica
|
|
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 son1 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.
Adolfo Di Mare <adolfo@di-mare.com>.
|