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:

  1. Una buena inversión. La casa (la empresa) premia al jugador con la cantidad de dinero indicada en la celda (con un número positivo) y el jugador lo acumula en su saldo.
  2. Una mala inversión. El jugador pierde la cantidad de dinero indicada en la celda (con un número negativo), el cual se descuenta del saldo del jugador y en tal caso, la casa gana.
  3. Ninguna inversión. El jugador no realiza ninguna inversión, lo cual se indica con un 0 en la celda.

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
Ejemplo de un tablero de juego almacenado en un archivo de texto

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
Ejemplo de una potencial ejecución del programa

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).

Evaluación

  1. [10%]. Hace un adecuado procesamiento de parámetros. Brinda ayuda si el usuario no provee los adecuados.
  2. [10%]. Procesa cada archivo correctamente. Reporta errores si los hay. Cierra los archivos inmediatamente después de que no se necesitan más.
  3. [30%]. Utiliza estructuras de datos adecuadas para representar los tableros y las celdas. Hace un adecuado cargado a partir de los archivos. Utiliza la cantidad justa de memoria y no impone restricciones sobre las dimensiones. No crea fugas de memoria.
  4. [30%]. Hace una correcta simulación de una partida de juego. Aplica adecuadamente las inversiones iniciales sobre el saldo. Refleja sobre el saldo las inversiones de cada celda donde el jugador cae. Utiliza correctamente la generación de números aleatorios. Se detiene cuando el jugador se queda sin saldo o cuando alcanza la meta.
  5. [20%]. Reporta las estadísticas correctamente. Indica el promedio de los balances (saldo final menos saldo inicial) de las partidas y la cantidad de partidas en las que el jugador alcanzó la meta. Estas estadísticas se reportan en una tabla por cada inversión inicial hecha por el jugador.
  6. [10% opcional]. Utiliza arimética de punteros en la solución en lugar del operador corchetes.