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