🗂 3.2. Fonction pour n'importe quelle table
🗂 4.1. Première idée : deux boucles imbriquées
🗂 4.2. Une autre possibilité : deux fonctions
📂 6. Le jeu du nombre à deviner
🗂 7.1. Réutilisation du code de la fonction "miroir" de chaîne de caractères
En renvoyant la table sous forme de chaîne de caractères, on évite ainsi d'utiliser des instructions print()
dans la fonction.
Ne pas oublier ( ligne 5 ) de transtyper le résultat du calcul de i*n
( un entier ) vers le type chaîne de caractères, sinon la concaténation est impossible ( Python signale une erreur.)
Il faut ici reprendre le script précédent, en s'arrangeant pour le faire "tourner" autant de fois que l'on veut de tables différentes ( ici, 10 ), tout en changeant à chaque fois la valeur du nombre dont
on veut la table : au lieu de i*3
, il faudrait pouvoir "écrire" automatiquement :
print(i*1)
pour la première tableprint(i*2)
pour la deuxième,print(i*3)
,La solution est de faire "tourner" la boucle de l'application 2 à l'intérieur d'une autre boucle : c'est celle-ci qui nous permettra de faire varier le nombre dont on veut la table...
On parle dans ce cas de deux boucles imbriquées; c'est une structure très commune en programmation, et pas toujours évidente à comprendre...Il faut notamment bien faire attention à l'indentation des instructions indiquant les blocs logiques de chacune des deux boucles.
i*j
nous donne la valeur à afficher; remarquer que cette instruction est indentée par rapport au for
de la boucle i, car elle doit être exécutée à chaque tour de celle-ci.for
de la
boucle j; autrement dit, elle appartient au même bloc logique que la boucle i...Pour éviter les print()
dans la fonction, on peut là aussi construire la chaîne représentant les différentes tables; pour revenir à la ligne,
on utilisera alors le caractère '\n' qui signifie "retour à la ligne" :
On peut également reprendre la fonction précédente qui crée une seule table, et écrire une deuxième qui fait appel à elle pour construire la "table des tables" :
D'après le principe proposé, on va comparer chaque puissance de 2 croissante moins 1 au nombre, tant que l'on n'a pas dépassé ce nombre.
Cela nous donne donc le principe du code à écrire :
while
Ligne 5 : attention à la condition à évaluer. Il ne faut pas confondre 2n qui est égal au nombre total de valeurs différentes que l'on peut coder avec n bits, et 2n - 1 qui est la valeur la plus grande que l'on peut coder avec n bits ( c'est elle qui nous intéresse ici ).
while
signifie "TANT QUE", et pas "JUSQU'A CE QUE"...while
; l'entrée utilisateur doit donc être faite à l'intérieur de cette boucle, et
logiquement au début de celle-ci, avant l'évaluation des conditions.entree != nombre
devient alors fausse et on sort donc de la boucle; l'affichage de Gagné !
doit donc se faire en dehors de la boucle.De nombreuses façons différentes existent pour résoudre ce problème, en voici deux.
Finalement, un mot est un palindrome si il est identique à son mot "en miroir".
D'où l'idée qui consiste à :
On peut ( on doit ! ) bien sûr réutiliser le code la fonction envers()
écrit au chapitre sur les fonctions :
On rappelle que pour adresser un caractère d'indice i dans une chaîne, on utilise la notation : chaine[i]
Or :
0
est le "symétrique" du dernier, d'indice - 1
( ou len(chaine) - 1
, c'est égal...)1
est le "symétrique" de l'avant-dernier, d'indice - 2
= - 1 - 1
2
est le "symétrique" de l'avant-dernier, d'indice - 3
= - 1 - 2
- 1 - i
il faut donc ici tester, si, pour chacun des caractères de la chaîne, l'égalité
chaine[i] == chaine[- 1 - i]
est vérifiée ou pas.
Ce qui impose donc, pour parcourir les caractères de la chaîne, de ne pas utiliser un parcours par valeur comme on le faisait jusqu'à présent ( for lettre in chaine
), mais un parcours par indice
utilisant une boucle for i in range()
pour faire varier la valeur de i, de 0
( 1er caractère ) jusqu'à len(chaine) - 1
( dernier caractère ) :
False
.True
que si la boucle est terminée, il ne faut surtout pas mettre cette instruction DANS la boucle !Au lieu d'utiliser une boucle for ... in range(...)
pour faire varier i, on peut :
len(mot) - 1
( = indice du dernier )while
, en incrémentant la première et en décrémentant la deuxième