|
|
#!/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
|