Introducción a Mooshak y Primer
Problema
Modalidad: Problemas de Programación C
Contexto
Mooshak es una herramienta que te ayudará a aprender a programar en C. Mooshak te planteará problemas, que resolverás con normalidad en tu entorno Dev-C; posteriormente “subirás” el ejercicio a Mooshak y esta herramienta te indicará si has resuelto el problema correctamente. Tu profesor podrá comprobar si has resuelto el ejercicio, cuándo y cómo.
Mooshak es una herramienta del tipo Juez On-line. Antes de comenzar con los problemas propiamente dichos, vamos a aclarar algunos aspectos básicos del funcionamiento de este juez on-line: la forma de hacer la entrada y la salida en los programas, la depuración y realización de pruebas, los tipos de mensajes que emite el juez, etc. Después veremos un problema concreto y su solución en el lenguaje C.
¿Qué es el juez on-line?
Es un sistema automático de corrección de programas. Le enviarás tu programa (el código fuente) para un determinado problema y el juez se encargará de compilarlo y comprobar si es correcto. Para hacer posible la comprobación, el problema tiene definido de forma precisa cuál es el formato de la entrada y de la salida. La comprobación es estricta: dados unos datos de entrada, el resultado debe ser exactamente igual al esperado (incluidos los espacios en blanco, las comas, los fin de línea '\n', etc.).
En todos los problemas, debemos tener en cuenta lo siguiente:
• ANSI C : Los programas estarán escritos en el estándar ANSI C. • Entrada de datos: La entrada de datos se realizará con instrucciones
scanf y no irá acompañada de instrucciones previas printf del tipo
“Introduzca dos enteros :”; observar detenidamente los ejemplos
que se darán en cada programa y seguir estrictamente el formato indicado para la entrada de datos.
• Salida de datos. Los datos de salida se realizarán con la función printf , siguiendo estrictamente el formato indicado en el ejemplo de cada programa.
• El programa principal. La función main se codificará de la siguiente
forma:
int main (void) {
... return 0; }
La función main debe definirse de tipo int y tener como parámetro el tipo void (nada). Además, siempre debe acabar con una instrucción return 0; indicando que la ejecución ha sido
correcta. Si se omite, Mooshack dará un error Compile Time
Error, y si se pone return 1; el resultado será un error
Invalid Function.
• La compilación. Si tu programa produce un error de compilación al
compilarlo en DEV-C, no merece la pena enviarlo a Mooshak, ya que siempre generará una respuesta de Compile Time Error. No obstante, a veces el programa compila bien en Dev-C pero el juez on-line devuelve un error de compilación inesperado. Pulsando en el enlace que aparece sobre la palabra Compile Time Error podemos ver el
mensaje de error devuelto por el compilador en el juez. Las causas más frecuentes son:
o La función main no se ajusta a lo especificado arriba. o Hemos puesto en el fichero la extensión .cpp en vez de .c o Falta incluir librerías en C. A veces, Dev-C incluye librerías (como
la stdlib.h o math.h) sin que nosotros se lo indiquemos mediante la directiva #include, pero Mooshak no lo hace y genera un error. Por lo tanto, no olvides poner todos los
#include necesarios en el programa. Si tu programa Dev-C produce errores del tipo warning (aviso), Mooshak producirá un error de compilación. Asegúrate de que no los produce.
¿Cuáles son las posibles respuestas del juez?
Tu objetivo, al enviar un programa a Mooshak, es conseguir la respuesta
Accepted, que indica que el programa se ha compilado sin errores, se ha ejecutado bien, y produce los resultados esperados para todos los casos de prueba que ha establecido tu profesor.
La respuesta Presentation Error significa que vas por buen camino; el resultado es casi correcto, pero existe algún error de formato: faltan o sobran líneas o
espacios en blanco. Pero, ojo, no siempre es de esperar que el error de formato se señale con una respuesta de este tipo. Es decir, es posible que algunos errores de formato no den Presentation Error sino la temible respuesta
Wrong Answer.
Si obtienes una respuesta Wrong Answer, no te quedará más remedio que revisar todo el programa, comprobar los ejemplos del enunciado, los casos especiales, la entrada y salida, etc.
Ya hemos mencionado arriba los errores Compile Time Error e Invalid Function. Recuerda que pinchando en los enlaces (que aparecen sobre esas palabras) puedes ver exactamente cuál es el error que ha ocurrido.
En cuanto a los errores en tiempo de ejecución, tienes: Memory Limit Exceeded, Time Limit Exceeded y Runtime Error. Normalmente el juez tiene establecidos unos límites de tiempo y memoria generosos, por lo que los dos primeros errores sólo deberían ocurrir si nuestro programa es altamente ineficiente en tiempo de ejecución o uso de memoria. Por su parte, el Runtime Error indica que el programa ha abortado al ejecutarse. Una causa típica puede ser salirse de un array.
Estructura del enunciado de los problemas
Todos los enunciados siguen una estructura común:
1. Nombre del problema. Aparece en la parte superior del enunciado. 2. El Problema. La descripción detallada del problema y de lo que debe
hacer tu programa.
3. Entrada. Especificación precisa e inambigua del formato de la entrada. 4. Salida. Especificación precisa e inambigua del formato de la salida.
Nuestro programa debe ajustarse de forma estricta a ese formato.
5. Ejemplo de Entrada. Es un ejemplo posible de la entrada del programa, ajustado al formato de entrada.
6. Ejemplo de Salida. La salida correspondiente al ejemplo de entrada, según el formato de salida especificado.
Ejemplos de entrada y de salida
Los enunciados de todos los problemas incluyen algunos ejemplos de entrada y de salida. Estos ejemplos son muy interesantes por varios motivos:
• Pueden servir para aclarar algunos aspectos del formato de entrada (o
de salida) que hayan podido quedar un poco ambiguos. Por ejemplo, en un enunciado puede decir: "la entrada contiene N enteros...", y en el
ejemplo se aclara que los enteros están separados por espacios en blanco.
• Pueden ser útiles para comprender el funcionamiento esperado del
programa. A veces los ejemplos contienen casos extremos o problemáticos, aclarando el resultado que debe dar el programa.
• Durante la fase de verificación y depuración del programa, los ejemplos
pueden usarse para comprobar su correcto funcionamiento.
Los ejemplos de entrada y de salida pueden entenderse como un requisito previo antes de enviar un programa a Mooshak: si nuestro programa no funciona con esos casos, el juez on-line nunca lo aceptará. Obviamente, la implicación no es doble: puede que el programa funcione con los ejemplos dados pero que el juez no lo acepte. Los casos que usa internamente el juez on-line (datos de entrada y de salida puestos por tu profesor) son secretos, y normalmente mucho más largos y exhaustivos que los que aparecen en el enunciado.
¿Qué otras utilidades ofrece el juez on-line?
Mooshak además de para revisar programas, sirve para realizar concursos de programación on-line, por lo que puede asignar puntuaciones a los problemas, realizar clasificaciones, mostrar estadísticas y cosas así. Si aprendéis suficiente programación, puede que organicemos algún concurso on-line.
¿Cómo se usa el juez on-line?
Es muy sencillo usar Mooshak. Una vez que hayas pasado la pantalla de acceso, busca la zona “Problema”. Te aparecerán varios botones nombrados como A, B, C, … ; cada uno de ellos es un problema. Selecciona el que quieras resolver. Pulsa el botón “Ver” para ver el enunciado.
Resuelve tu problema en Dev-C , adecuando el formato de la función main()
a Mooshak, y cuidando que la entrada y salida de datos esté exactamente en el mismo formato que en los ejemplos. Pruébalo, con el habitual getchar() que sueles colocar al final del programa para que no se cierre la ventana Windows. Una vez que te funcione bien, quita la instrucción getchar() del final del programa, o mejor, ponla como un comentario, para preparar la “subida” del programa a Mooshak.
Cuando lo tengas preparado vuelve a Mooshak y en “Programa” pulsa en “Seleccionar Archivo” para seleccionar tu programa .c en tu ordenador. Una vez seleccionado, pulsa “Enviar”.
Ya está enviado. En la zona “Listados”, selecciona el botón “Envíos”, y podrás ver tu envío y su estado. Si el programa está bien hecho y funciona correctamente para los casos de prueba que habrá puesto el profesor, tu envío aparecerá Accepted. En caso contrario aparecerá cualquiera de las opciones que te he contado en la zona “¿Cuáles son las posibles respuestas del juez?” de este mismo documento. Revísalo y vuelve a enviarlo tantas veces como necesites hasta que aparezca Accepted. Recuerda que hay que ser muy estricto con el formato de la entrada y salida de datos.
El Primer Problema
Una vez situados en Mooshak, te toca probar el primer problema, que en este caso os daré resuelto. Se introducen dos enteros por teclado en rango 0..1000, y se imprime en pantalla la suma, resta y producto de ambos.
Entrada
La entrada consiste en dos enteros separados por un espacio en blanco
La salida consiste en tres enteros separados entre cada dos por un espacio y a continuación el carácter \n; el primero será la suma, el segundo la resta y el tercero el producto de los dos enteros de la entrada.
Ejemplo de Entrada
5 4Ejemplo de Salida
9 1 20Solución
#include <stdio.h> int main (void) { int a,b,suma,resta,producto; scanf("%d %d",&a,&b);fflush(stdin); suma=a+b; resta=a-b; producto=a*b; printf("%d %d %d\n",suma,resta,producto); /*getchar();*/ return 0; }Isidro Verdú Conesa
(Texto adaptado del original del profesor Ginés García Mateos) Departamento de Informática y Sistemas Universidad de Murcia