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

2 years ago
  1. #!/bin/bash
  2. ##########################
  3. # Version beta 1
  4. # Cette version ne fonctionne PAS dans le cas où la réponse à une 'question A CHOIX UNIQUE (de type radio bouton)' contient une 'virgule'
  5. # Il se peut également que la version ne fonctionne pas si la réponse contient des guillemets.
  6. # 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".
  7. #
  8. # En conséquence, s-assurer que les réponses uniques ne contiennent pas de virgules avant d-utiliser ce code.
  9. ##########################
  10. ##########################
  11. # Ressources
  12. # https://learn-bash.org/arrays.html
  13. ##########################
  14. # Array : construction d un tableau à partir d une ou plusieurs chaînes
  15. # a="1 2"
  16. # b="3 4"
  17. # c=($a $b)
  18. # c=($a)
  19. # echo ${#c[@]}
  20. # echo ${c[@]}
  21. ##########################
  22. # AWK : iteration sur les champs, passage de valeurs via le paramètre "-v"
  23. # $ echo "un deux trois quatre" | awk '{for(i=1;i<=NF;i++) printf $i" "; print ""}'
  24. # $ echo "un deux trois" | awk -v n=2 '{print $n}'
  25. # champs=$(echo "$qcm" | awk -F "," -v field=$num_champs '{print $field}')
  26. #
  27. #
  28. #
  29. ##########################
  30. # arithmetic : bash only support arithmetic integer operations, that's not the case with zsh
  31. #
  32. # incrementer de 3 une variable :
  33. # (( a += 3 ))
  34. #
  35. #
  36. # $(( < expr arithmetique quelconque avec des entiers uniquement pas de valeurs décimales autorisées avec bash > ))
  37. # a=$((3 * 4 + 2))
  38. # y=$(($a + 1)) ou y=$(( a + 1))
  39. #
  40. # calcul decimal/flottant : bc command pour du calcul décimal/float
  41. #
  42. # attention à l usage du '$' qui n est valable que lorsque les variables sont celles définies dans le shell:
  43. #
  44. # x=$(echo "1.2 + 1.3" | bc -l)
  45. # a=1.2; b=2.3; echo "$a+$b" | bc -l
  46. # echo "y=1.22; z=2.33; y+z" | bc -l
  47. #
  48. # récupération de la valeur :
  49. #
  50. # x=`echo "12 + 5" | bc`
  51. # x=$(echo "12 + 5" | bc -l)
  52. ##########################
  53. #If then else statement https://stackoverflow.com/questions/6270440/simple-logical-operators-in-bash
  54. # ( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok"
  55. # var1=20
  56. # var2=22
  57. # [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"
  58. #
  59. # a=3; if [ $a = 1 ]; then echo 1; elif [ $a = 2 ]; then echo 2; else echo toto; fi
  60. ##########################
  61. ##########################
  62. # variables GLOBALES
  63. ##########################
  64. ### structure du fichier d'export des données de réponses qcm :
  65. ### nombre de sous-questions pour chaque question
  66. nombre_sous_reponses=\
  67. "1 1 1 1 3 3 3 1 3 3\
  68. 3 3 3 1"
  69. #typesq est un tableau
  70. #typesq=(${tq1} ${tq2})
  71. typesq=($nombre_sous_reponses)
  72. ###
  73. solution="206","GEDEAS","Yaëlle","B1 _C1",\
  74. "d'ajouter/modifier/supprimer des pages web facilement",\
  75. "à occulter de l'information cachée aux lecteurs afin de transmettre un code secret",\
  76. "récupérer des informations structurées via le web",\
  77. "pour décrire la configuration d'un logiciel",\
  78. "Oui","Non","Non",\
  79. "Non","Non","Oui",\
  80. "Oui","Oui","Oui",\
  81. "n'importe quel éditeur de texte le + simple possible",\
  82. "Non","Oui","Oui",\
  83. "Non","Oui","Oui",\
  84. "Oui","Non","Oui",\
  85. "Oui","Oui","Non",\
  86. "Oui","Non","Non",\
  87. "ce que vous voyez est ce que vous obtenez"
  88. eleve="207","BRUNO","Javotte","B1 _C1",\
  89. "d'ajouter/modifier/supprimer des pages web facilement",\
  90. "à occulter de l'information cachée aux lecteurs afin de transmettre un code secret",\
  91. "récupérer des informations structurées via le web",\
  92. "pour décrire la configuration d'un logiciel",\
  93. "Oui","Non","Non",\
  94. "Non","Non","Oui",\
  95. "Oui","Oui","Oui",\
  96. "n'importe quel éditeur de texte le + simple possible",\
  97. "Non","Oui","Oui",\
  98. "Non","Oui","Oui",\
  99. "Oui","Non","Oui",\
  100. "Oui","Oui","Non",\
  101. "Oui","Non","Non",\
  102. "ce que vous voyez est ce que vous obtenez"
  103. ##########################
  104. # Fonctions
  105. ##########################
  106. nb_questions()
  107. {
  108. echo "${#typesq[@]}"
  109. }
  110. ####
  111. #
  112. # $1 : numéro de la question
  113. #
  114. nb_sous_reponses()
  115. {
  116. echo ${typesq[$(($1-1))]}
  117. }
  118. ####
  119. # Calculer la postion du champs où commence la réponse pour la questions N
  120. # $1 : numero de la question (>0)
  121. #
  122. function index_champs_reponses_n ()
  123. {
  124. n=$1
  125. # initialisation de l'index à 5 pour le premier champs de la première réponse
  126. index_champs=5
  127. sous_reponses_precedentes=0
  128. i=1
  129. while [ $i -le $n ]
  130. do
  131. index_champs=$((${index_champs} + ${sous_reponses_precedentes}))
  132. sous_reponses_precedentes=${typesq[(($i-1))]}
  133. ((i++))
  134. done
  135. echo "$index_champs"
  136. }
  137. ####
  138. # Est-ce qu'une question donnée est une question à choix multiple ?
  139. # $1 : numero de la question
  140. #
  141. question_a_choix_multiple ()
  142. {
  143. #[ $(nb_questions $1) -gt 1 ]
  144. #($(nb_questions $1) > 1)
  145. # la fonction 'nb_sous_reponses' appelle la fonction 'echo' pour retourner sa valeur
  146. a=`nb_sous_reponses $1`
  147. [[ $a -gt 1 ]]
  148. }
  149. ####
  150. # Pour un "numéro de question donné en paramètre" ('$1'), "retourne une chaîne" qui correspond soit à :
  151. # - réponse unique (question de "type L" = Liste de "radio boutons"). Ex : "d'ajouter/modifier/supprimer des pages web facilement"
  152. # - réponse multiple (question de "type M" = liste choix Multiples). Ex : "Oui Non Oui"
  153. # $1 : numero de la question
  154. # $2 : réponses d'un qcm
  155. function reponses_n ()
  156. {
  157. n=$1
  158. qcm=$2
  159. # nombre de sous-réponses pour la réponse n
  160. nbs=${typesq[$(($n-1))]}
  161. # stocker toutes les sous-réponses de la question n
  162. reponse=""
  163. pos=$(index_champs_reponses_n $n)
  164. i=1
  165. while [ $i -le $nbs ]
  166. do
  167. j=$(($i-1))
  168. num_champs=$(($pos+$j))
  169. champs=$(echo "$qcm" | awk -F "," -v field=$num_champs '{print $field}')
  170. # test awk pour prendre en compte la virgule dans la réponse : ne donne pas satisfaction
  171. #https://www.unix.com/shell-programming-and-scripting/154945-awk-multiple-character-delimiter.html
  172. #champs=$(echo "$qcm" | awk -v field=$num_champs 'BEGIN {FS="[,]+";}{print $field}')
  173. #reponse="$reponse $champs"
  174. #([ $i -eq 1 ] && echo "champs = $champs" && reponse="$champs" && echo "reponse = $reponse") || reponse+=" $champs"
  175. if [ $i -eq 1 ]; then reponse="$champs"; else reponse+=" $champs"; fi
  176. ((i++))
  177. done
  178. echo "$reponse"
  179. }
  180. ####
  181. # Comparer les sous-reponses de deux qcm pour la question N
  182. # $1 : numéro de la question
  183. # $2 : qcm
  184. # $3 : qcm
  185. function reponses_identiques_n ()
  186. {
  187. n=$1
  188. qcm_1=$2
  189. qcm_2=$3
  190. echo "*** debug reponses_identiques_n $n"
  191. r1=$(reponses_n $n "$qcm_1")
  192. r2=$(reponses_n $n "$qcm_2")
  193. echo "* r1 : $r1 / r2 : $r2 *"
  194. [ "$r1" == "$r2" ]
  195. # si le test est vrai retourne 0 sinon retourne 1
  196. }
  197. ####
  198. # Compare séquentiellement 2 qcm jusqu'à rencontrer une différence entre les réponses.
  199. # Retourne un Exit status = numéro de la réponse pour laquelle on rencontre une différence
  200. # $1 : qcm
  201. # $2 : qcm
  202. qcm_identiques ()
  203. {
  204. qcm_1=$1
  205. qcm_2=$2
  206. i=1
  207. while [ $i -le $(nb_questions) ]
  208. do
  209. #if reponses_identiques_n $i "$qcm_1" "$qcm_2"
  210. #then
  211. # ((i++))
  212. #else
  213. # #echo "différence : réponse #$i"
  214. # return
  215. #fi
  216. # alternative If...Then...Else :
  217. reponses_identiques_n $i "$qcm_1" "$qcm_2" && ((i++)) && echo "$i" || return
  218. done
  219. }
  220. ####
  221. # Compter le nombre de réponses juste d'un qcm à évaluer par rapport au qcm de référence
  222. #
  223. # $1 : qcm de référence
  224. # $2 : qcm à noter
  225. compter_nb_reponses_justes ()
  226. {
  227. qref=$1
  228. qeval=$2
  229. # nombre de réponses justes
  230. nb_reponses_justes=0
  231. #
  232. i=1
  233. while [ "$i" -le "$(nb_questions)" ]
  234. do
  235. reponses_identiques_n $i "$qref" "$qeval" && ((nb_reponses_justes++))
  236. ((i++))
  237. done
  238. echo $nb_reponses_justes
  239. }
  240. ####
  241. # Nombre de réponses à choix multiples qui sont 'fausses' pour une question à choix multiples
  242. #
  243. # Pour rappel le format d'une réponse multiple est la suivante : "Oui Non Oui [...] Non"
  244. # $1 : numero de la question à évaluer
  245. # $2 : qcm de référence
  246. # $3 : qcm dont une réponse est à évaluer relativement au qcm de référence
  247. choix_multiples_nb_reponses_fausses ()
  248. {
  249. num_q=$1
  250. nb_choix=$(nb_sous_reponses $num_q)
  251. #nombre de sous-réponse de la question à choix multiple
  252. if [ $nb_choix -eq 1 ]
  253. then
  254. # erreur
  255. return 1
  256. else
  257. # la question est une question à choix multiple
  258. qr=$2
  259. qe=$3
  260. reponse_r=($(reponses_n $num_q "$qr"))
  261. reponse_e=($(reponses_n $num_q "$qe"))
  262. reponses_fausses=0
  263. i=1
  264. while [ $i -le $nb_choix ]
  265. do
  266. [ "${reponse_r[(($i-1))]}" != "${reponse_e[(($i-1))]}" ] && ((reponses_fausses++))
  267. ((i++))
  268. done
  269. fi
  270. echo "$reponses_fausses"
  271. }
  272. ####
  273. # Noter de manière assez cool un qcm.
  274. # On attribue :
  275. # '0.5' points pour les questions à choix multiples pour lesquelles il y a UNE ET UNE SEULE réponses fausse
  276. # '1.0' points pour toute question dont la réponse est parfaite
  277. # $1 : qcm de référence
  278. # $2 : qcm à noter
  279. note_laxiste_qcm ()
  280. {
  281. qref=$1
  282. qeval=$2
  283. # evaluation du qcm
  284. note=0
  285. #
  286. i=1
  287. while [ "$i" -le "$(nb_questions)" ]
  288. do
  289. reponses_identiques_n $i "$qref" "$qeval" && note=$(echo "$note + 1" | bc -l)
  290. # cas réponse non-identique :
  291. if [ $? -eq 1 ]
  292. then
  293. # si la questions est à choix multiples :
  294. if ($(nb_sous_reponses $i) > 1)
  295. then
  296. if (choix_multiples_nb_reponses_fausses
  297. else
  298. fi
  299. else
  300. fi
  301. ((i++))
  302. done
  303. echo $note
  304. }
  305. ####
  306. # fonction de déboggage
  307. # Afficher toutes les réponses d'un qcm
  308. # $1 : qcm
  309. #
  310. debug_reponses_n ()
  311. {
  312. qcm="$1"
  313. i=1
  314. while [ $i -le $(nb_questions) ]
  315. do
  316. echo "$i"
  317. echo "$(reponses_n $i "$qcm")"
  318. ((i++))
  319. done
  320. }
  321. ##########################
  322. # Main
  323. ##########################
  324. #echo "nombre de questions : $(nb_questions)"
  325. #i=1
  326. #question_a_choix_multiple $i
  327. #ret=$?
  328. #echo "Est-ce que la question $i est à choix multiple ? : $ret"
  329. #i=14
  330. #echo -n "debug sur la question $i, est-elle identique ? : "
  331. #reponses_identiques_n $i "$solution" "$eleve"
  332. #echo $?
  333. #debug_reponses_n "$eleve"
  334. exit