Actions

Cours

Technologies avancées du eLearning 2/exercices/Saisie de notes

De GBLL, TAL, ALAO, etc.

< Cours:Technologies avancées du eLearning 2

Énoncé dans le support de cours diapo 25

Une correction (ci-dessous la même sans le HTML).

Fonctions issues des exercices de saisie de nombres

 1 function isDigit(caractere){
 2 	var result;
 3 	switch(caractere.toString()){
 4 		case "0":
 5 		case "1":
 6 		case "2":
 7 		case "3":
 8 		case "4":
 9 		case "5":
10 		case "6":
11 		case "7":
12 		case "8":
13 		case "9":
14 			result = true;
15 			break ;
16 		default:
17 			result = false;
18 	}
19 	return result;
20 }
21 
22 //Prend une chaine de caractère et dit si c'est un nombre
23 function isNumber(word,min,max){
24 	//déclaration de variables
25 		//isFloat : booléen qui dit si le “word” comporte (déjà) une virgule
26 	var isFloat = word.charAt(0)=="," || word.charAt(0)==".",
27 		//result : booléen qui dit si le word est (pour le moment) un nombre
28 		 result = isDigit(word.charAt(0))
29 						|| ( word.length > 1
30 							&& (isFloat || word.charAt(0)=="-"));
31 		//On initialise result à vrai si le premier caractère est un chiffre ou
32 			//si c'est une virgule ou un moins, mais que le word contient d'autres caractères
33 	/*On parcourt le reste du word (mais on s'arrête dès qu'on est sûr que ce n'est pas un
34 	  nombre. Dès que résultat sera faux, (result && i<word.length) sera faux.*/
35 	for(let i=1;result && i<word.length;i++){
36 		if(word.charAt(i)=="," || word.charAt(i)=="."){
37 			if(isFloat){
38 				result = false;
39 			}
40 			else{
41 				 isFloat = true;
42 			}
43 		}
44 		else if(!isDigit(word.charAt(i))){
45 			result = false;
46 		}
47 	}
48 	//modification pour pouvoir demander un nombre compris entre min et max
49 	if( (result!==false)
50 	 && (typeof min != "undefined")//paramètre optionnel
51 	 && (min !== false) // pas pris en compte s'il vaut faux
52 	 && (Number(word) < min)){
53 		result = false ;
54 	}
55 	if( (result!==false)
56 	 && (typeof max != "undefined")//paramètre optionnel
57 	 && (max !== false) // pas pris en compte s'il vaut faux
58 	 && (Number(word) > max)){
59 		result = false ;
60 	}
61 	return result;
62 }
63 
64 function arrayToTable(theArray, tableId){
65 	var elt = document.getElementById(tableId),
66 		 res = theArray;
67 	if(elt == null){
68 		//L'identifiant n'existe pas
69 		console.error("arrayToTable : "+tableId + " n'existe pas dans le document.");
70 		res = false;
71 	}
72 	else if(elt.tagName != "TABLE"){
73 		//L'identifiant n'existe pas
74 		console.error("arrayToTable : "+tableId + " n'est pas une table ("+elt.tagName+").");
75 		res = false;
76 	}
77 	else{
78 		//on crée du contenu
79 		var line = document.createElement("tr");
80 		for(let i=0;i<theArray.length;i++){
81 		line.innerHTML += "<td>"+theArray[i]+"</td>";
82 	}
83 	//on le met dans l'élément
84 	elt.appendChild(line);
85 	}
86 	return res;
87 }

Nouvelles Fonctions

 1 //renvoie un nombre de notes (≥ 1) ou false
 2 function getNbCount(){
 3 	var res = window.prompt("Combien y a-t-il eu de notes dans le trimestre ?");
 4 	//Tant que l'utilisateur saisit une valeur qui n'est pas un nombre ≥ 1 on continue
 5 	while(res != null && (res == "" || !isNumber(res,1)) ){
 6 		res = window.prompt("Combien y a-t-il eu de notes dans le trimestre ?");
 7 	}
 8 	if(res == null){
 9 		res = false;
10 	}
11 	else{
12 		res = Number(res);
13 	}
14 	return res;
15 }
16 
17 //Renvoie un nom (ou false)
18 function getName(){
19 	var userText = window.prompt("Entrez le nom de l'élève");
20 	//on renvoie faux si l'utilisateur dit stop (ou annuler)
21 	if((userText == null) || (userText =="stop")){
22 		userText = false;
23 	}
24 	return userText ;
25 }
26 
27 //Récupère le nom et les notes
28 function getLine(nb){
29 	var res = false,
30 		 userText = getName();
31 	//si la saisie ne demande pas la fin du travail, on modifie res
32 	if(userText!==false){
33 		nb = Number(nb);
34 		res = [] ;
35 		res.push(userText);
36 		//on ajoute les notes (on interrompt le travail si l'utilisateur appuie sur annuler)
37 		while( (res.length <= nb) && (userText != null) ){
38 			userText = window.prompt("Entrez la note n°"+res.length+"/"+nb+" de "+res[0]);
39 			if(userText=="-"){
40 				//autoriser les absences
41 				res.push("-");
42 			}
43 			else if(isNumber(userText,0,20)){
44 				//refuser les notes non comprises entre 0 et 20
45 				res.push(Number(userText));
46 			}
47 		}
48 		if(userText == null){
49 			res = false;
50 		}
51 	}
52 	return res ;
53 }
54 
55 //Gère les interactions pour remplir la table
56 function fillTable(tableId){
57 	var count = getNbCount();
58 	if(count !== false){
59 		line = getLine(count);
60 		while(line !== false){
61 			line.push(mean(line,false,1));
62 			arrayToTable(line, tableId);
63 			line = getLine(count);
64 		}
65 	}
66 }

Version avec les moyennes

 1 //Remplit les tables et ajoute des moyennes
 2 function fillTableWithMeans(tableId){
 3 	var count = getNbCount();
 4 	let completeTable = [] ;
 5 	if(count !== false){
 6 		line = getLine(count);
 7 		while(line !== false){
 8 			line.push(mean(line,false,1));
 9 			completeTable.push(line);
10 			line = getLine(count);
11 		}
12 		let means=["Moyenne"];
13 		for(let i=1;i<completeTable[0].length;i++){
14 			means.push(mean(completeTable,i));
15 		}
16 		completeTable.push(means);
17 	}
18 	for(let i=0;i<completeTable.length;i++){
19 		arrayToTable(completeTable[i], tableId);
20 	}
21 }
22 
23 /***************
24  * calcule une moyenne dans un tableau à une ou deux entrées
25  * entre les cases min et max
26  ***
27  * anArray : le tableau dans lequel calculer la moyenne
28  * columnId : entier → indice de la colonne sur laquelle on calcule la moyenne
29  *            false  → calcul dans un tableau à 1 dimension
30  * min (optionnel) : entier → indice de la première case concernée
31  *                           (permet d'ignorer celles qui précèdent)
32  * max (optionnel) : entier → indice de la première case concernée
33  *                            (permet d'ignorer celles qui suivent ex: moyenne calculée)
34  **************/
35 function mean(anArray,columnId,min,max){
36 	var res = 0,
37 		 nbNotes = 0;
38 	if(typeof min=="undefined"){
39 		//valeur par défaut de min
40 		min = 0;
41 	}
42 	if(typeof max == 'undefined'){
43 		//valeur par défaut de max
44 		max = anArray.length;
45 	}
46 	//parcours en ligne
47 	if(typeof columnId == "undefined" || columnId === false){
48 		for (let i=min;i<max;i++){
49 			if(typeof anArray[i] == "number" ){
50 				res += anArray[i] ; // ←→ res + anArray[i]
51 				nbNotes++;
52 			}
53 		}
54 	}
55 	else{//parcours en colonne, pour la colonne d'id columnId
56 		for (let i=min;i<max;i++){
57 			if(typeof anArray[i][columnId] == "number" ){
58 				res += anArray[i][columnId] ; // ←→ res + anArray[i]
59 				nbNotes++ ;
60 			}
61 		}
62 	}
63 	return res/nbNotes;
64 }

Version avec les tris

  1 //Remplit les tables et ajoute des moyennes et trie la table
  2 //selon l'algo (à définir) de la fonction de tri sortFunction
  3 function fillSortedTableWithMeans(tableId,sortFunction){
  4 	var count = getNbCount();
  5 	let completeTable = [] ;
  6 	if(count !== false){
  7 		line = getLine(count);
  8 		while(line !== false){
  9 			line.push(mean(line,false,1));
 10 			completeTable.push(line);
 11 			line = getLine(count);
 12 		}
 13 		completeTable = sortFunction(completeTable) ;
 14 		let means=["Moyenne"];
 15 		//count = nb notes + 1 pour la moyenne générale
 16 		for(let i=1;i<=count+1;i++){
 17 			means.push(mean(completeTable,i));
 18 		}
 19 		completeTable.push(means);
 20 	}
 21 	for(let i=0;i<completeTable.length;i++){
 22 		arrayToTable(completeTable[i], tableId);
 23 	}
 24 }
 25 
 26 //La partie suivante utilise le fait que javascript
 27 //traite les fonctions comme des variables normales
 28 //cf. affectation d'événements
 29 //voir aussi la notion de fonction anonyme
 30 //https://ulea-wiki.univ-grenoble-alpes.fr/_/Utilisateur:Mathieu_Loiseau/Cours/Master_DDL_%e2%80%94_Parcours_DILIPEM/M2_%e2%80%94_technologies_avanc%c3%a9es_du_eLearning_2/TOUT_ce_qu'il_y_a_%c3%a0_savoir#Fonction_anonyme
 31 
 32 //Comparaison alphabétique de 2 lignes de tableau telles que construites par notre programme
 33 function compareAlpha(tr1, tr2){
 34 	var elt1 = tr1[0], //le nom est toujours dans la première case de la ligne
 35 		 elt2 = tr2[0], //le nom est toujours dans la première case de la ligne
 36 		 res = 0 ; //égalité des valeurs par défaut
 37 	if(elt1 < elt2){ //si le premier est inférieur au second valeur négative
 38 		res = -1 ;
 39 	}
 40 	else if(elt2 < elt1){//sinon valeur positive
 41 		res = 1 ;
 42 	}
 43 	return res ;
 44 }
 45 
 46 //Comparaison de la moyenne de 2 lignes de tableau telles que construites par notre programme
 47 function compareMean(tr1, tr2){
 48 	var elt1 = tr1[tr1.length-1], //la moyenne est toujours dans la dernière case du tableau
 49 		 elt2 = tr2[tr2.length-1], //la moyenne est toujours dans la dernière case du tableau
 50 		 res = 0 ; //égalité des valeurs par défaut
 51 	if(elt1 < elt2){ //si le premier est inférieur au second valeur négative
 52 		res = -1 ;
 53 	}
 54 	else if(elt2 < elt1){ //sinon valeur positive
 55 		res = 1 ;
 56 	}
 57 	return res ;
 58 }
 59 
 60 //Interversion de deux cases d'indice i1 et i2 d'un tableau tab
 61 function invertTr(tab, i1, i2){
 62 	//pour intervertir 2 cases, il faut une case intermédiaire
 63 	let tmp = tab[i1];
 64 	tab[i1]=tab[i2];
 65 	tab[i2]=tmp;
 66 	return tab;
 67 }
 68 
 69 function alphaSort(table){
 70 	//Pour un tri alphabétique, il faut une comparaison de la case des noms
 71 	return triMin(table, compareAlpha, invertTr);
 72 }
 73 
 74 function meanSort(table){
 75 	//Pour un tri par moyenne, il faut une comparaison de la case des moyennes
 76 	return triAlan(table, compareMean, invertTr);
 77 }
 78 
 79 /*Un tri par minimum :
 80 	* parcourt la partie non triée d'un tableau pour trouver la plus petite valeur
 81 	* la met dans la première case non triée
 82 	* recommence ce processus à partir de la case suivante
 83  * Jusqu'à ce que le tableau soit trié*/
 84 function triMin(table, comparaison, inversion){
 85 	var min,tmpElt;
 86 	for (var j=0;j<table.length;j++){
 87 		//par défaut la case minimale est la première case non triée
 88 		min = j;
 89 		for (var i=j+1;i<table.length;i++){
 90 			if(comparaison(table[min], table[i])>0){
 91 				//si la case i est plus petite que la cas min
 92 				//elle devient la case minimale
 93 				min=i;
 94 			}
 95 		}
 96 		console.log("Le plus petit élément à partir de l'index "+j+" est "+min+". On les inverse");
 97 		table = inversion(table, j, min);
 98 	}
 99 	return table;
100 }
101 alphaSort
102 /*Le tri d'Alan est un tri par bulle amélioré
103  *Le tri par bulle fait remonter la plus grande valeur à droite du tableau
104  *    en comparant une case avec la suivante
105  *    et en les intervertissant si la plus grande des deux n'est pas à droite
106  *    à la fin du parcours, la plus grande valeur est à droite
107  *puis recommence avec la partie non-triée du tableau
108  *La version d'Alan garde triée la partie gauche du tableau en faisant redescendre
109  *jusqu'à sa position toute valeur intervertie*/
110 function triAlan(table, comparaison, inversion){
111 	for (var i=0;i<table.length - 1;i++){
112 		if(comparaison(table[i], table[i+1]) > 0){
113 			//les cases i et i+1 ne sont pas dans le bon ordre
114 			//on les intervertit.
115 			table = inversion(table, i, i+1) ;
116 			let j = i ;
117 			//on vérifie que la case j+1 (devenue j) n'est pas
118 			//plus grande que les cases précédentes
119 			while(j > 0 && comparaison(table[j-1], table[j]) > 0){
120 				//tant qu'elle est plus grande on l'échange avec
121 				//avec la case précédente
122 				table = inversion(table, j, j-1) ;
123 				j--;
124 			}
125 		}
126 	}
127 	return table ;
128 }