Cours:Technologies avancées du eLearning 2/exercices/Saisie de nombres
De GBLL, TAL, ALAO, etc.
Énoncés dans le support de cours (diapos 16, 19, 21, 24 (première question), 25 et 26).
Un codepen avec tout le code ci-dessous : https://codepen.io/lzbk/pen/gQvNXw
Fonction estChiffre
Nous avons vu plusieurs solutions possibles :
//En utilisant un switch/case
function estChiffre1(car){
var resultat=false;
switch(car){
case "0":
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9":
resultat = true;
}
return resultat;
}
function estChiffre2(car){
//en utilisant l'ordre alphabétique (attention ça ne marche pas avec car<"10")
return (car>="0" && car<="9");
}
function estChiffre3(car){
//en utilisant un tableau des caractères autorisés
var resultat = false ;
var tabChiffres = ["0","1","2","3","4","5","6","7","8","9"];
for(let i=0;i<tabChiffres.length;i++){
if(tabChiffres[i] == car){
resultat = true;
}
}
return resultat;
}
function estChiffre4(car){
//avec un if
var resultat = false;
if ( car=="0"
|| car=="1"
|| car=="2"
|| car=="3"
|| car=="4"
|| car=="5"
|| car=="6"
|| car=="7"
|| car=="8"
|| car=="9"
){
resultat = true;
}
return resultat;
}
Fonction estNombre
Votre fonction est nombre doit passer le test suivant :
console.debug("Test de estNombre()");
console.log("Chaine vide : false attendu → " , estNombre(""));
console.log("romains : false attendu → " ,estNombre("XIV"));
console.log("1 : true attendu → " , estNombre("1"));
console.log("123546590143 : true attendu → " , estNombre("123546590143"));
console.log("1.62345 : true attendu → " , estNombre("1.62345"));
console.log("-1 : true attendu → " , estNombre("-1"));
console.log("-13240,2303458 : true attendu → " , estNombre("-13240,2303458"));
console.log("12345a12235 : false attendu → " , estNombre("12345a12235"));
console.log("12345-12235 : false attendu → " , estNombre("12345-12235"));
console.log("23.34562.234 : false attendu → " , estNombre("23.34562.234"));
console.log(".345 : true attendu → " , estNombre(".345"));
console.log(", : false attendu → " , estNombre(","));
console.log("- : false attendu → " , estNombre("-"));
Correction
//Prend une chaine de caractère et dit si c'est un nombre
function estNombre(mot){
//déclaration de variables
//aVirgule : booléen qui dit si le “mot” comporte (déjà) une virgule
var aVirgule = mot.charAt(0)==","
|| mot.charAt(0)==".",
//resultat : booléen qui dit si le mot est (pour le moment) un nombre
resultat = estChiffre1(mot.charAt(0))
|| ( mot.length > 1
&& (aVirgule || mot.charAt(0)=="-"));
//On initialise resultat à vrai si le premier caractère est un chiffre ou
//si c'est une virgule ou un moins, mais que le mot contient d'autres caractères
/*On parcourt le reste du mot (mais on s'arrête dès qu'on est sûr que ce n'est pas un
nombre. Dès que résultat sera faux, (resultat && i<mot.length) sera faux.*/
for(let i=1;resultat && i<mot.length;i++){
if(mot.charAt(i)=="," || mot.charAt(i)=="."){
if(aVirgule){
resultat = false;
}
else{
aVirgule = true;
}
}
else if(!estChiffre1(mot.charAt(i))){
resultat = false;
}
}
return resultat;
}
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
function saisieNombres(){
var res = [],
//initialisation de la boucle
thePrompt = "Saisissez un nombre",
input = prompt(thePrompt);
while (input != "stop"){//condition pour rester dans la boucle
/*début du traitement*/
if(estNombre(input)){
thePrompt = "Saisissez un nombre"
res.push(input);
}
else{
thePrompt = "On a dit un NOMBRE !!!"
}
/*Fin du traitement*/
input = prompt(thePrompt); //incrément
}
return res;
}
ArrayToTableToArray + somme, tri et mélange
fonction ArrayToTable
function arrayToTable(leTableau, idTable){
var elt = document.getElementById(idTable),res = true;
if(elt == null){
//L'identifiant n'existe pas
console.error("arrayToTable : "+idTable + " n'existe pas dans le document.");
res = false;
}
else if(elt.tagName != "table"){
//L'identifiant n'existe pas
console.error("arrayToTable : "+idTable + " n'est pas une table.");
res = false;
}
else{
//on crée du contenu
let content =""
for(let i=0;i<leTableau.length;i++){
content += "<td>"+leTableau[i]+"</td>";
}
//on le met dans l'élément
elt.innerHTML = "<tr>"+content+"</tr>";
}
return res;
}
fonction somme
function somme(tab){
var res= 0;
for(let i=0;i<tab.length;i++){
res += tab[i];
}
return res;
}
fonction trier
Je propose deux solution, de tri par sélection il y en a pleiiiiin d'autres beaucoup plus efficaces.
function trierAvecTabIntermédiaire(tab){
var res = [],//le tableau trié
idMin=0;//l'index de la valeur min du tableau
while(tab.length>1){
//tant qu'on n'a pas vidé le tableau non trié
for(let i=1;i<tab.length;i++){
//on recherche l'identifiant de l'élément min du tableau
if(tab[i]<tab[idMin]){
idMin=i;
}
}
//quand il est trouvé, on l'ajoute à la fin du tableau trié
res.push(tab[idMin]);
//on enlève l'élément trié du tableau non trié
tab.splice(idMin,1);
//on se prépare à rechercher l'élément le plus petit
idMin=0;
}
//on prend le dernier élément qui est le plus grand
res.push(tab[idMin]);
return res;
}
function trierSansTabIntermédiaire(tab){
//solution sans tableau intermédiaire
var idMin=0,//identifiant de la plus petite valeur de la partie non triée du tableau
idDebTri=0;//identifiant du 1er élément non trié
while(idDebTri<tab.length-1){
//tant qu'on n'a pas tout trié
for(let i=idDebTri+1;i<tab.length;i++){
//on recherche le minimum de la partie non triée
if(tab[i]<tab[idMin]){
idMin=i;
}
}
//quand on l'a trouvée, on intervertit la valeur trouvé avec le contenu de la première case non triée
let tmpVal = tab[idDebTri];
tab[idDebTri]=tab[idMin];
tab[idMin] = tmpVal;
//la partie non triée commence donc à la case suivante
idDebTri++;
//on se prépare à rechercher le minimum
idMin=idDebTri;
}
//la dernière case est mécaniquement triée lors du dernier tour de boucle, puisque l'avant dernière est le minimum
return tab;
}
function trier(tab){
//Je choisis une version pour la fonction trier
return trierSansTabIntermédiaire(tab);
}
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>
function tableToArray(idTable){
var elt = document.getElementById(idTable),
res = [];
if(elt == null){
//L'identifiant n'existe pas
console.error("arrayToTable : "+idTable + " n'existe pas dans le document.");
res = false;
}
else if(elt.tagName != "TABLE"){
//L'identifiant n'existe pas
console.error("arrayToTable : "+idTable + " n'est pas une table.");
res = false;
}
else{//on a bien un tableau, on va prendre la 1ère ligne, tant pis s'il y en avait plus
var ligne = elt.firstChild;
while(ligne != null && ligne.tagName != "TR"){
if(ligne.tagName == "TBODY"){
ligne = ligne.firstChild;
}
else{
ligne = ligne.nextSibling;
}
}
ligne = ligne.children
//avec un tr intermédiaire, on est censés avoir un tableau d'éléments td.
for(let j=0;j<ligne.length;j++){
if(ligne[j].tagName="TD"){
//le innerHTML est une String, on le convertit en nombre
//(on veut pouvoir en faire la somme)
res.push(Number(ligne[j].innerHTML));
}
}
}
return res;
}
fonction randomize
On crée une fonction qui mélange un tableau JS :
function randomize(tab){
var res = [] ;
while(tab.length > 1){
//on tire au sort un entier entre 0 et la longueur du tableau moins 1
let i = Math.floor(Math.random()*tab.length);
//on copie dans res la case à cet indice
res.push(tab[i]);
//on supprime cette case pour ne pas la re-tirer au sort
tab.splice(i,1);
}
res.push(tab[0])
return res ;
}
Réutilisation de ces fonctions pour trier et mélanger des tableaux d'un document HTML
sortTable
function sortTable(idTable, idTableTriee){
//on récupère la table HTML dans un tableau JS
var tabTemporaire = tableToArray(idTable) ;
//on trie ce tableau
tabTemporaire = trier(tabTemporaire) ;
//on ajoute la somme à la fin
tabTemporaire.push(somme(tabTemporaire));
//on met dans le DOM le tableau obtenu
arrayToTable(tabTemporaire, idTableTriee);
}
randomizeTable
function randomizeTable(idTable, idTableMelangee){
//on récupère la table HTML dans un tableau JS
var tabTemporaire = tableToArray(idTable) ;
//on met la version mélangée de ce tableau dans l'élément d'id idTableMelangee
arrayToTable(randomize(tabTemporaire), idTableMelangee) ;
}