premier commit
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user