From 9a817d047b2aa03781853701e0fe2b507e1d67aa Mon Sep 17 00:00:00 2001 From: Bruno Javotte Date: Sat, 25 Mar 2023 16:40:55 +0400 Subject: [PATCH] premier commit --- run.sh | 411 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 411 insertions(+) create mode 100755 run.sh diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..dcc41a9 --- /dev/null +++ b/run.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