Ejemplo de un VPL Java

De Documentación Campus Virtual de la UEx
Ir a la navegación Ir a la búsqueda

Ejemplo de un VPL Java

Vamos a crear un Laboratorio Virtual de Programación Java:

Práctica en la que se pide al alumno implementar un algoritmo que genera una salida en función de la entrada :

  • 0 -> ""
  • 3 -> "0"
  • 7 -> "1"
  • 34 -> "10 11 12 13"
  • 45 -> 14
  • 91 -> 29
  • 100 -> ""
.. 

La prácticas entregadas serán evaluadas según los siguientes criterios:

  • No compila: 20%
  • La salida no se corresponde con lo esperado: 30%
  • Cada una de las salidas correctas que ofrezca el programa: +10%
   Referencia: http://www.science.smith.edu/dftwiki/index.php/Tutorial:_Moodle_VPL_--_Feed_Different_Tests_on_Command_Line.. 

Configuración

En un principio, como en la creación de todas las actividades de VPL, estas serían las únicas opciones de configuración del laboratorio: Nombre y "Descripción del Laboratorio"
CrearVPLJava.PNG

Casos de prueba

Para este laboratorio no se han implementado tests de pruebas, y el fichero vpl_evaluate.cases no será necesario, ya que se facilita el fichero vpl_evaluate.sh.



Opciones de ejecución

En este laboratorio dejaremos que se ejecute el script de Java predeterminado y no lo seleccionamos ninguno en concreto. Dejamos las opciones en "Autodetectar". Con el fin de que el alumno pueda comprobar su actividad antes de la entrega definitiva, activamos la opción de Ejecutar, y para que la actividad se evalúe automáticamente, activamos la opción Evaluar, que le dará una calificación al ejercicio:
EjecucionVPLJava.PNG

Ficheros requeridos

Nuestro fichero se llama practica.java, y como hemos visto en la tabla, la extensión java' es la que tienen los ficheros Java, y para el que nuestro laboratorio ejecutará el script autodetectado de Java.
En este caso, practica.java es el único fichero que se le requiere al alumno, el fichero con su entrega de la actividad. Aquí es donde el alumno debe escribir el código de la práctica.
RequeridoVPLJava.PNG

Ajustes avanzados

Ficheros para la ejecución
Se establecen los ficheros necesarios para la ejecución, depurado o evaluación de la entrega. Esto incluye ficheros script, programas de prueba y ficheros de datos.
En este laboratorio Java, tenemos dos de los cuatro ficheros opcionales para ejecutar la entrega (vpl_run.sh y vpl_evaluate.sh):
EjecucionJava1.PNG EjecucionJava2.PNG
   
Ficheros de Ejecución
vpl_run.sh
vpl_evaluate.sh

  1. #! /bin/bash
  2. # D. Thiebaut

  3. cat > vpl_execution <<EEOOFF
  4. #! /bin/bash
  5.  
  6. prog1=practica
  7.  
  8. javac \${prog1}.java > /dev/null
  9.  
  10. if ((\$? > 0)); then
  11.      echo "Error compiling your program"
  12.      exit
  13. fi
  14. KEYS=(0 3 7 34 45 91 100) 
  15. CORRECTOUTPUTS=("" "0" "1" "10 11 12 13" 14 29 "" )

  16. for i in \`seq 0 5\`; do
  17.   echo ""
  18.   key=\${KEYS[\$i]}
  19.   echo "Test # \$i"
  20.   echo "key = \$key"
  21.   echo "The correct output is: \${CORRECTOUTPUTS[\$i]}"
  22.   echo "Your program output:"
  23.   echo "java practica 30 \$key"
  24.   java practica 30 \$key
  25. done

  26. EEOOFF
  27.  
  28. chmod +x vpl_execution


  1. #! /bin/bash
  2. # D. Thiebaut

  3. cat > vpl_execution <<EEOOFF
  4. #! /bin/bash
  5. #set -x
  6.  
  7. # --- program tested (no extension) ---
  8. prog1=practica

  9. # --- grades 
  10. gradeNotCompile=20
  11. gradeCompileNoGoodOutput=30
  12. gradeIncrement=10    # (100-30)/7 / number of tests

  13. # --- compile student program ---
  14. javac \${prog1}.java 
  15.  
  16. if ((\$? > 0)); then
  17.      echo "Comment :=>>  Error compiling your program"
  18.      echo "Grade :=>> \$gradeNotCompile"
  19.      exit
  20. fi

  21. # --- minimum grade if not passing any test ---
  22. grade=\$gradeCompileNoGoodOutput

  23. # =================================================
  24. KEYS=(0 3 7 34 45 91 100) 
  25. CORRECTOUTPUTS=("" "0" "1" "10 11 12 13" 14 29 "" )
  26. N=30
  27. NOTESTS=7


  28. # =================================================
  29. # function that prints the difference between user and expected output
  30. incorrectOutput() {
  31.     if [ "\$1" ]; then   # if there's a parameter
  32.         i=\$1
  33.         echo "Comment :=>>- Your output is incorrect."

  34.         #--- display test file ---
  35.         echo "Comment :=>>- Your program tested with:"
  36.         echo "<|--" 
  37.         cat data\${i}.txt
  38.         echo "--|>"

  39.         echo "Comment :=>> ---------------"
  40.         echo "Comment :=>>- Your output:"
  41.         echo "Comment :=>> ---------------"
  42.         echo "<|--"
  43.         cat user.out.org
  44.         echo "--|>"
  45.         echo ""
  46.         echo "Comment :=>> ---------------"
  47.         echo "Comment :=>>- Expected output: "
  48.         echo "Comment :=>> ---------------"
  49.         echo "<|--"
  50.         cat data\${i}.out
  51.         echo "--|>"
  52.     fi
  53. }

  54. # function that tells user of program crash or infinite loop, and what the test was.
  55. timeoutOutput() {
  56.     if [ "\$1" ]; then   # if there's a parameter
  57.         i=\$1
  58.         echo "Comment :=>>- Your program has timed out or crashed."

  59.         #--- display test file ---
  60.         echo "Comment :=>>- Your program tested with:"
  61.         echo "<|--" 
  62.         cat data\${i}.txt
  63.         echo "--|>"
  64.     fi
  65. }

  66. # function that removes non-digits, extra spaces, and extra blank lines from text file.
  67. cleanup () {
  68.     if [ "\$1" ]; then   # if there's a parameter
  69.         
  70.         #--- remove non numbers and non minus---
  71.         cat \$1 | sed 's/[^0-9*.0-9\ -]*//g' > dummy.out
  72.         mv dummy.out \$1
  73.  
  74.         #--- remove multiple spaces --- 
  75.         cat \$1 | sed 's/  */ /g' > dummy.out
  76.         mv dummy.out \$1

  77.         #--- remove blank lines ---
  78.         cat \$1 | sed '/^\s*\$/d' > dummy.out
  79.         mv dummy.out \$1
  80.    fi
  81. }
  82. NOTESTS_1=\`expr \$NOTESTS - 1 \`
  83. for i in \`seq 0  \$NOTESTS_1 \`; do
  84.    # ==============================================
  85.    # TEST i
  86.    # timeout code from 
  87.    # http://stackoverflow.com/questions/5161193/bash-script-that-kills-a-child-process-after-a-given-timeout
  88.    # ==============================================
  89.    #--- run program, capture output, display to student ---

  90.    key=\${KEYS[\$i]}
  91.    echo "Comment :=>>-TEST \$i" 
  92.    echo "Comment :=>> key = \$key"
  93.    echo "Comment :=>> N = \$N"

  94.    echo "\$N \$key" > data\${i}.txt
  95.    
  96.    timeout 30 java \${prog1} \$N \$key  &> user.out
  97.    retcode=\$?

  98.    #--- if we killed the waiter, everything is good ---
  99.    if [ \$retcode -eq  124 ]; then
  100.        echo "Comment :=>>-Your program has stopped working."
  101.        timeoutOutput \$i
  102.        continue
  103.    else
  104.        echo "Comment :=>>-Your program ran to completion."
  105.    fi

  106.    cp user.out user.out.org

  107.    #--- copy expected output in output file
  108.    echo \${CORRECTOUTPUTS[\$i]} > data\${i}.out

  109.    #--- remove non numbers, space and extra lines from user.out ---
  110.    #--- and from datai.out
  111.    cleanup user.out
  112.    cleanup data\${i}.out

  113.    #--- compute difference --- 
  114.    diff -y -w --ignore-all-space user.out data\${i}.out > diff.out
  115.    #echo "----- diff.out ------"
  116.    #cat diff.out
  117.    #echo "---------------------"
  118.    #diff -y -w --ignore-all-space user.out data\${i}.out > diff.out

  119.    #--- reject if different ---
  120.    if ((\$? > 0)); then
  121.       incorrectOutput \$i
  122.    
  123.       # --------------------- REWARD IF CORRECT OUTPUT -----------------
  124.    else
  125.       #--- good output ---
  126.       echo "Comment :=>>- Congrats, your output is correct."
  127.       echo "Comment :=>> --------------------------------."
  128.       echo "<|--"
  129.       cat user.out.org
  130.       echo "--|>"
  131.       grade=\$((grade+gradeIncrement))
  132.    fi
  133. done

  134. # =================================================
  135. # Report grade
  136. if (( grade > 100 )); then
  137.    grade=100
  138. fi
  139. echo "Grade :=>> \$grade"



  140. EEOOFF
  141.  
  142. chmod +x vpl_execution

Límites máximos de recursos de ejecución
Aquí establecemos los límites máximos para el tiempo de ejecución, la memoria usada, el tamaño de los ficheros generados durante la ejecución y el número de procesos simultáneos. Para nuestro ejemplo, no hemos definido límites.
Ficheros a mantener mientras se ejecuta
En esta opción marcamos los ficheros que deben permanecer durante la fase de ejecución:
MantenerJava.PNG
Variaciones
No se han configurado variaciones para esta actividad.
Comprobación de servidores de ejecución
En este enlace podemos comprobar el estado de los servidores de ejecución usados por esta actividad.
Servidores de ejecución locales
No se han suministrado urls de servidores de ejecución locales para esta actividad.

Probar actividad

Ejecutar
Si queremos, podemos ver si todo funciona bien editando el fichero de entrega y ejecutándolo para probar:
EjecutarJava.PNG
En este ejemplo, hemos configurado el grado de similitud aceptado:
SimilaridadJava.PNG

Volver a la página:

VPL (Virtual Programming Lab)

Administración de un VPL
0.00
(0 votos)