Lire une série de valeurs
Comment additionner les prix d'un panier quand on ne sait pas à l'avance combien il y a d'articles ? On lit les valeurs une par une, jusqu'à ce que l'utilisateur donne un signal d'arrêt.
Un nombre de valeurs connu
Quand on connaît le nombre de valeurs, une boucle pour suffit :
combien est un nombre
demande 'Combien de notes ? ' dans combien
note est un nombre
total est un nombre vaut 0
pour i de 1 à combien
demande 'Note ' + i + ' ? ' dans note
total ajoute note
fin pour
affiche 'Moyenne : ' + total / combien
Mais c'est peu pratique : il faut compter ses notes avant de commencer.
La valeur sentinelle
Autre méthode : on convient d'une valeur spéciale qui veut dire « j'ai fini ». On l'appelle la sentinelle. Ici, taper 0 arrête la saisie :
prix est un nombre vaut -1
total est un nombre vaut 0
articles est un nombre vaut 0
affiche 'Tape le prix de chaque article, puis 0 pour terminer.'
tant que prix <> 0
demande 'Prix ? ' dans prix
si prix <> 0 alors
total ajoute prix
articles ajoute 1
fin si
fin tant que
affiche articles + ' articles, total : ' + total + ' €'
Trois détails importants :
prix démarre à -1, une valeur quelconque différente de 0, pour que la boucle commence ;- le
si prix <> 0 évite de compter la sentinelle comme un article ; - la sentinelle doit être une valeur impossible pour les vraies données : aucun article ne coûte 0 €.
Question : Pourquoi ne pourrait-on pas choisir 0 comme sentinelle pour saisir des températures ? — Parce que 0 degré est une température possible. La sentinelle doit être une valeur que les données ne peuvent jamais prendre. Pour des températures, on choisirait par exemple 999.
Garder le plus grand et le plus petit
Pendant la saisie, on peut tenir à jour toutes sortes de résultats : compteur, total, maximum...
score est un nombre vaut 0
meilleur est un nombre vaut -1
parties est un nombre vaut 0
total est un nombre vaut 0
affiche 'Tape tes scores (un nombre négatif pour terminer).'
tant que score >= 0
demande 'Score ? ' dans score
si score >= 0 alors
parties ajoute 1
total ajoute score
si score > meilleur alors
meilleur vaut score
fin si
fin si
fin tant que
si parties = 0 alors
affiche 'Aucun score saisi.'
sinon
affiche parties + ' parties'
affiche 'Meilleur score : ' + meilleur
affiche 'Score moyen : ' + decimal(total / parties, 1)
fin si
Ici, la sentinelle est n'importe quel nombre négatif. Et à la fin, on vérifie qu'au moins une valeur a été saisie : sans ce test, la moyenne ferait une division par zéro.
Ranger les valeurs dans un tableau
Si l'on a besoin des valeurs après la saisie (pour les trier, les afficher...), on les garde dans un tableau :
prenoms est un tableau
saisi est un texte vaut '?'
affiche 'Tape les prénoms des invités (ligne vide pour terminer).'
tant que non est_vide(saisi)
demande 'Prénom ? ' dans saisi
si non est_vide(saisi) alors
prenoms ajoute majuscule_initiale(saisi)
fin si
fin tant que
trier(prenoms)
affiche longueur(prenoms) + ' invités : ' + joindre(prenoms, ', ')
Avec des textes, la sentinelle la plus naturelle est la ligne vide : on appuie simplement sur Entrée.
En résumé
- Nombre de valeurs connu : boucle
pour. Inconnu : boucle tant que avec une sentinelle. - La sentinelle est une valeur que les données ne peuvent pas prendre.
- On ne traite jamais la sentinelle comme une donnée.
- Avant de calculer une moyenne, on vérifie qu'il y a au moins une valeur.