Entraînement : Structures de contrôles en Python
if
Exercice : majeur ou pas
Proposez un programme (4 lignes) qui demande à l'utilisateur son âge, si l'utilisateur a 18 ans ou plus, le programme affiche "Vous êtes donc majeur !" puis "Enchanté !"
exemple de trace d'execution :
- Utilisez un
if
, avec un opérateur supérieur ou égal>=
.. - N'oubliez pas de convertir la chaîne donnée par l'utilisateur en entier !
Exercice : majeur ou mineur
Ecrivez un programme qui demande à l'utilisateur son âge. Si il est majeur (18 ans ou plus), le programme affiche "Majeur". Sinon le programme affiche "Mineur".
- Utilisez deux
if
l'un après l'autre. L'un s'occupe du cas de l'utilisateur majeur, l'autre du cas de l'élève mineur. - N'oubliez pas la conversion !
- Le
if
pour majeur utilise un supérieur ou égal>=
- le
if
pour mineur utilise un inférieur stricte<
Exercice : majeur et vieux
Ecrivez un programme (5 lignes) qui demande l'âge de l'utilisateur. Si l'utilisateur est majeur, il doit afficher "Majeur". Si l'utilisateur a 60 ans ou plus, il doit afficher "Et vieux".
Exemples de trace :
- Utilisez deux
if
successifs. - N'oubliez pas la conversion
if ... else
Exercice : 26 ans
Ecrire un programme qui demande son âge à l'utilisateur. Si l'utilisateur a 26 ans, le programme affiche Vous ne seriez pas prof de NSI par hasard ?
. Sinon, si l'utilisateur est majeur (18 ans ou plus), il doit afficher "Majeur", et "Mineur" sinon.
Exemple de traces :
- Il ya a un if...else, puis un if...else dans le else
- N'oubliez pas les conversions
- Pour vérifier si l'âge est égal a 26, il faut utiliser l'opérateur d'égalité
==
.
while
Exercice : exactement 10
Ecrivez un programme qui : demande un nombre à l'utilisateur. Si ce nombre est 10, il s'arrête en affichant Bravo !
. Sinon, il redemande le nombre à l'utilisateur tant que l'utilisateur ne rentre pas 10.
Exemple de trace :
- Vous n'avez besoin que du while comme structure de contrôle. Pas de
if
, pas de séquence. - il vous faut utiliser
input
à l'intérieur du while - n'oubliez pas les conversions
- tant que le nombre n'est pas 10 veut dire que vous devrez probablement utiliser
!=
.
Exercice : compter à l'envers
Ecrivez un programme qui demande un nombre à l'utilisateur, et qui compte ensuite à l'envers jusqu'à zéro (inclus) à partir de ce nombre.
Exemple de trace :
- Il vous faut une variable dont la valeur diminue de 1 à chaque tour de boucle
- Vous affichez cette valeur à chaque tour de boucle
- Vous continuez tant que la valeur n'est pas inférieure à zéro
Exercice : multiplier avec une boucle
Ecrivez un programme qui demande deux nombres n1
et n2
à l'utilisateur et affiche leur produit (n1 * n2
), mais sans utiliser l'opérateur de multiplication *
.
Exemple de trace
- Faire une multiplication de x par y, c'est ajouter "x fois" y
- Attention aux valeurs que vous utilisez pour compter le nombre de vos tours de boucle !
- N'oubliez pas les conversions
n1 = int(input("n1 ?"))
n2 = int(input("n2 ?"))
res = 0 ## on va ajouter "n2 fois" n1 à cette variable
i = 0
while i < n2:
res = res + n1
i = i + 1
print(res)
n2 - 1
(tant que i < n2
). C'est très courant en informatique de compter à partir de zéro, pour des raisons historiques. Nous les verrons bien plus tard dans ce cours.
Exercice : Carrés en console
Ecrivez un programme (6 lignes) qui demande à l'utilisateur un caractère et un entier n
, et qui affiche en console un carré de n
caractères de côté.
Exemple de trace
- Vous pouvez utiliser une boucle
while
et l'opérateur de répétition des chaînes ("chaine" * nb_repet
) - Faites bien attention à la valeur de la variable que vous utilisez pour compter les tours !
- Pensez bien à ajouter 1 au compteur !
- Vous pouvez utiliser une expression avec deux fois l'opérateur de répétition des chaînes
Mixte : TP calculatrice
Partie 1 : choix d'une opération
Ecrivez un programme (7 lignes) qui demande à l'utilisateur de rentrer +
, -
ou *
, puis et qui affiche le mot qui correspond à l'opération.
- +
-> plus
- -
-> moins
- *
-> fois
Exemples de trace :
MEME SI VOUS REUSSISSEZ L'EXERCICE, LISEZ L'AIDE, elle contient une astuce qui pourra vous aider par la suite.
- Vous n'avez besoin que de trois
if
dans ce programme, pas deelse
- Il n'y a pas non plus besoin de faire de conversion
- Utilisez l'opérateur d'égalité
==
Il est parfois bien de commencer par écrire ce que doit faire le programme en commentaire avant de coder, puis de remplacer les commentaires par le code correspondant
#on demande l'operation a l'utilisateur
# si "+" on affiche "plus"
# si "-" on affiche "moins"
# si "*" on affiche "fois"
Vous pouvez aussi dessiner la structure des décisions de votre programme sur une feuille, ça peut aider !
Partie 2 : opération inconnue
Ajoutez un if
à la fin du programme pour afficher "operation inconnue" si l'opération rentrée n'est pas +
, -
ni x
Votre if doit vérifier que :
- l'opérateur est différent de "+"
- et que l'opérateur est différent de "-"
- et que l'opérateur est différent de "*"
Vous pouvez faire ça avec l'opérateur booléen ET and
, et l'opérateur d'inégalité !=
.
On ajoute if
suivant :
Ce qui donne le programme complet :
Partie 3 : une seule structure
Utilisez des if
, elif
et else
pour modifier le code de la partie précédente (Partie 2) et rassembler tous les choix dans une même structure.
Le fait de changer le code d'un programme sans en modifier le comportement pour en améliorer l'expressivité s'appelle le refactoring. C'est une pratique très courante en informatique.
- Vous aurez besoin d'un
if
, d'unelse
et de deuxelif
. - La condition finale sera le
else
. - En dehors du else, il y a très peu de changement à faire.
Partie 4 : On calcule enfin !
Ajoutez dans le programme deux instructions pour demander des nombres à l'utilisateur, puis modifiez le corps de chaque if
et elif
pour afficher le résultat de l'opération demandée.
Exemples de traces :
- N'oubliez pas les conversions
- Faites une opération à la fois
- Vous n'avez pas besoin de modifier la structure du code, seulement de changer le contenu des print
Cette solution détaille les étapes des traitements. Ce n'est pas la plus concise, mais elle est parfaitement acceptable !
n1 = int(input("n1 ? "))
op = input("op ? ")
n2 = int(input("n2 ? "))
if op == "+":
operation = str(n1) + " + " + str(n2) ##formattage de l'opération pour l'afficher
res = n1 + n2 ##calcul du résultat
print(operation + " = " + str(res)) ##affichage
elif op == "-":
operation = str(n1) + " - " + str(n2)
res = n1 - n2
print(operation + " = " + str(res))
elif op == "*":
operation = str(n1) + " * " + str(n2)
res = n1 * n2
print(operation + " = " + str(res))
else:
operation = str(n1) + " - " + str(n2)
print(operation + " = operation inconnue")
Cette solution est plus concise, mais quand même dure à lire, à cause des prints qui sont un peu longs.
n1 = int(input("n1 ? "))
op = input("op ? ")
n2 = int(input("n2 ? "))
if op == "+":
print(str(n1) + " + " + str(n2) + " = " + str(n1 + n2))
elif op == "-":
print(str(n1) + " - " + str(n2) + " = " + str(n1 - n2))
elif op == "*":
print(str(n1) + " * " + str(n2) + " = " + str(n1 * n2))
else:
print(str(n1) + op + str(n2) + " = operation inconnue")
Cette solution n'est pas celle qui était attendue, je la mets toutefois ici, parce qu'elle est plus concise en tout en évitant les longs prints, et constitue une solution "idéale". Elle evite les répétitions, on appelle ça factoriser le code, nous en rediscuterons plus tard dans ce cours.
Partie 5 : redemander une entrée correcte
Reprenez le code de la calculatrice que nous avons fait dans le cours. Transformez le pour faire en sorte de redemander l'opérateur tant qu'il n'est pas connu (+
, -
ou *
)
Exemple de trace possible :
Autre exemple de trace possible (Exploration) :
- N'hésiter pas à partir du code de la Partie 4, solution concise et factorisée, il est plus propre donc plus simple à gérer
- Réfléchissez où vous allez mettre la boucle qui vérifie que l'opérateur est le bon
- Le premier exemple de trace est sans doute plus facile à implanter que le second
- Formulez vos possibilités avec
!=
- Utilisez l'opérateur booléen ET
and
pour lister les possibilités dans la condition
Cette solution est la plus simple, et aussi la plus claire pour l'utilisateur. C'est celle que l'on attendrait d'un lycéen.
n1 = int(input("n1 ? "))
op = input("op ? ")
while op != "+" and op != "-" and op != "*":
op = input("op ? ")
n2 = int(input("n2 ? "))
if op == "+":
res = n1 + n2
elif op == "-":
res = n1 - n2
elif op == "*":
res = n1 * n2
else:
res = "operation inconnue"
print(str(n1) + op + str(n2) + " = " + str(res))`
Cette solution est plus fouilli, et il serait étonnant de la voir de la part d'un lycéen. En examen (si c'est pas moi qui corrige), elle aurait sans doute une moins bonne note que l'autre. Elle est aussi un peu moins ergonomique pour l'utilisateur.
n1 = int(input("n1 ? "))
op = input("op ? ")
n2 = int(input("n2 ? "))
res = "operation inconnue" #on met la valeur pour entrer dans la boucle
while (res == "operation inconnue")
if op == "+":
res = n1 + n2
elif op == "-":
res = n1 - n2
elif op == "*":
res = n1 * n2
else:
res = "operation inconnue"
print(str(n1) + op + str(n2) + " = " + str(res))`
Mais cette solution a un avantage : la vérification dépends uniquement du cas général de notre if...elif
.
Celà veut dire que si on veut rajouter un opérateur à la liste, par exemple /
, on aura ici un seule endroit ou changer (ajouter un elif
) alors que dans l'autre solution, il faudrait changer le code à deux endroits (ajouter un elif
et ajouter and op != "/"
dans la boucle de vérification).
Sur un exemple comme ça, ça ne fait pas une grande différence, en revanche, sur un programme plus conséquent, faire attention à ce genre de détails peut éviter des prises de tête.
Difficile
Exercice : jeu des allumettes (Difficile)
Le principe du jeu des allumettes est simple : - On aligne un nombre d'allumettes prédéfini sur une table. - Tout à tour, les joueurs tirent entre 1 et 3 allumettes. - Le joueur qui tire la dernière allumette a perdu (ou a gagné, a vous de décider). Implantez un jeu des allumettes (7 lignes). Vous pouvez optionnellement "dessiner" les allumettes, mais afficher leur nombre suffit.
Exemple de trace :
Nombre d'allumettes ? 10
Allumettes : 10
Joueur 1 ? 3
Allumettes : 7
Joueur 2 ? 2
Allumettes : 6
Joueur 1 ? 1
Allumettes : 5
Joueur 2 ? 3
Allumettes : 2
Joueur 1 ? 1
Allumettes : 1
Joueur 2 ? 1
Joueur 1 a gagné !
Il ne vous est pas demandé de vérifier que les joueurs joue un nombre d'allumettes valide, mais vous pouvez le faire si vous voulez.
- Commencez par définir la structure du programme avant de coder.
- Vous avez normalement besoin de une seule boucle
- Avec des maths, vous pouvez vous passer de
if
La structure du code doit être comme ça :
# on demande les allumettes
# on selectionne le joueur 1 par défaut
# tant qu'il reste des allumettes
# On affiche les allumettes
# On demande au joueur combien d'allumettes il veut retirer
# On les retire
# On change de joueur
## Si on sort de la boucle, c'est que le joueur courant est le gagnant
# On affiche le joueur
allumettes = int(input("Nombre d'allumettes ? "))
joueur = 1
while allumettes > 0:
print("allumettes : " + str(allumettes))
retrait = int(input("Joueur " + str(joueur) +" ? "))
allumettes = allumettes - retrait
joueur = 3 - joueur # Le complément à 3 de 2 est 1
print("Joueur " + str(joueur) + " a gagné !")
Exploration
Exercice : if sans if (Exploration)
Cet exercice est à titre de curiosité, il vous amènera à produire du code impropre, mais à penser out of the box.
Ecrivez un programme équivalent à celui ci :
Mais sans utiliser deif
.
Ne perdez pas espoir !