Copyright © 2025 Yves MARCOUX; dernière modification de cette page: 2025-05-26.
SCI6373 Programmation documentaire
Exercices à faire après avoir complété les lectures données au Cours 2
Yves MARCOUX – EBSI – Université de Montréal
Votre coffre à outils jusqu’à maintenant Outil Fait quoi ? Utilisation Vu où ? + - * /+ - × ÷ n1 + n2§ 6 +Concaténation de chaînes ch1 + ch2§ 6 =Assignation de variable maVar = expression§ 7 Math.PIπ (3.14159…) Math.PI§ 5 ==Est égal à val1 == val2§ 9.1 ===Égalité stricte (sans conversion) val1 === val2C2 !=Est différent de val1 != val2§ 9.1 >Est plus grand que val1 > val2§ 9.1 >=Est plus grand que ou égal à val1 >= val2§ 9.1 <Est plus petit que val1 < val2§ 9.1 <=Est plus petit que ou égal à val1 <= val2§ 9.1 ||OU booléen val1 || val2§ 9.2 &&ET booléen val1 || val2§ 9.2 !NON booléen !val§ 9.2 ? :Choix conditionnel valBool ? valSiVrai : valSiFaux§ 9.3 -Inversion de signe -n§ 9.4 +Chaîne → nombre +ch§ 9.4 Math.min()Minimum Math.min(n1, n2, …)§ 10.1 Math.max()Maximum Math.max(n1, n2, …)§ 10.1 Math.sqrt()Racine carrée Math.sqrt(n)§ 10.1 Math.pow()Exposant Math.pow(n1, n2)§ 10.1 .lengthLongueur d’une chaîne ch.length§ 10.2 .charAt()Extrait caractère en position ch.charAt(n)§ 10.2 .slice()Extrait sous-chaîne ch.slice(nDéb, nFin)§ 10.2 .toUpperCase()→ Majuscules ch.toUpperCase()§ 10.2 .toLowerCase()→ Minuscules ch.toLowerCase()§ 10.2 .indexOf()Position d’une sous-chaîne ch1.indexOf(ch2)§ 10.2 .lastIndexOf()Dernière position d’une sous-chaîne ch1.lastIndexOf(ch2)C2 .includes()Présence d’une sous-chaîne ch1.includes(ch2)§ 10.2 prompt()Affiche invite & lit une chaîne chLue = prompt(chInvite)§ 10.3 alert()Affiche message alert(chMessage)§ 10.3
Dessinez l’arbre d’exécution de chacune des expressions suivantes. Quand c’est possible, donnez aussi la valeur de l’expression.
5 - 3 + 4
5 - (3 + 4)
true ? 1 : 'abc'
false ? 1 : 'abc'
(2 == 1+1) ? 'orange' : 'pomme'
9 - 6 / 2 + 2 * 3
20 * (4.5 + 0.5) / (11 - 1)
taux + ( 3 + 4 )
salaire = 50 - ( 3 + salaire )
Notons qu’il s’agit d’une réassignation (la nouvelle valeur de
salaire est calculée à partir de l’ancienne).
(v = 12) - (7 * 5)
44 + Math.min ( 11 - 11 , 22 ) / 10
'Bonjour, '+prompt('Quel est votre nom?')+' !'
alert("Votre permis est " + (valide ? "" : "in") + "valide")
(text+"m").slice(1, text.toLowerCase().indexOf('m'))
text.slice(text.length / 2)
Math.min est-elle invoquée dans
l’expression suivante ?
44 + Math.min ( 11 - 1 , 22 ) / 10
2 arguments
44 + Math.min ( 11 - 1 , 22 ) / 10
44 + Math.min ( 11 - 1 , 22 ) /
10
44 + Math.min ( 11 - 1 , 22 ) / 10
44 + Math.min ( 11 - 1 , 22 ) /
10
Math.min dans l’expression suivante :
44 + Math.min ( 11 - 1 , 22 ) / 10
44 + Math.min ( 11 - 1 , 22 ) /
10
Math.min dans l’expression suivante :
44 + Math.min ( 11 - 1 , 22 ) / 10
44 + Math.min ( 11 - 1 , 22 ) /
10
44 + Math.min ( 11 - 1 , 22 ) / 10
44 + Math.min ( 11 - 1 , 22 ) /
10
44 + Math.min ( 11 - 1 , 22 ) / 10
45
Math.min() est-elle invoquée
dans l’expression suivante ?
Math.min( 7, Math.max(3, Jean), 12)
3 arguments
Jean contient une valeur numérique ?
Math.min( 7, Math.max(3, Jean), 12)
Non, le résultat dépend de la valeur de Jean; si 3 <
Jean < 7, l’expression aura la même valeur que
Jean, autrement, elle vaudra 7.
Jean contient une valeur numérique ?
Math.max( 7, Math.min(3, Jean), 12)
Oui, peu importe la valeur de Jean la valeur de
Math.min(3, Jean) sera toujours ≤ 3; donc la valeur de
l’expression complète sera toujours 12.
? : dans l’expression suivante :
(2 == 1+1) ? 'orange' : 'pomme'
(2 == 1+1) ? 'orange' : 'pomme'
? : dans l’expression suivante :
(2 == 1+1) ? 'orange' : 'pomme'
(2 == 1+1) ? 'orange' : 'pomme'
? : dans l’expression suivante :
(2 == 1+1) ? 'orange' : 'pomme'
(2 == 1+1) ? 'orange' : 'pomme'
(2 == (1+1)) ? 'orange' : 'pomme'
'orange'
(2 == 1+1) ? 'orange' : 'pomme'
(2 == 1+1) ? 'orange' : 'pomme'
.length dans l’expression suivante :
"haricot".slice(v - 2, 4).length/2
"haricot".slice(v - 2,
4).length/2
.slice dans l’expression suivante :
"haricot".slice(v - 2, 4).length/2
"haricot".slice(v - 2,
4).length/2
.slice dans l’expression suivante :
"haricot".slice(v - 2, 4).length/2
"haricot".slice(v - 2,
4).length/2
.includes() dans l’expression suivante :
descrip.toLowerCase().includes('content') ? "🙂" : "🙁"
descrip.toLowerCase().includes('content')
? "🙂" : "🙁"
.includes() dans l’expression suivante :
"oui yes".includes(rép.toLowerCase()) ? "🙂" : "🙁"
"oui yes".includes(rép.toLowerCase()) ?
"🙂" : "🙁"
'orange'.length * 2
12
'pommes'.length == 'orange'.length
true
'orange'.charAt(2)
"a"
'orange'.charAt(2) == 'orange'.charAt(3)
false
'pomme'.charAt(2) == 'pomme'.charAt(3)
true
'pomme' == 'pommes'
false
'pomme' != 'pommes'
true
('pomme'+"s") != 'pommes'
false
Pour le reste de cette section, on suppose la variable
p définie par p = "pomme".
p.length
5
p.toUpperCase()
"POMME"
p.toLowerCase()
"pomme" (L’application de la fonction n’a rien changé dans ce
cas.)
p == p.toLowerCase()
true
p.slice(1)
"omme"
p.slice(1).length
4
p.slice(0, 1).toUpperCase()
"P"
p.slice(0, 1).toUpperCase() + p.slice(1)
"Pomme"
.indexOf() dans le cas où la chaîne recherchée ne se trouve nulle
part dans la chaîne sujet. Rédigez une expression qui vous permettra d’avoir
immédiatement réponse à votre interrogation.
"".indexOf("a")
ou bien :
vous permettra de constater que la valeur retournée lorsque la chaîne recherchée ne se trouve pas dans la chaîne sujet est
"pomme".indexOf("raisin")
-1.Quelle sera la réponse obtenue au dernier énoncé ?
p = "pomme";
p.toUpperCase();
p;
"pomme"
Il est important de comprendre que .toUpperCase(), comme les
autres fonctions travaillant sur les valeurs caractères, ne modifie
pas la valeur de la chaîne sujet, même si celle-ci est stockée
dans une variable. Elle calcule une nouvelle chaîne, à partir de la chaîne
sujet, et retourne cette nouvelle chaîne comme résultat. En jargon JS, on
dit que cette fonction n’est pas modificatrice (en anglais,
mutating). Vous aurez compris que, si on prend la peine de nommer
ce concept, c’est que certaines fonctions sont, elles,
modificatrices… Nous verrons ça en temps et lieu, quand nous aborderons les
tableaux.
À une commode.
À son contenu.
Au nom écrit (ou à une étiquette collée) sur le devant du tiroir qui contient sa valeur.
Quelques centaines (autour de deux-cents).
Vrai. Par exemple, l’assignation :
s’exécute sans erreur et semble fonctionner, mais la valeur stockée dans le membre
closed = "essai"
closed n’a pas changé :closedfalse
texte.texte.charAt(texte.length-2)
Que pensez-vous qu’il arrive si texte.length <= 1 ?
Essayez-le !
Pensez à utiliser .toUpperCase()
et
.toLowerCase().
verdict =
(car >= '0'
&& car <= '9') || (car.toLowerCase() !=
car.toUpperCase());
note,
dont la valeur est un nombre entre 0 et 100 inclusivement, obtenir une chaîne
constituée d’un seul caractère, représentant la cote littérale correspondant à la
note note, selon la correspondance suivante :
Note sur 100 Cote ≥ 90 A ≥ 60 et < 90 B < 60 C
note >= 90 ? "A" : note >= 60 ? "B" : "C"
Notons qu’il n’est pas nécessaire de vérifier la condition < 90 pour le deuxième cas, puisque la partie après le premier ":" n’est évaluée que si la note est < 90. Idem pour < 60 dans le troisième cas.
coteNum,
dont la valeur est un entier entre 1 et 6 inclusivement, obtenir une chaîne
constituée d’autant de caractères astérisques (*) que la valeur de
coteNum.Conseil : N’utilisez pas le choix conditionnel
(? :) pour distinguer les différents cas.
Utilisez .slice() avec une constante comme chaîne sujet.
"******".slice(0, coteNum)
ou encore :
"******".slice(6-coteNum)
N.B.: Il existe aussi une fonction .repeat() (omise jusqu’ici
en vertu du principe PYM) qui permet de répéter une chaîne un certain nombre
de fois. La solution la plus simple serait donc
"*".repeat(coteNum).
Pour les minidéfis suivants, créez une page HTML à partir du canevas de page scriptée
(infrastructure vide) et inscrivez vos énoncés (expressions suivies d’un ";")
dans l’élément script. Utilisez prompt() et
alert() pour les interactions avec l’utilisatrice. Tenez pour acquis
que l’utilisatrice ne cliquera pas sur Annuler en réponse
au prompt(), ni qu’elle cliquera OK sans rien
saisir, ni qu’elle saisira autre chose que ce qui lui est demandé.
Les réponses proposées ne montrent que les énoncés à inscrire dans l’élément
script.
prénom = prompt("SVP, entrez votre prénom");
alert("Votre prénom en
majuscules : " + prénom.toUpperCase());
prénom = prompt("SVP, entrez votre prénom");
alert("Votre prénom
comporte " + prénom.length + " caractères.");
saison = prompt("SVP, entrez un nom de saison");
nomAnglais
=
saison == "printemps" ? "spring" :
saison == "été" ?
"summer" :
saison == "automne" ? "fall" :
saison == "hiver"
? "winter" : "???";
alert("Cette saison se nomme " + nomAnglais + " en
anglais.");
Les structures if…else et switch…case que nous
verrons plus tard peuvent aussi servir à ce genre de « conversion » d’un
ensemble de valeurs possibles vers un autre.
Pour les minidéfis suivants, tenez pour acquis (sans que votre script ne le valide) que le nom fourni est de la forme "Prénom Nom", sans espace avant le prénom ni après le nom, et avec une seule espace séparant le nom du prénom.
Les solutions proposées ne marchent pas avec des prénoms multiples s’écrivant sans trait-d’union (e.g., Félix Antoine ou Anna Claudia Maria). En revanche, elles fonctionnent avec les noms multiples s’écrivant sans trait-d’union (Desgagnés Trudel). Des solutions alternatives sont données qui marchent avec les prénoms multiples (en revanche, elles ne marchent plus avec les noms multiples).
nomComplet = prompt("Votre nom sous forme Prénom Nom,
SVP");
longPré = nomComplet.indexOf(" ");
prénom =
nomComplet.slice(0, longPré);
nom = nomComplet.slice(longPré +
1);
alert("Votre nom peut aussi s’écrire : " + nom + ", " +
prénom);
.indexOf(" ") par
.lastIndexOf(" ").nomComplet = prompt("Votre nom sous forme Prénom Nom,
SVP");
longPré = nomComplet.indexOf(" ");
longNom =
nomComplet.length - longPré - 1;
msg =
longPré > longNom ?
"Votre prénom est plus long que votre nom de famille." :
longPré
< longNom ? "Votre nom de famille est plus long que votre prénom."
:
"Vos nom et prénom sont de même
longueur.";
alert(msg);
Il est préférable de ne pas inclure des alert() dans
la longue expression conditionnelle, ainsi :
msg =
longPré > longNom ? alert("Votre prénom est
plus long que votre nom de famille.") :
longPré < longNom ?
alert("Votre nom de famille est plus long que votre prénom.")
:
alert("Vos nom et prénom sont de même longueur.");
D’une part, pour éviter la répétition de la fonction alert().
Mais, d’autre part et surtout, parce que le choix conditionnel est fait pour
choisir une valeur, et non pas une action. Pour choisir
une action parmi plusieurs possibles, sur la base d’une condition, la
structure de contrôle
if…else, que nous verrons plus tard, est la façon de faire.
.indexOf(" ") par
.lastIndexOf(" ").