Aller au contenu

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 :

Age ? 18
Vous êtes donc majeur(e) !
Enchanté
Age ? 17
Enchanté !
  • 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 !
age = int(input("Age ? "))
if age >= 18 :
    print("Vous êtes donc majeur() !")
print("Enchanté !")

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".

Age ? 18
Majeur
Age ? 17
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 <
age = int(input("Age ? "))
if age >= 18:
    print("Majeur")
if age < 18:
    print("Mineur")

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 :

Age ? 26
Majeur
Age ? 79
Majeur
Et vieux

  • Utilisez deux if successifs.
  • N'oubliez pas la conversion
age = int(input("Age ? "))
if age >= 18:
    print("Majeur")
if age >= 60:
    print("Et vieux")

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 :

Age ? 26
Vous ne seriez pas prof de NSI par hasard ?
Age ? 18
Majeur
Age ? 17
Mineur

  • 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é ==.
age = int(input("Age ? "))
if age == 26:
    print("Vous ne seriez pas prof de NSI par hasard ?")
else :
    if age >= 18:
        print("Majeur")
    else:
        print("Mineur")

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 :

nombre ? 10
Bravo !
nombre ? 111
nombre ? 1
nombre ? 0
nombre ? 5
nombre ? 23049
nombre ? 10
Bravo !
  • 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 !=.
nombre = int(input("nombre ? "))
while nombre != 10:
    nombre = int(input("nombre ?"))
print("Bravo !")
nombre = 0 ##valeur arbitraire qui vérifie != 10 pour rentrer dans la boucle
while nombre != 10:
    nombre=int(input("nombre ? "))
print("Bravo !")

Voilà un exemple d'utilisation de l'instruction pass utilisée dans un code complet. Toutefois, je déconseille de coder dans ce style. Il n'est pas accepté facilement par tout le monde, et peut dérouter ceux qui n'en n'ont pas l'habitude.

while int(input("nombre ? ")) != 10:
    pass
print("Bravo !")

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 :

Départ ? 4
4
3
2
1
0

  • 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
dep = int(input("Départ ? "))
while dep >= 0:
    print(dep)
    dep = dep - 1

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

n1 ? 10
n2 ? 20 
200
  • 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)
On remarque que l'on commence à compter à partir de 0, et qu'on s'arrête à 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.

Cette solution est similaire à la précédente, mais compte les itérations à partir de 1.

n1 = int(input("n1 ?"))
n2 = int(input("n2 ?"))

res = 0 ## on va ajouter "n2 fois" n1 à cette variable
i = 1 
while i <= n2:
    res = res + n1
    i = i + 1
print(res)

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

car ? #
n ? 4
####
####
####
####

  • 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
car = input("car ? ")
n = int(input("n ? "))
i = 0
while i < n:
    print(car * n)
    i = i + 1
car = input("car ? ")
n = int(input("n ? "))
ligne = car * n + "\n"
carre = ligne * n
print(carre)

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 :

op ? *
fois

op ? + 
plus

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 de else
  • 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 !

op = input("op ? ")
if op == "+":
    print("plus")
if op == "-":
    print("moins")
if op == "*":
    print("fois")

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

op ? /
operation inconnue

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 :

if op != "+" and op != "-" and op != "*":
    print("operation inconnue")

Ce qui donne le programme complet :

op = input("op ? ")    
if op == "+":
    print("plus")
if op == "-":
    print("moins")
if op == "*":
    print("fois")
if op != "+" and op != "-" and op != "*":
    print("operation inconnue")

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'un else et de deux elif.
  • La condition finale sera le else.
  • En dehors du else, il y a très peu de changement à faire.
op = input("op ? ")    
if op == "+":
    print("plus")
elif op == "-":
    print("moins")
elif op == "*":
    print("fois")
else:
    print("operation inconnue")

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 :

n1 ? 10
op ? +
n2 ? 30
10 + 30 = 40
n1 ? 20
op ? /
n2 ? 30
10 / 30 = operation inconnue
  • 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.

n1 = int(input("n1 ? "))
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))

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 :

n1 ? 10
op ? **
op ? -- 
op ? *
n2 ? 22
10 * 22 = 220

Autre exemple de trace possible (Exploration) :

n1 ? 10
op ? **
n2 ? 22
op ? --
op ? *
10 * 22 = 220

  • 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
n1 = int(input("n1 ? "))
op = input("op ? ")    
##insérez votre boucle de vérification ici
n2 = int(input("n2 ? "))
... ##la suite du code n'est pas montrée, car pas nécessaire de la modifier

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 " + joueur  +" ? "))
    allumettes = allumettes - retrait
    if joueur == "1":
        joueur = "2"
    else :
        joueur = "1"
print("Joueur " + joueur + " a gagné !")
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 :

a = int(input("a ? "))
if a < 10 : 
    print("a < 10")
Mais sans utiliser de if.

Ne perdez pas espoir !

a = int(input("a ? "))
stop = False #pour faire un seul tour de boucle
while a < 10 and not stop : 
    print("a < 10")
    stop = True