Actions

Cours

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

De GBLL, TAL, ALAO, etc.

< Cours:Technologies avancées du eLearning 2

Énoncés dans le support de cours (diapos 16, 19, 21, 24 (première question) et 26).

Un codepen avec tout le code ci-dessous : https://codepen.io/lzbk/pen/gQvNXw

Fonction estChiffre

Nous avons vu plusieurs solutions possibles :

 1 //En utilisant un switch/case
 2 function estChiffre1(car){
 3    var resultat=false;
 4    switch(car){
 5       case "0":
 6       case "1":
 7       case "2":
 8       case "3":
 9       case "4":
10       case "5":
11       case "6":
12       case "7":
13       case "8":
14       case "9":
15          resultat = true;
16    }
17    return resultat;
18 }
19 
20 function estChiffre2(car){
21 //en utilisant l'ordre alphabétique (attention ça ne marche pas avec car<"10")
22    return (car>="0" && car<="9");
23 }
24 
25 function estChiffre3(car){
26 //en utilisant un tableau des caractères autorisés
27    var resultat = false ;
28    var tabChiffres = ["0","1","2","3","4","5","6","7","8","9"];
29    for(let i=0;i<tabChiffres.length;i++){
30       if(tabChiffres[i] == car){
31          resultat = true;
32       }
33    }
34    return resultat;
35 }
36 
37 function estChiffre4(car){
38 //avec un if
39    var resultat = false;
40    if (   car=="0"
41        || car=="1"
42        || car=="2"
43        || car=="3"
44        || car=="4"
45        || car=="5"
46        || car=="6"
47        || car=="7"
48        || car=="8"
49        || car=="9"
50     ){
51       resultat = true;
52    }
53    return resultat;
54 }

Fonction estNombre

Votre fonction est nombre doit passer le test suivant :

 1 console.debug("Test de estNombre()");
 2 console.log("Chaine vide : false attendu → " , estNombre(""));
 3 console.log("romains : false attendu → " ,estNombre("XIV"));
 4 console.log("1 : true attendu → " ,  estNombre("1"));
 5 console.log("123546590143 : true attendu → " ,  estNombre("123546590143"));
 6 console.log("1.62345 : true attendu → " , estNombre("1.62345"));
 7 console.log("-1 : true attendu → " , estNombre("-1"));
 8 console.log("-13240,2303458 : true attendu → " , estNombre("-13240,2303458"));
 9 console.log("12345a12235 : false attendu → " , estNombre("12345a12235"));
10 console.log("12345-12235 : false attendu → " , estNombre("12345-12235"));
11 console.log("23.34562.234 : false attendu → " , estNombre("23.34562.234"));
12 console.log(".345 : true attendu → " , estNombre(".345"));
13 console.log(", : false attendu → " , estNombre(","));
14 console.log("- : false attendu → " , estNombre("-"));

Correction

 1 //Prend une chaine de caractère et dit si c'est un nombre
 2 function estNombre(mot){
 3    //déclaration de variables
 4        //aVirgule : booléen qui dit si le “mot” comporte (déjà) une virgule
 5    var aVirgule = mot.charAt(0)==","
 6                   || mot.charAt(0)==".",
 7        //resultat : booléen qui dit si le mot est (pour le moment) un nombre
 8        resultat = estChiffre1(mot.charAt(0))
 9                   || ( mot.length > 1
10                        && (aVirgule || mot.charAt(0)=="-"));
11        //On initialise resultat à vrai si le premier caractère est un chiffre ou
12          //si c'est une virgule ou un moins, mais que le mot contient d'autres caractères 
13    /*On parcourt le reste du mot (mais on s'arrête dès qu'on est sûr que ce n'est pas un
14      nombre. Dès que résultat sera faux, (resultat && i<mot.length) sera faux.*/
15    for(let i=1;resultat && i<mot.length;i++){
16       if(mot.charAt(i)=="," || mot.charAt(i)=="."){
17           if(aVirgule){
18              resultat = false;
19           }
20           else{
21              aVirgule = true;
22           }
23       }
24       else if(!estChiffre1(mot.charAt(i))){
25          resultat = false;
26       }
27    }
28    return resultat;
29 }

Fonction saisieNombres

Cette fonction demande à l’utilisateur d’entrer des nombres, n’accepte que les nombres et les stocke dans un tableau tant qu’il n’a pas entré "stop" et ensuite renvoie le tableau.

Correction

 1 function saisieNombres(){
 2   var res = [],
 3       //initialisation de la boucle
 4       thePrompt = "Saisissez un nombre",
 5       input = prompt(thePrompt);
 6   while (input != "stop"){//condition pour rester dans la boucle
 7     /*début du traitement*/
 8     if(estNombre(input)){
 9       thePrompt = "Saisissez un nombre"
10       res.push(input);
11     }
12     else{
13       thePrompt = "On a dit un NOMBRE !!!"
14     }
15     /*Fin du traitement*/
16     input = prompt(thePrompt); //incrément
17   }
18   return res;
19 }

ArrayToTableToArray + somme, tri et mélange

fonction ArrayToTable

 1 function arrayToTable(leTableau, idTable){
 2   var elt = document.getElementById(idTable),res = true;
 3   if(elt == null){
 4     //L'identifiant n'existe pas
 5     console.error("arrayToTable : "+idTable + " n'existe pas dans le document.");
 6     res = false;
 7   }
 8   else if(elt.tagName != "table"){
 9     //L'identifiant n'existe pas
10     console.error("arrayToTable : "+idTable + " n'est pas une table.");
11     res = false;
12   }
13   else{
14     //on crée du contenu
15     let content =""
16     for(let i=0;i<leTableau.length;i++){
17       content += "<td>"+leTableau[i]+"</td>";
18     }
19     //on le met dans l'élément
20     elt.innerHTML = "<tr>"+content+"</tr>";
21   }
22   return res;
23 }

fonction somme

1 function somme(tab){
2   var res= 0;
3   for(let i=0;i<tab.length;i++){
4     res += tab[i];
5   }
6   return res;
7 }

fonction trier

Je propose deux solution, de tri par sélection il y en a pleiiiiin d'autres beaucoup plus efficaces.

 1 function trierAvecTabIntermédiaire(tab){
 2   var res = [],//le tableau trié
 3       idMin=0;//l'index de la valeur min du tableau
 4   while(tab.length>1){
 5     //tant qu'on n'a pas vidé le tableau non trié
 6     for(let i=1;i<tab.length;i++){
 7       //on recherche l'identifiant de l'élément min du tableau
 8       if(tab[i]<tab[idMin]){
 9         idMin=i;
10       }
11     }
12     //quand il est trouvé, on l'ajoute à la fin du tableau trié
13     res.push(tab[idMin]);
14     //on enlève l'élément trié du tableau non trié
15     tab.splice(idMin,1);
16     //on se prépare à rechercher l'élément le plus petit
17     idMin=0;
18   }
19   //on prend le dernier élément qui est le plus grand
20   res.push(tab[idMin]);
21   return res;
22 }
23 
24 function trierSansTabIntermédiaire(tab){
25   //solution sans tableau intermédiaire
26   var idMin=0,//identifiant de la plus petite valeur de la partie non triée du tableau
27       idDebTri=0;//identifiant du 1er élément non trié
28   while(idDebTri<tab.length-1){
29     //tant qu'on n'a pas tout trié
30     for(let i=idDebTri+1;i<tab.length;i++){
31       //on recherche le minimum de la partie non triée
32       if(tab[i]<tab[idMin]){
33         idMin=i;
34       }
35     }
36     //quand on l'a trouvée, on intervertit la valeur trouvé avec le contenu de la première case non triée
37     let tmpVal = tab[idDebTri];
38     tab[idDebTri]=tab[idMin];
39     tab[idMin] = tmpVal;
40     //la partie non triée commence donc à la case suivante
41     idDebTri++;
42     //on se prépare à rechercher le minimum
43     idMin=idDebTri;
44   }
45   //la dernière case est mécaniquement triée lors du dernier tour de boucle, puisque l'avant dernière est le minimum
46   return tab;
47 }
48 
49 function trier(tab){
50    //Je choisis une version pour la fonction trier
51    return trierSansTabIntermédiaire(tab);
52 }

fonction tableToArray

Ci-dessous une version qui marche avec des tableaux qui ne sont pas de la forme :

<table><tbody><tr><td>1</td><td>2</td></tr></tbody></table>
 1 function tableToArray(idTable){
 2   var elt = document.getElementById(idTable),
 3       res = [];
 4   if(elt == null){
 5     //L'identifiant n'existe pas
 6     console.error("arrayToTable : "+idTable + " n'existe pas dans le document.");
 7     res = false;
 8   }
 9   else if(elt.tagName != "TABLE"){
10     //L'identifiant n'existe pas
11     console.error("arrayToTable : "+idTable + " n'est pas une table.");
12     res = false;
13   }
14   else{//on a bien un tableau, on va prendre la 1ère ligne, tant pis s'il y en avait plus
15     var ligne = elt.firstChild;
16     while(ligne != null && ligne.tagName != "TR"){
17       if(ligne.tagName == "TBODY"){
18         ligne = ligne.firstChild;
19       }
20       else{
21         ligne = ligne.nextSibling;
22       }
23     }
24     ligne = ligne.children
25     //avec un tr intermédiaire, on est censés avoir un tableau d'éléments td.
26     for(let j=0;j<ligne.length;j++){
27       if(ligne[j].tagName="TD"){
28         //le innerHTML est une String, on le convertit en nombre
29         //(on veut pouvoir en faire la somme)
30         res.push(Number(ligne[j].innerHTML));
31       }
32     }
33   }
34   return res;
35 }

fonction randomize

On crée une fonction qui mélange un tableau JS :

 1 function randomize(tab){
 2   var res = [] ;
 3   while(tab.length > 1){
 4      //on tire au sort un entier entre 0 et la longueur du tableau moins 1
 5      let i = Math.floor(Math.random()*tab.length);
 6      //on copie dans res la case à cet indice
 7      res.push(tab[i]);
 8      //on supprime cette case pour ne pas la re-tirer au sort
 9      tab.splice(i,1);
10   }
11   res.push(tab[0])
12   return res ;
13 }

Réutilisation de ces fonctions pour trier et mélanger des tableaux d'un document HTML

sortTable

 1 function sortTable(idTable, idTableTriee){
 2   //on récupère la table HTML dans un tableau JS
 3   var tabTemporaire = tableToArray(idTable) ;
 4   //on trie ce tableau
 5   tabTemporaire = trier(tabTemporaire) ;
 6   //on ajoute la somme à la fin
 7   tabTemporaire.push(somme(tabTemporaire));
 8   //on met dans le DOM le tableau obtenu
 9   arrayToTable(tabTemporaire, idTableTriee);
10 }

randomizeTable

1 function randomizeTable(idTable, idTableMelangee){
2   //on récupère la table HTML dans un tableau JS
3   var tabTemporaire = tableToArray(idTable) ;
4   //on met la version mélangée de ce tableau dans l'élément d'id idTableMelangee
5   arrayToTable(randomize(tabTemporaire), idTableMelangee) ;
6 }