Universidad de Costa Rica Escuela de Computación |
Examen 01 |
CI-1201 Programación II - 2013a Profesor Jeisson Hidalgo-Céspedes |
En cada ejercicio se evaluará la eficiencia del código, el uso de identificadores significativos, la indentación, escritura correcta de llaves {} y el uso adecuado de la palabra reservada const. Se dispone de tres horas para entregar la prueba y debe realizarse en forma estrictamente individual.
En su tseis dcootarl de 1976, Garahm Rwailsnon de la Uinevsrdiad Ntoitgnahm de Ignaletrra, ecnnotró epxremineatmlnete que no ipmrota el odren en que las ltears estén ecsirats, seipmre y caudno la piremra y la útlmia ltera de la plabara estén en la psociión croertca. El crebero hmunao peude leer y rcepurear el mneasje oiriganl con una dficiluatd csai dserpceailbe; dbedio a que no lee ltera por ltera snio plabaars cmolpteas. A etse fenóemno se le lalmó ifnroammlnete tpygoylecima en ignlés.
Escriba un programa en C que reciba una lista de nombres de archivos de texto por parámetro, y para cada uno de ellos imprima en la salida estándar el contenido del cada archivo tras desordenar las letras internas de sus palabras. Su programa sólo debe desordenar letras y no números u otros caracteres especiales. Asuma que las palabras se separan por espacios en blanco. Puede utilizar las funciones int isalpha(int ch)
y int isspace(int ch)
, las cuales retornan verdadero si el carácter ch
es una letra o un espacio en blanco respectivamente. Ambas se encuentran en el encabezado <ctype.h>
. Su programa debe ser capaz de procesar correctamente archivos de texto cuyas líneas pueden tener cualquier longitud.
Una empresa de juegos de azar y apuestas, quiere introducir un nuevo juego adaptado del viejo juego indio llamado "serpientes y escaleras". El jugador hace una apuesta inicial de dinero, con lo cual obtiene una ficha que posiciona en la celda inicial de un tablero. En cada turno moverá su ficha un número de celdas indicado por el azar del lanzamiento de un dado de 6 caras. Cada celda del tablero tiene una lección, que puede ser:
Si en su recorrido el jugador se queda sin dinero (su saldo se torna 0 o negativo), no tendrá capacidad de inversión y debe abandonarlo. El objetivo del jugador es alcanzar la última celda del juego, la cual tiene un gran premio por salir triunfante en el mundo de los negocios. Sin embargo, a lo largo del recorrido del tablero hay escaleras y serpientes. Las escaleras son atajos que ayudan al inversionista astuto a alcanzar su meta, mientras que las serpientes provocan que el jugador regrese a una celda previa haciendo su recorrido más extenso.
La empresa ha diseñado varios tableros y quiere probarlos antes de escoger los que va a poner en operación. Por esto le ha contratado con el fin de crear un eficiente programa en C que ejecute varias simulaciones de juegos sobre el tablero y provea estadísticas. La casa necesita que algunos jugadores alcancen la meta y naturalmente que el juego genere utilidades para la empresa.
Los tableros diseñados se almacenan en archivos de texto, donde cada línea representa una celda del tablero. El número de la celda corresponde con el número de línea en el archivo. Cada celda se compone de dos campos enteros separados por espacios en blanco: la inversión y un salto. La inversión es la cantidad de dinero que gana o pierde el jugador por caer en esa celda. El salto indica cuál es la próxima celda a la que debe brincar el jugador. Si no hay salto se indica con un 0. El siguiente listado muestra un archivo de un tablero pequeño:
0 0 150000 0 -100000 0 0 11 100000 2 -50000 2 0 0 250000 0 -250000 0 100000 7 -300000 0 1000000 0
Dado que la inversión inicial del jugador puede influir significativamente en los resultados, se quiere probar contra una variedad de potenciales inversiones expresada como un rango entre un valor mínimo y un valor máximo en incrementos de cierta cantidad de dinero. Esos valores los recibe su programa como parámetros de invocación.
El resultado de una partida del juego a otra puede ser muy distinto. Por esto, su programa recibe un cuarto parámetro que indica la cantidad de partidas que se deben simular. Finalmente, su programa recibe el nombre de uno o más archivos de texto con tableros. Si alguno de los parámetros obligatorios no es provisto, su programa debe brindar alguna pequeña ayuda de uso, algo como:
Uso: escsep min max incremento iteraciones archivo1 [archivo2 ... archivoN]
El siguiente podría ser un ejemplo de ejecución del programa:
$ escsep 0 1000000 250000 100 tablero01.txt tablero02.txt tablero01.txt: InversionInicial BalancePromedio MetasAlcanzadas 0 0 0 250000 -100000 0 500000 -25000 1 750000 5000 3 1000000 50000 5 tablero02.txt: InversionInicial BalancePromedio MetasAlcanzadas 0 10000 1 250000 35000 4 500000 75000 4 750000 125000 9 1000000 210000 15
En general su programa debe simular juegos con cada tablero e indicar cuánto en promedio son los balances de los jugadores de acuerdo a las inversiones iniciales, y en cuántas de esas partidas el jugador alcanzó la meta. El siguiente pseudocódigo le ayudará a comprender el algoritmo que la empresa necesita:
Para cada tablero almacenado en el [archivoI] Cargar el tablero desde el archivo Para cada inversión inicial desde [min] hasta [max] en incrementos de [incremento] Simular [iteraciones] del juego Imprimir el promedio de los balances de los jugadores Imprimir cuántos jugadores alcanzaron la meta
Para cargar el tablero su programa debe utilizar una estructura que represente la celda, la cual tiene los dos campos (la inversión y el salto), y crear una estructura de datos almacene la cantidad justa de celdas. Su programa no debe imponer restricciones fijas sobre el tamaño los tableros ya que la empresa necesita probar tableros de dimensiones arbitrarias.
Una vez cargado un tablero se puede hacer una partida de juego sobre él. El jugador parte con una inversión inicial en la primera de las celdas, y en cada turno la computadora lanza un dado generando un número pseudoaleatorio entre 1 y 6. La partida concluye cuando el jugador alcanza la meta o se queda sin dinero (saldo 0 y no negativo).