TP - Chapitre 2 : Langage de programmation Python

N.B. Niveau : Première Générale, enseignement de spécialité NSI (Numérique et Sciences Informatiques)

Chapitre 3 - Les boucles

Une boucle permet d'exécuter une portion de code plusieurs fois de suite.

L'instruction while

Syntaxe :

while (expression): # ne pas oublier le signe de ponctuation ':'
bloc d'instructions # attention à l'indentation
# suite du programme

Si l'expression est vraie (True) le bloc d'instructions est exécuté, puis l'expression est à nouveau évaluée.
Le cycle continue jusqu'à ce que l'expression soit fausse (False) : on passe alors à la suite du programme.

Exemple : un script qui compte de 1 à 4

# script Boucle1.py
# initialisation de la variable de comptage
compteur = 1
while compteur<5:
# ce bloc est exécuté tant que la condition (compteur<5) est vraie
print (compteur, compteur<5)
compteur += 1 # incrémentation du compteur, compteur = compteur + 1
print ("Fin de la boucle")
>>>
1 True
2 True
3 True
4 True
Fin de la boucle

Table de multiplication par 8 :

# script Boucle2.py
compteur = 1 # initialisation de la variable de comptage
while compteur<=10:
# ce bloc est exécuté tant que la condition (compteur<=10) est vraie
print (compteur, '* 8 =', compteur*8)
compteur += 1 # incrémentation du compteur, compteur = compteur + 1
print ("Et voilà !")
>>>
1 * 8 = 8
2 * 8 = 16
3 * 8 = 24
4 * 8 = 32
5 * 8 = 40
6 * 8 = 48
7 * 8 = 56
8 * 8 = 64
9 * 8 = 72
10 * 8 = 80
Et voilà !

Affichage de l'heure courante :

# script Boucle3.py
import time # importation du module time
quitter = 'n' # initialisation
while quitter != 'o':
# ce bloc est exécuté tant que la condition est vraie
# strftime() est une fonction du module time

print ('Heure courante ',time.strftime('%H:%M:%S'))
quitter = input('Voulez-vous quitter le programme (o/n) ? ')
print ('A bientôt')
>>>
Heure courante 09:48:54
Voulez-vous quitter le programme (o/n) ?
n
Heure courante 09:48:58
Voulez-vous quitter le programme (o/n) ?
o
A bientôt

L'instruction for

Syntaxe :

for (élément) in (séquence) :
bloc d'instructions
# suite du programme

Les éléments de la séquence sont issus d'une chaîne de caractères ou bien d'une liste.

# script Boucle4.py
chaine = 'Bonsoir'
for lettre in chaine: # lettre est la variable d'itération
print (lettre)
print ('Fin de la boucle')

La variable lettre est initialisée avec le premier élément de la séquence ('B').
Le bloc d'instructions est alors exécuté.
Puis la variable lettre est mise à jour avec le second élément de la séquence ('o') et le bloc d'instructions à nouveau exécuté...
Le bloc d'instructions est exécuté une dernière fois lorsqu'on arrive au dernier élément de la séquence ('r') :

>>>

B
o
n
s
o
i
r
Fin de la boucle

Un autre exemple avec une liste :

# script Boucle5.py
liste = ['Pierre',67.5,18]
for element in liste:
print (element)
print ('Fin de la boucle')

Là, on affiche dans l'ordre les éléments de la liste :

>>>
Pierre
67.5
18
Fin de la boucle

L'association avec la fonction range() est très utile pour créer des séquences automatiques de nombres entiers :

# script Boucle6.py
print (list(range(1,5)))
for i in range(1,5):
print (i)
print ('Fin de la boucle')
>>>
[1, 2, 3, 4]
1
2
3
4
Fin de la boucle

La création d'une table de multiplication paraît plus simple avec une boucle for qu'avec une boucle while :

# script Boucle7.py
for compteur in range(1,11):
print (compteur, '* 9 =', compteur*9)
print ('Et voilà !')
>>>
1 * 9 = 9
2 * 9 = 18
3 * 9 = 27
4 * 9 = 36
5 * 9 = 45
6 * 9 = 54
7 * 9 = 63
8 * 9 = 72
9 * 9 = 81
10 * 9 = 90
Et voilà !

L'instruction break

L'instruction break provoque une sortie immédiate d'une boucle while ou d'une boucle for.

Dans l'exemple suivant, l'expression True est toujours ... vraie : on a une boucle sans fin.
L'instruction break est donc le seul moyen de sortir de la boucle :

# script Boucle8.py
import time # importation du module time
while True:
# strftime() est une fonction du module time
print ('Heure courante ',time.strftime('%H:%M:%S'))
quitter = input('Voulez-vous quitter le programme (o/n) ? ')
if quitter == 'o':
break
print ('A bientôt')
>>>
Heure courante 14:25:12
Voulez-vous quitter le programme (o/n) ?
n
Heure courante 14:25:20
Voulez-vous quitter le programme (o/n) ?
o
A bientôt

Astuce

Si vous connaissez le nombre de boucles à effectuer, utiliser une boucle for.
Autrement, utiliser une boucle while (notamment pour faire des boucles sans fin).

Exercices

Exercice 3.1 ★ Modifier le programme du chapitre 1 qui permettait de convertir un nombre décimal en bainaire

# convertir un nombre décimal en binaire

n=float(input("nombre décimal compris entre 0 et 1"))
b=''

n=n*2
b=b+str(int(n))
n=n-int(n)

Il fallait répéter autant de fois les 3 dernières lignes pour obtenir le résultat sur 8 ou 16 bits.

Ajouter une boucle for permettant d'afficher le résultat sur 16 bits

Faire valider le script par le professeur

Exercice 3.2 ★ 

Ecrire un programme qui calcule la moyenne d'une série de notes stockée dans un tableau notes=[13,14.5,11,5].
On pourra utiliser l'instruction len(notes) qui renvoie le nombre de notes contenues dans le tableau.

Résultat :

>>>
Moyenne : 13.0
>>>

Au début du programme précédent, demander à l'utilisateur de saisir une note au clavier, ajouter cette nouvelle note dans la liste de notes avec l'instruction notes.append(note) et afficher la moyenne de toutes ces notes.

Résultat :

>>>
Entrer votre note : 15
Moyenne : 13.5
>>>

Faire valider le script par le professeur

Exercice 3.3 ★
1) Avec une boucle for, écrire un script qui compte le nombre de lettres s dans une chaîne de caractères.
Par exemple :

>>>
Entrer la chaîne : Neymar da Silva Santos
Résultat : 3

Exercice 3.4 ★ Ecrire le programme de rendu de monaie dont l'algorithme est donné ci-dessous :

pieces <- [5,2,1] 
M <- montant à rendre en Euros
i <- 0
Tant que M>0
NbrPieces <- division entière de M par pieces[i]
si NbrPieces > 0
Afficher le nombre de pièces et la pièce
M <- M modulo
pieces[i]
fin si
i <- i+1
Fin tant que

Exercice 3.5 ★ Ecrire un script qui calcule la moyenne des notes obtenues contenues au bac , la note la plus élevée et la plus basse contenue dans le fichier csv suivant : notes.csv. Enregistrez ce fichier au même endroit où vous allez sauvegarder le programme python. Ouvrir ce fichier avec un tableur pour voir son contenu. Vérifier avec le tableur qu'il y a bien 323 élèves

import csv 
with open("notes.csv",'r') as fichier: # Ouvre le fichier csv en lecture
contenu = csv.reader(fichier,delimiter=';') # lit le fichier csv en séparant les champs
Liste=list(contenu) # Tranforme le contenu en liste
fichier.close() # ferme le fichier
print ("La Liste contient",len(Liste)-1,"élèves") # affiche le nombre d'élèves
print(Liste[1][0],Liste[1][1],Liste[1][2],round(float(Liste[1][3]),1))

Résultat final :

>>>
La Liste contient 323 élèves
moyenne de tous les élèves : 11.29
La note la plus faible : 2.08
La note la plus élevée : 20.0
7 élèves se prénomment Lucas

>>>

Faire valider le script par le professeur

Exercice 3.6 ★☆
1) Ecrire le script du jeu de devinette suivant :

>>>
Le jeu consiste à deviner un nombre entre 1 et 100 :

--->
50
trop petit !
--->
75
trop petit !
--->
87
trop grand !
--->
81
trop petit !
--->
84
trop petit !
--->
85
Gagné en 6 coups !

Remarque : pour créer un nombre entier aléatoire entre 1 et 100 :

import random
nombre = random.randint(1,100) # nombre prendra une valeur entière entre 1 et 100

2) Quelle est la stratégie la plus efficace ?

3) Montrer que l'on peut deviner un nombre en 7 coups maximum.

Bibliographie : La dichotomie

Faire valider le script par le professeur

Exercice Bonus ★☆

Ecrire un programme qui transforme un fichier codé au format UTF-8 en un fichier codé au format ISO-8859-1

Par un clic droit de souris, enregistrez le fichier utf-8.html dans le dossier de votre programme. Ouvrir le fichier avec un navigateur pour vérifier si les caractères s'affichent correctement.

Editer ce même fichier avec le bloc-note ou notepad++ et remplacer la ligne <meta charset="utf-8"> par <meta charset="ISO-8859-1"> et enregistrer le fichier sous iso-8859.html

Ouvrir ce fichier avec un Navigateur Internet pour visualiser les erreurs d'affichage.

Coller les lignes suivantes permettant de lire le fichier iso-8859.html, puis exécuter-le.

import binascii
fichier=open("utf8.html","rb") # ouverture du fichier utf-8
data = binascii.hexlify(fichier.read()) # Lecture du fichier en hexadécimal
fichier.close() # fermeture
print (data)

En parallèle, exécuter le programme suivant : Hxd.exe et ouvrir le fichier iso-8859.html puis comparer les codes lus par python et le logiciel.  On remarque que les caratères accentués commencent par C3et sont codés sur 2 octets, le caratère spécial commence par C2.

En appliquant l'algorithme du cours du chapitre2, compléter le code ci-dessous :

# Programme permettant de convertir du code UTF-8 en code ISO-8859-1

import binascii
fichier=open("iso-8859.html","rb") # ouverture du fichier utf-8
data = binascii.hexlify(fichier.read()) # Lecture du fichier en hexadécimal fichier.close() # fermeture du fichier
# créer une liste code, contenant le code ASCII des caractères transformé en décimal

code=[int(data[i:i+2],16) for i in range(0,len(data),2)]

Début de l'algorithme à implanter:
initialiser i<-0
initialiser ISO<-[]
Tant que i est inférieur à la longueur du code faire :
si code[i] > 0x7F faire : # caractères spéciaux et accentués
stocker dans une variable h : code[i]
si h=0xC3 alors :
stocker dans une variable l : code[i+1]
Masquer le quartet de poids faible de h (0xF0)
faire un ou logique avec l (symbole | alr Gr 6)
ajouter le résultat à la liste ISO
incrémenter i
fin si
si h=0xC2 alors:
incrémenter i # permet de pointer l'octet suivant
ajouter code[i] à la liste ISO
fin si
sinon
ajouter code[i] à la liste ISO
fin sinon
incrémenter i
Fin Tant que Fin de l'algorithme

# Ecriture du fichier iso.html
fichier=open("ISO.html","w")
for i in ISO:
fichier.write(chr(i))
fichier.close()

Après exécution, le fichier ISO.html devrait afficher les bons caratères, codés au format ISO-8859-1