1 Instructions conditionnelles : la structure if

publicité
Lycée Roland Garros - BCPST 1
TP INFO n
o 3.
Informatique
Boucles
if, while
et
for
Sauf mention explicite, les instructions d'un programme s'exécutent les unes
après les autres, dans l'ordre où elles ont été écrites à l'intérieur du script. Les
boucles if, while et for ont pour eet de modier cette lecture linéaire du
script par Python.
1
Instructions conditionnelles : la structure
if
EXPERIENCE Dans la fenêtre principale, tapez les deux exemples suivants, puis analyser
(touche Tab pour faire un alinéa).
I a=2
I if a==2:
a=a+1
I print(a)
I a=3
I if a==2:
a=a+1
I print(a)
Vous l'aurez compris, la construction suivante :
I if [condition]:
....
....
[bloc d'instructions]
....
....
permet de demander à Python d'exécuter le bloc d'instructions uniquement si
la condition prescrite est vériée.
La condition qui suit le mot if est une valeur de type booléen. Au moment de rentrer dans la structure if,
• si cette valeur est True alors Python exécute le bloc d'instructions
puis sort de la structure if,
• si cette valeur est False, alors Python saute le bloc d'instructions
en ignorant ce qu'il contient.
1
Remarques
1) La ligne d'en tête doit obligatoirement se terminer par le symbole :
2) Les lignes qui constituent le bloc d'instructions, c'est-à-dire le corps de
la boucle if, doivent toutes être indentées d'1 alinéa (= 4 espaces) par
rapport à la ligne d'en tête.
Dans l'éditeur, les alinéas se font automatiquement à moins d'avoir oublié
le symbole : mais ce n'est pas le cas dans le shell où ils doivent être
tapés manuellement.
La plupart du temps, les boucles if feront partie d'une fonction qu'on aura
écrite dans un script, avec l'éditeur. Créez par exemple la fonction suivante
dans un nouveau chier TP3.py, puis testez-la.
def test_de_parite(n):
if n%2==0:
# Rappeler ce que fait l'operation %
print('ce nombre est pair')
if n%2==1:
print('ce nombre est impair')
Les mots-clé else et elif
Les mots-clé else et elif (sinon et sinon si ) permettent de donner des
instructions à Python dans des cas alternatifs, c'est à dire si la condition de
l'en-tête n'est pas vériée.
Entrez par exemple la fonction suivante puis testez-la avec n=12, avec n=6
puis n=9. Analyser.
def pingu(n):
if n%4==0:
print('ce nombre est divisible par 4')
elif n%2==0:
print('ce nombre est divisible par 2 mais pas par 4')
else:
print('ce nombre n est divisible ni par 4 ni par 2')
Exercice 1
Racines d'un polynôme Créer une fonction qui prend en argument trois coecients a, b, c, et ache
un message donnant les racines réelles du polynôme P = aX 2 + bX + c.
Attention, il faut distinguer plusieurs cas !
Exemple.
La commande racines(1,2,1) ache :
une seule racine x=-1
2
2
Boucles de répétition -
while
EXPERIENCE Dans la fenêtre principale, rentrez l'exemple suivant puis analyser.
I a=1
I while a<1000:
a=2*a
I print(a)
Vous l'aurez compris, la construction suivante :
I while [condition]:
....
....
[bloc d'instructions]
....
....
permet de demander à Python d'exécuter le bloc d'instructions tant que la
condition prescrite est vériée.
La condition qui suit le mot while est une valeur de type booléen. Au
moment de rentrer dans la boucle while,
• si cette valeur est True, alors Python exécute le bloc d'instructions
puis retourne à la ligne d'en-tête pour retester la condition.
• si cette valeur est False, alors Python sort de la boucle.
Remarques
1. Comme pour if, la ligne d'en tête doit se terminer par : et le
bloc d'instructions doit être indenté d'1 alinéa par rapport à la ligne
d'en-tête.
2. Danger : rester enfemé dans une boucle while.
Il peut arriver que la condition d'en tête dans une boucle while soit
indéniment vraie. Dans ce cas Python ne sort jamais de la boucle, le
programme mouline et ne terminera jamais. C'est donc une erreur de
programmation à éviter. Exemple ∗ :
I a=2
I while a>0:
a=a+3
print(a)
∗.
Astuce :
Ctrl+I
permet d'interrompre Python !
3
Comme pour if, les boucles while s'utilisent le plus souvent à l'intérieur de
fonctions écrites dans l'éditeur. Voici deux exercices pour mettre en pratique
l'utilisation de while.
Exercice 2
L'âge de Bob Dylan 1. Créer une fonction agedebob qui demande à l'utiliseur de taper l'âge de
Bob Dylan † , jusqu'à ce que cet utilisateur ait donné la bonne réponse.
2. Améliorez cette fonction pour qu'elle renvoie les messages : plus vieux /
plus jeune / Gagné.
3. Améliorez encore cette fonction pour qu'il y ait trois tentatives maximum.
Game Over s'ache si trois mauvaises réponses sont données.
4. Faites une variante : deux joueurs s'arontent, donnent des réponses à tour
de rôle (la machine répond plus vieux/moins vieux) et le jeu s'arrête lorsque
la bonne réponse est donnée.
Exercice 3
Introduction à la notion de série 1. Soit (un )n≥1 la suite dénie par
1
1
1
un = 1 + √ + √ + · · · + √ .
n
2
3
Justier que (un ) est croissante. Faire une fonction suite_u(K) qui ache tous
les termes de la suite u jusqu'au premier terme qui dépasse la valeur K . Tester
pour K = 10, K = 100.
2. Même question pour la suite (vn )n≥1 dénie par
vn = 1 +
1
1
1
+
+
·
·
·
+
.
22 32
n2
Tester pour K = 1.6, pour K = 2. Que se passe t-il ? Comment expliquer ça ?
3
Boucles de parcours -
for
EXPERIENCE Dans la fenêtre principale, rentrez l' exemple suivant puis analyser.
I S=0
I for i in range(1,10):
S=S+i**2
print("somme des ",i, " premiers carres = ",S)
†.
Bob Dylan a 74 ans comme chacun sait.
4
Deuxième exemple :
I for x in 'bonjour':
print('*'+3*x+'*')
Vous l'aurez compris, la construction suivante :
I for x in [sequence]:
....
....
[bloc d'instructions]
....
....
permet de demander à Python d'eectuer les tâches du bloc d'instructions,
pour une variable x parcourant chacune des valeurs de la séquence
donnée. La séquence peut être de type list ou bien str (ou du type range,
en tout cas quelque chose qui peut être parcouru !)
Remarques
1. La ligne d'en tête se termine par : et le bloc d'instructions doit être
indenté de 4 espaces par rapport à la ligne d'en-tête.
2. Quand Python rentre dans la boucle, il va eectuer le bloc d'instructions
autant de fois qu'il y a d'éléments dans la séquence, avec la variable x
prenant successivement les valeurs contenues dans cette séquence.
3. Il est possible que le bloc d'instructions ne dépende pas de la valeur de
x. Autrement dit Python eectue simplement N fois la même tâche (N
étant la longueur de la séquence). Exemple :
I for i in range(1,10):
print("Salut")
Exercice 4
Une suite récurrente linéaire d'ordre 2
Créer une fonction suiterec(N) qui ache les N premiers termes de la suite
dénie par


u0 = 0,
u1 = 1,


∀n ∈ N, un+2 =
un+1 +un
2
1. A l'aide de votre fonction, émettre une conjecture sur la convergence de la
suite (un ).
2. Prouver cette conjecture par le calcul en utilisant la méthode de cours pour
exprimer un en fonction de n.
5
Exercice 5
Codage/décodage numérique 1. Créer une liste alphabet de taille 27 qui contient dans l'ordre
les 26 lettres de l'alphabet,
le caractère espace.
Soyez astucieux, cela ne doit pas prendre plus de 20 secondes.
2. Comment calculer avec Python
le caractère associé à un numéro ?
le numéro associé à un caractère ?
3. Créer une fonction decodage qui décode un message numérique.
Exemple.
La commande decodage([1,3,5,27,2,4,6]) renverra 'ace bdf'
4. Créer de même une fonction codage qui code un message selon ce même
code.
Exemple.
La commande codage('bcpst c cool') renvoie [2, 3, 16, 19,
20, 27, 3, 27, 3, 15, 15, 12]
5. Vériez que pour tout message C, la commande decodage(codage(C)) ren-
voie C.
Exercice 6
Codage/décodage de César 1. Dans le fameux code de César, chaque lettre est remplacée par la suivante
dans l'alphabet, le z étant remplacé par a. Les caractères non alphabétiques
(espaces, ponctuation) sont laissés inchangés.
Créez une fonction codage_cesar qui code un message selon ce principe.
codage_cesar('demain, il fera beau') doit renvoyer 'efnbjo,
jm gfsb cfbv'.
Exemple.
2. De la même façon, créez une fonction decodage_cesar qui décode un message secret.
decodage_cesar('efnbjo, jm gfsb cfbv') doit renvoyer 'demain,
il fera beau'.
Exemple.
3. Chasse au trésor. Décodez le message du chier messagesecret.txt
distribué au début de l'année.
6
4
Exercices de synthèse
Exercice 7
Suite récurrente Ecrire un programme suiterecurrente(n) qui calcule le n-ème terme de la
suite dénie par
(
u0 = 1/2,
√
un+1 = 1 + un .
1. En utilisant votre fonction, la suite (un ) vous semble t-elle convergente ?
2. En admettant qu'elle le soit, calculer la valeur de cette limite. Vérier que
la valeur trouvée est en accord avec l'observation de la question 1.
Exercice 8
Table de multiplication Ecrire une fonction table(n) qui ache la table de multiplication de l'entier n jusqu'au dernier résultat qui n'excède pas 100.
Si la valeur rentrée n'est pas un nombre entier, la fonction devra renvoyer un
message d'erreur du genre "He ho j avais demande un entier !"
Exercice 9
Calcul de la suite harmonique 1. Ecrire une fonction H(n) qui renvoie la valeur de
1 1
1
+ + ··· +
2 3
n
2. Vérier que pour n très grand, Hn est assez proche de ln(n). Comment
expliquer ça intuitivement ? Comment se comporte Hn − ln(n) ?
Hn = 1 +
Exercice 10
Nombres premiers 1. Écrire une fonction premier(n) qui ache "n est premier" si n est pre-
mier, et ache la liste de ses diviseurs dans le cas contraire.
2. Écrire une variante premier_bis(n) qui se contente de renvoyer True ou
False selon si n est premier ou non.
3. Écrire une fonction somme_prem(N) qui calcule la somme de tous les nombres
premiers inférieurs ou égaux à N.
4. Écrire une fonction somme_prem2(N) qui calcule la somme des N premiers
nombres entiers.
Exercice 11
Sommes de multiples Pouvez-vous calculer la somme des nombres entre 1 et 1000 qui sont soit multiples de 5 soit multiples de 7 ?
7
Exercice 12
Algorithme de dichotomie 1. Ecrire un programme dicho(prec)
√ qui calcule par l'algorithme de dichoto-
mie une valeur approchée de a = 3 5 avec une précision donnée par prec. On
rappelle que a est par dénition la racine de la fonction f (x) = x3 − 5.
Exercice 13
Nombres palindromes Un nombre palindrome est un nombre qui se lit de la même manière dans
les deux sens. Le plus grand palindrome qui soit un produit de deux nombres
à 2 chires est :
9009 = 91 × 99
Pouvez-vous trouver le plus grand palindrome qui soit un produit de deux
nombres à 3 chires ?
Exercice 14
Plus grands produits dans une liste Dans la série suivante, les quatre chires adjacents qui ont le plus grand produit sont 9 × 9 × 8 × 9 = 5832.
Dans cette même liste (chier sequence_chiffres.txt), trouvez les 13
chires adjacents qui ont le plus grand produit puis acher ce produit.
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
821663704844031 9989 0008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
: Commencez par créer une fonction qui calcule le produit des
nombres d'une liste.
Indication
8
5
Pour aller plus loin
Exercice 15
Chercher le meilleur chemin
Voici un triangle de nombres. Pour chaque chemin du haut vers le bas on
considère la somme des nombres le long du chemin. Trouver la valeur maximale de cette somme.
75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 91 52 97 51 14 13
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
La triangle pourra être représenté par une liste de listes de nombres (chier
triangle.txt à copier-coller).
Exercice 16
Se méer des conjectures !
Christian Goldbach (16901764) a conjecturé que tout entier impair non premier peut s'écrire comme la somme d'un entier premier et du double d'un
carré.
En eet on peut vérier cette conjecture sur les premiers entiers impairs non
premiers :
9 = 7 + 2 × 12 ,
25 = 7 + 2 × 32 ,
15 = 7 + 2 × 22 ,
27 = 19 + 2 × 22 ,
21 = 3 + 2 × 32 ,
33 = 31 + 2 × 12
Mais cette conjecture s'est avérée fausse. Si Python avait existé à l'époque
de Goldbach, il s'en serait probablement aperçu très vite.
Question. Quel est le plus petit nombre qui constitue un contre-exemple à
cette conjecture ? Quel est le suivant ? Puis les suivants ?
9
. Une autre conjecture plus célèbre de Goldbach dit que
Remarque
tout nombre entier pair supérieur à 3 peut s'écrire comme la somme de deux
nombres premiers.
Cet énoncé n'est pour l'heure ni démontré ni inrmé. C'est un des problèmes
les plus célèbres des mathématiques modernes.
10
Téléchargement