You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
411 lines
9.3 KiB
411 lines
9.3 KiB
#!/bin/bash
|
|
|
|
|
|
##########################
|
|
# Version beta 1
|
|
# Cette version ne fonctionne PAS dans le cas où la réponse à une 'question A CHOIX UNIQUE (de type radio bouton)' contient une 'virgule'
|
|
# Il se peut également que la version ne fonctionne pas si la réponse contient des guillemets.
|
|
# Les questions A CHOIX MULTIPLES, eux, n'induisent jamais ce genre de problème car les réponses multiples sont de type booleen "Oui"/"Non".
|
|
#
|
|
# En conséquence, s-assurer que les réponses uniques ne contiennent pas de virgules avant d-utiliser ce code.
|
|
##########################
|
|
|
|
##########################
|
|
# Ressources
|
|
# https://learn-bash.org/arrays.html
|
|
##########################
|
|
# Array : construction d un tableau à partir d une ou plusieurs chaînes
|
|
# a="1 2"
|
|
# b="3 4"
|
|
# c=($a $b)
|
|
# c=($a)
|
|
# echo ${#c[@]}
|
|
# echo ${c[@]}
|
|
##########################
|
|
# AWK : iteration sur les champs, passage de valeurs via le paramètre "-v"
|
|
# $ echo "un deux trois quatre" | awk '{for(i=1;i<=NF;i++) printf $i" "; print ""}'
|
|
# $ echo "un deux trois" | awk -v n=2 '{print $n}'
|
|
# champs=$(echo "$qcm" | awk -F "," -v field=$num_champs '{print $field}')
|
|
#
|
|
#
|
|
#
|
|
##########################
|
|
# arithmetic : bash only support arithmetic integer operations, that's not the case with zsh
|
|
#
|
|
# incrementer de 3 une variable :
|
|
# (( a += 3 ))
|
|
#
|
|
#
|
|
# $(( < expr arithmetique quelconque avec des entiers uniquement pas de valeurs décimales autorisées avec bash > ))
|
|
# a=$((3 * 4 + 2))
|
|
# y=$(($a + 1)) ou y=$(( a + 1))
|
|
#
|
|
# calcul decimal/flottant : bc command pour du calcul décimal/float
|
|
#
|
|
# attention à l usage du '$' qui n est valable que lorsque les variables sont celles définies dans le shell:
|
|
#
|
|
# x=$(echo "1.2 + 1.3" | bc -l)
|
|
# a=1.2; b=2.3; echo "$a+$b" | bc -l
|
|
# echo "y=1.22; z=2.33; y+z" | bc -l
|
|
#
|
|
# récupération de la valeur :
|
|
#
|
|
# x=`echo "12 + 5" | bc`
|
|
# x=$(echo "12 + 5" | bc -l)
|
|
|
|
##########################
|
|
#If then else statement https://stackoverflow.com/questions/6270440/simple-logical-operators-in-bash
|
|
# ( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok"
|
|
# var1=20
|
|
# var2=22
|
|
# [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"
|
|
#
|
|
# a=3; if [ $a = 1 ]; then echo 1; elif [ $a = 2 ]; then echo 2; else echo toto; fi
|
|
##########################
|
|
|
|
|
|
|
|
##########################
|
|
# variables GLOBALES
|
|
##########################
|
|
|
|
### structure du fichier d'export des données de réponses qcm :
|
|
### nombre de sous-questions pour chaque question
|
|
nombre_sous_reponses=\
|
|
"1 1 1 1 3 3 3 1 3 3\
|
|
3 3 3 1"
|
|
#typesq est un tableau
|
|
#typesq=(${tq1} ${tq2})
|
|
typesq=($nombre_sous_reponses)
|
|
###
|
|
solution="206","GEDEAS","Yaëlle","B1 _C1",\
|
|
"d'ajouter/modifier/supprimer des pages web facilement",\
|
|
"à occulter de l'information cachée aux lecteurs afin de transmettre un code secret",\
|
|
"récupérer des informations structurées via le web",\
|
|
"pour décrire la configuration d'un logiciel",\
|
|
"Oui","Non","Non",\
|
|
"Non","Non","Oui",\
|
|
"Oui","Oui","Oui",\
|
|
"n'importe quel éditeur de texte le + simple possible",\
|
|
"Non","Oui","Oui",\
|
|
"Non","Oui","Oui",\
|
|
"Oui","Non","Oui",\
|
|
"Oui","Oui","Non",\
|
|
"Oui","Non","Non",\
|
|
"ce que vous voyez est ce que vous obtenez"
|
|
|
|
eleve="207","BRUNO","Javotte","B1 _C1",\
|
|
"d'ajouter/modifier/supprimer des pages web facilement",\
|
|
"à occulter de l'information cachée aux lecteurs afin de transmettre un code secret",\
|
|
"récupérer des informations structurées via le web",\
|
|
"pour décrire la configuration d'un logiciel",\
|
|
"Oui","Non","Non",\
|
|
"Non","Non","Oui",\
|
|
"Oui","Oui","Oui",\
|
|
"n'importe quel éditeur de texte le + simple possible",\
|
|
"Non","Oui","Oui",\
|
|
"Non","Oui","Oui",\
|
|
"Oui","Non","Oui",\
|
|
"Oui","Oui","Non",\
|
|
"Oui","Non","Non",\
|
|
"ce que vous voyez est ce que vous obtenez"
|
|
|
|
|
|
##########################
|
|
# Fonctions
|
|
##########################
|
|
|
|
nb_questions()
|
|
{
|
|
echo "${#typesq[@]}"
|
|
}
|
|
|
|
####
|
|
#
|
|
# $1 : numéro de la question
|
|
#
|
|
nb_sous_reponses()
|
|
{
|
|
echo ${typesq[$(($1-1))]}
|
|
}
|
|
|
|
####
|
|
# Calculer la postion du champs où commence la réponse pour la questions N
|
|
# $1 : numero de la question (>0)
|
|
#
|
|
function index_champs_reponses_n ()
|
|
{
|
|
n=$1
|
|
|
|
# initialisation de l'index à 5 pour le premier champs de la première réponse
|
|
index_champs=5
|
|
sous_reponses_precedentes=0
|
|
|
|
i=1
|
|
while [ $i -le $n ]
|
|
do
|
|
index_champs=$((${index_champs} + ${sous_reponses_precedentes}))
|
|
sous_reponses_precedentes=${typesq[(($i-1))]}
|
|
((i++))
|
|
done
|
|
|
|
echo "$index_champs"
|
|
}
|
|
|
|
####
|
|
# Est-ce qu'une question donnée est une question à choix multiple ?
|
|
# $1 : numero de la question
|
|
#
|
|
question_a_choix_multiple ()
|
|
{
|
|
#[ $(nb_questions $1) -gt 1 ]
|
|
#($(nb_questions $1) > 1)
|
|
# la fonction 'nb_sous_reponses' appelle la fonction 'echo' pour retourner sa valeur
|
|
a=`nb_sous_reponses $1`
|
|
[[ $a -gt 1 ]]
|
|
|
|
}
|
|
|
|
|
|
####
|
|
# Pour un "numéro de question donné en paramètre" ('$1'), "retourne une chaîne" qui correspond soit à :
|
|
# - réponse unique (question de "type L" = Liste de "radio boutons"). Ex : "d'ajouter/modifier/supprimer des pages web facilement"
|
|
# - réponse multiple (question de "type M" = liste choix Multiples). Ex : "Oui Non Oui"
|
|
# $1 : numero de la question
|
|
# $2 : réponses d'un qcm
|
|
function reponses_n ()
|
|
{
|
|
n=$1
|
|
qcm=$2
|
|
|
|
# nombre de sous-réponses pour la réponse n
|
|
nbs=${typesq[$(($n-1))]}
|
|
|
|
# stocker toutes les sous-réponses de la question n
|
|
reponse=""
|
|
|
|
pos=$(index_champs_reponses_n $n)
|
|
|
|
i=1
|
|
while [ $i -le $nbs ]
|
|
do
|
|
j=$(($i-1))
|
|
num_champs=$(($pos+$j))
|
|
champs=$(echo "$qcm" | awk -F "," -v field=$num_champs '{print $field}')
|
|
|
|
# test awk pour prendre en compte la virgule dans la réponse : ne donne pas satisfaction
|
|
#https://www.unix.com/shell-programming-and-scripting/154945-awk-multiple-character-delimiter.html
|
|
#champs=$(echo "$qcm" | awk -v field=$num_champs 'BEGIN {FS="[,]+";}{print $field}')
|
|
|
|
#reponse="$reponse $champs"
|
|
#([ $i -eq 1 ] && echo "champs = $champs" && reponse="$champs" && echo "reponse = $reponse") || reponse+=" $champs"
|
|
if [ $i -eq 1 ]; then reponse="$champs"; else reponse+=" $champs"; fi
|
|
|
|
((i++))
|
|
done
|
|
echo "$reponse"
|
|
|
|
}
|
|
|
|
####
|
|
# Comparer les sous-reponses de deux qcm pour la question N
|
|
# $1 : numéro de la question
|
|
# $2 : qcm
|
|
# $3 : qcm
|
|
function reponses_identiques_n ()
|
|
{
|
|
n=$1
|
|
qcm_1=$2
|
|
qcm_2=$3
|
|
|
|
echo "*** debug reponses_identiques_n $n"
|
|
r1=$(reponses_n $n "$qcm_1")
|
|
r2=$(reponses_n $n "$qcm_2")
|
|
echo "* r1 : $r1 / r2 : $r2 *"
|
|
|
|
|
|
[ "$r1" == "$r2" ]
|
|
# si le test est vrai retourne 0 sinon retourne 1
|
|
}
|
|
|
|
|
|
####
|
|
# Compare séquentiellement 2 qcm jusqu'à rencontrer une différence entre les réponses.
|
|
# Retourne un Exit status = numéro de la réponse pour laquelle on rencontre une différence
|
|
# $1 : qcm
|
|
# $2 : qcm
|
|
qcm_identiques ()
|
|
{
|
|
|
|
qcm_1=$1
|
|
qcm_2=$2
|
|
i=1
|
|
|
|
while [ $i -le $(nb_questions) ]
|
|
do
|
|
#if reponses_identiques_n $i "$qcm_1" "$qcm_2"
|
|
#then
|
|
# ((i++))
|
|
#else
|
|
# #echo "différence : réponse #$i"
|
|
# return
|
|
#fi
|
|
|
|
# alternative If...Then...Else :
|
|
reponses_identiques_n $i "$qcm_1" "$qcm_2" && ((i++)) && echo "$i" || return
|
|
done
|
|
|
|
}
|
|
|
|
|
|
####
|
|
# Compter le nombre de réponses juste d'un qcm à évaluer par rapport au qcm de référence
|
|
#
|
|
|
|
# $1 : qcm de référence
|
|
# $2 : qcm à noter
|
|
compter_nb_reponses_justes ()
|
|
{
|
|
qref=$1
|
|
qeval=$2
|
|
# nombre de réponses justes
|
|
nb_reponses_justes=0
|
|
|
|
#
|
|
i=1
|
|
while [ "$i" -le "$(nb_questions)" ]
|
|
do
|
|
reponses_identiques_n $i "$qref" "$qeval" && ((nb_reponses_justes++))
|
|
((i++))
|
|
done
|
|
|
|
echo $nb_reponses_justes
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
####
|
|
# Nombre de réponses à choix multiples qui sont 'fausses' pour une question à choix multiples
|
|
#
|
|
# Pour rappel le format d'une réponse multiple est la suivante : "Oui Non Oui [...] Non"
|
|
# $1 : numero de la question à évaluer
|
|
# $2 : qcm de référence
|
|
# $3 : qcm dont une réponse est à évaluer relativement au qcm de référence
|
|
choix_multiples_nb_reponses_fausses ()
|
|
{
|
|
num_q=$1
|
|
nb_choix=$(nb_sous_reponses $num_q)
|
|
#nombre de sous-réponse de la question à choix multiple
|
|
|
|
if [ $nb_choix -eq 1 ]
|
|
then
|
|
# erreur
|
|
return 1
|
|
else
|
|
# la question est une question à choix multiple
|
|
qr=$2
|
|
qe=$3
|
|
reponse_r=($(reponses_n $num_q "$qr"))
|
|
reponse_e=($(reponses_n $num_q "$qe"))
|
|
reponses_fausses=0
|
|
|
|
i=1
|
|
while [ $i -le $nb_choix ]
|
|
do
|
|
[ "${reponse_r[(($i-1))]}" != "${reponse_e[(($i-1))]}" ] && ((reponses_fausses++))
|
|
((i++))
|
|
done
|
|
fi
|
|
|
|
echo "$reponses_fausses"
|
|
}
|
|
|
|
|
|
####
|
|
# Noter de manière assez cool un qcm.
|
|
# On attribue :
|
|
# '0.5' points pour les questions à choix multiples pour lesquelles il y a UNE ET UNE SEULE réponses fausse
|
|
# '1.0' points pour toute question dont la réponse est parfaite
|
|
# $1 : qcm de référence
|
|
# $2 : qcm à noter
|
|
note_laxiste_qcm ()
|
|
{
|
|
qref=$1
|
|
qeval=$2
|
|
# evaluation du qcm
|
|
note=0
|
|
|
|
#
|
|
i=1
|
|
while [ "$i" -le "$(nb_questions)" ]
|
|
do
|
|
reponses_identiques_n $i "$qref" "$qeval" && note=$(echo "$note + 1" | bc -l)
|
|
|
|
# cas réponse non-identique :
|
|
if [ $? -eq 1 ]
|
|
then
|
|
# si la questions est à choix multiples :
|
|
if ($(nb_sous_reponses $i) > 1)
|
|
then
|
|
if (choix_multiples_nb_reponses_fausses
|
|
else
|
|
fi
|
|
|
|
|
|
|
|
else
|
|
fi
|
|
|
|
|
|
|
|
((i++))
|
|
done
|
|
|
|
echo $note
|
|
}
|
|
|
|
####
|
|
# fonction de déboggage
|
|
# Afficher toutes les réponses d'un qcm
|
|
# $1 : qcm
|
|
#
|
|
debug_reponses_n ()
|
|
{
|
|
qcm="$1"
|
|
|
|
i=1
|
|
while [ $i -le $(nb_questions) ]
|
|
do
|
|
echo "$i"
|
|
echo "$(reponses_n $i "$qcm")"
|
|
((i++))
|
|
done
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
##########################
|
|
# Main
|
|
##########################
|
|
|
|
|
|
#echo "nombre de questions : $(nb_questions)"
|
|
|
|
#i=1
|
|
#question_a_choix_multiple $i
|
|
#ret=$?
|
|
#echo "Est-ce que la question $i est à choix multiple ? : $ret"
|
|
|
|
#i=14
|
|
#echo -n "debug sur la question $i, est-elle identique ? : "
|
|
#reponses_identiques_n $i "$solution" "$eleve"
|
|
#echo $?
|
|
|
|
#debug_reponses_n "$eleve"
|
|
|
|
|
|
exit
|