g++
Las preguntas con ficheros son un tipo muy especial de pregunta externa en la que Siette espera como respuesta del alumno uno o varios ficheros (con un límite de 4). Una vez que recibe el fichero, Siette lo guarda y lo copia en un directorio de trabajo y sobre aplica una serie de pruebas consistentes en la ejecución de una secuencia de instrucciones del sistema operativo de las que espera obtener ciertos resultados por la salida estándar. Comparando estos resultados con los resultados esperados, la ejecución de esta serie de pruebas escritas en un lenguaje propio denominado SPSL, devuelve a Siette una cadena de caracteres que Siette interpreta como la respuesta del alumno, comparándola con las posibles respuestas incluidas del ítem base y procediendo a partir de ese momento como con cualquier otro ítem interno.
En esta sección se introducen algunos ejemplos sencillos para explicar la base de su funcionamiento, hay casos especiales que se tratarán aparte como las preguntas generativas con ficheros y las preguntas compuestas con fichero.
Finalmente al final del capítulo se incluyen algunas consideraciones y consejos en el uso de preguntas con ficheros.
El caso mas simple de preguntas de ejecución de ficheros es aquel en el que el fichero enviado como respuesta se procesa y se captura su salida que se pasará a Siette directamente como respuesta.
Siette reconocerá esta respuesta como cualquier otra respuesta a una pregunta de respuesta libre e intentará reconocer mediante alguno de los patrones si la respuesta (el resultado de la ejecución del script de procesamiento) coincide con alguno de ellos.
El siguiente es el enunciado (y la solución) de un pequeño programa en Python para determinar si una lista de números que se le pasa como argumento al programa está o no ordenada:
Para evaluar esta pregunta, se requiere al alumno que envíe un fichero con el nombre test.py
. Para evaluar la solución se mostrará al alumno un área de texto donde debe introducir como respuesta el contenido de este fichero:
Para corregir este ítem se usa un script de procesamiento escrito en el lenguaje SPSL, con las siguientes instrucciones, en la pestaña Avanzado, en donde debe indicarse previamente que el Sistema de presentación de la pregunta es Enviar fichero
:
python3 test.py 1 2 3 4; python3 test.py 1 5 3 4;
cuya ejecución en el caso correcto dará como salida la secuencia:
TrueFalse
Por consiguiente, bastaría con indicar en Siette que el patrón de respuesta correcta es TrueFalse
para que Siette interprete que esta salida corresponde a la respuesta correcta. Cualquier otra salida encajaría con el patrón de respuesta no reconocida, a menos que también se proporcionen patrones de posibles respuestas incorrectas, como FalseFalse
que corresponde al caso en que no reconoce una lista ordenada:
Puede añadirse un refuerzo especifico para informar al alumno del error, pulsando el botón Completar
y usando el formulario que aparece:
Salvo casos sencillos en los que la ejecución sea simple, la evaluación directa del resultado de la ejecución de una instrucción no permite una evaluación detallada. Cuando se usa un script de procesamiento, la salida que se devuelve es simplemente la ejecución de la última de las sentencias, por lo que se pierde información en el caso en el que se requiera realizar diversas pruebas, cuyo resultado puede ser unas veces correcto y otras no.
Para solucionar este problema el script de procesamiento trabaja con patrones de reconocimiento específicos para cada una de las sentencias de ejecución del script y devuelve a Siette como respuesta de la ejecución etiquetas que resumen el resultado de varias pruebas.
Para el problema del ejemplo anterior, supongamos ahora que el script de procesamiento es el siguiente:
python3 test.py 1 2 3 4 == True -> : Incorrecto python3 test.py 1 5 3 4 == False -> Correcto : Incorrecto
Este script toma escribe en un fichero test.py
el texto introducido por el alumno, y lo ejecuta con el interprete python3
pasandole primero unos parametros con los que debe dar un resultado True
. Si no da este resultado el script de procesamiento devolverá como respuesta la etiqueta Incorrecto
. . Si la primer prueba tiene éxito, probara una segunda con una lista no ordenada. Si el resultado es False
, devolverá como respuesta la etiqueta Correcto
y si no la etiqueta Incorrecto
.
Al igual que en otros ítem externos, hay que indicar en el ítem base que estas son las dos opciones posibles de respuesta mediante los correspondientes patrones, ya que en este caso el ítem base es un ítem de respuesta libre, en la pestaña Contenido
Nótese que en este caso se trata se muestran directamente las etiquetas, y no de la respuesta. La respuesta que en este caso devuelve Siette, a diferencia del ejemplo anterior, es realmente un comentario en HTML, que contiene la etiqueta. Es decir las posibles respuestas de la ejecución de este script son las secuencias <!– Correcto –>
e <!– Incorrecto –>
. Por consiguiente las etiquetas anteriores son equivalentes a los siguientes patrones:
El checkbox que aparece al pie de la lista de etiquetas permite mostrar alternativamente los patrones o las etiquetas.
También en este caso es interesante poder usar el campo ''Refuerzo'' para informar al alumno del motivo del fallo. Para ello se podría hacer la siguiente modificación en el script de procesamiento:
python3 test.py 1 2 3 4 == True -> : Incorrecto1 python3 test.py 1 5 3 4 == False -> Correcto : Incorrecto2
y consiguientemente las modificaciones en los patrones:
a los que puede añadirse un refuerzo específico pulsando el botón Completar
y usando el formulario que aparece:
Evidentemente, en un caso real se deberían añadir mas pruebas en el script de procesamiento para garantizar que el programa cumple las especificaciones de forma general, y no tan solo en dos casos de prueba.
Un ejemplo clásico es la evaluación de las prácticas de programación en un lenguaje de programación, por ejemplo, supongamos el siguiente enunciado:
en donde el alumno debe enviar su propia implementación en C++, mediante un fichero de nombre mcd.cpp
Para evaluar este fichero hay que definir algunos parámetros en la pestaña Avanzado.
Es el nombre que se dará al fichero que envía el alumno. En realidad da igual el nombre del fichero del alumno. Cualquier fichero que envíe se renombrará con el nombre que se le asigne. En el ejemplo mcd.cpp
Es un subdirectorio del directorio auxiliar de la asignatura que puede contener algunos archivos de prueba o archivos auxiliares para la ejecución de las pruebas.
Cada vez que se ejecuta un ítem externo de fichero Siette asigna un directorio diferente dentro del subdirectorio exec
del directorio auxiliar de la asignatura. Sobre este directorio copia dos cosas en este orden:
En el ejemplo anterior no es necesario ningún archivo adicional, por lo que no hace falta usar ningun directorio base.
El script de procesamiento es un programa escrito en lenguaje SPSL, que se introduce en el campo Script
de la pestaña Avanzado.
En el caso anterior el script de procesamiento es el siguiente:
@PatronSiette: false, false, false, true @OnError stop g++ -w -o mcd mcd.cpp <> *(error|warning)* chmod +x mcd == * echo 18 24 | ./mcd == *<6|6> -> 1 echo 192 224 | ./mcd == *<32|32> -> 5 echo 110 154 | ./mcd == *<22|22> -> 10
Básicamente este script lo que hace es compilar el fichero enviado por el alumno, mediante la instrucción del sistema operativo: 1).
g++ -w -o mcd mcd.cpp
Modificar los permisos de ejecución mediante la instrucción:
chmod +x mcd
y realizar tres pruebas de ejecución en la que en vez de esperar una respuesta por la entrada estándar se le pasan los valores mediante la instrucción echo
y una tubería de Unix, que conecta esa salida a la entrada del programa recien compilado
echo 18 24 | ./mcd
El resultado de esta prueba debería ser 6
, o bien mcd=6
, o cualquier otra que terminase con el número 6. Para ello el script de procesamiento utiliza el patron Siette *<6|6>
, que encaja con cualquiera de estas respuestas.
En caso de que la prueba tenga éxito el script asigna el valor de 1
como posible respuestas, pero continúa su ejecución. realiza a continuación la siguiente prueba
echo 192 224 | ./mcd
que debe dar como resultado una secuencia que termine en 32
. Si esta prueba tiene éxito, asigna el valor 5
omo posible respuesta, y prosigue con le ejecución. Si no, la ejecución del script de procesamiento termina y devuelve el valor que habia preparado anteriormente, es decir 1
.
Finalmente realiza la tercera prueba con otros valores diferentes. Si tiene exito devolverá un 10
, y si no lo tiene devolvera 5
que es la etiqueta asociada a la última prueba correcta.
En realidad, las etiquetas que devuelve el script son algo mas elaboradas, ya que pueden incluir información sobre la ejecución del script y la última sentencia que provocó un error. Por ejemplo, suponiendo que las dos primeras pruebas funcionan, pero no asi la tercera, el script de procesamiento devolveria realmente una cadena de texto como esta:
<!--5--><code><pre><font color='red'>>echo 192 224 | ./mcd x: y: mcd=24</font></pre></code>
que se muestra al alumno de esta forma:
>echo 192 224 | ./mcd
x: y: mcd=24
que le indica que al ejecutar el programa mcd
con los valores 192 224
el resultado obtenido es 24
(que no es correcto).
La respuesta del script de procesamiento es un trozo de texto en HTML. La primera parte de esta respuesta corresponde a la etiqueta de evaluación que se devuelve dentro de un comentario HTML para no interferir con la presentación de la respuesta al alumno.
Como cualquier otra pregunta externa, la respuesta debe ser comparada con los patrones de respuesta que contenga el ítem base. En este ejemplo los patrones que contiene este ítem base se muestran en la siguiente imagen:
Como puede apreciarse en este caso el patrón de reconocimiento, en este caso un patrón Siette que encaja con la respuesta del script de procesamiento es <!–5–>*
, es decir, el patrón reconoce solamente la etiqueta de evaluación dentro del comentario HTML e ignora el resto de la respuesta de cara a la evaluación.
En el caso en que se usen etiquetas para componer la respuesta como resultado del script de procesamiento, el interfaz de usuario se ha simplificado, de manera que no es necesario introducir los patrones, ni el tipo de patrón y las opciones de reconocimiento, sino simplemente las etiquetas. Esto facilita la tarea del programador y evita posibles errores. En el caso anterior la interfaz de usuario mostrará la pestaña Contenido
de la siguiente forma:
Puesto que la respuesta del script de procesamiento no ha sido completamente errónea, es potestad del profesor decidir si asigna un crédito parcial a esta respuesta, mediante el sistema de evaluación por puntos, o bien si se dispone de datos suficientes, se podría calibrar un modelo de respuesta TRI politómico; pero esto ya es otra historia…
g++