Bruno Javotte
2 years ago
1 changed files with 411 additions and 0 deletions
-
411run.sh
@ -0,0 +1,411 @@ |
|||
#!/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 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue