• Aucun résultat trouvé

TP3 - Boucle for, listes, boucle while

N/A
N/A
Protected

Academic year: 2022

Partager "TP3 - Boucle for, listes, boucle while"

Copied!
7
0
0

Texte intégral

(1)

I - Pratique des listes 1

TP3 - Boucle for, listes, boucle while

Vous devrez ramener pour les TPs suivants l’Aide Mémoire Turtle qui est fourni !

I - Pratique des listes

À partir de vos révisions (cours, mémento, documentation Python…) comme indiqué à la fn du TP2, répondez aux questions suivantes en écrivant les instructions nécessaires, que vous testerez dans le Shell Python (mode calculatrice) — recopiez les bonnes réponses dans votre document de TP pour pouvoir vous y référer ultérieurement (TPs suivants, révisions DS, partiel TP…).

Vous devez absolument être capable de faire les opérations notées Ψ seuls !

1) Opérations de base

On donne une liste elts = ['eau', 'air', 'feu', 'terre', 'esprit', 'espace']

Ψ Qel est le nombre d’éléments de cete liste (en utilisant bien sûr la fonction qui vous le fournit) ?

Ψ Qel est l’index du premier élément de cete liste ?

Ψ Qel est l’index du sixième élément de cete liste ?

Ψ Qel est l’index du dernier élément quelque soit la longueur de la liste ?

Ψ Comment récupérer la valeur du cinquième élément dans cete liste ?

Ψ Comment modifer la valeur du cinquième élément dans cete liste par 'conscience' ?

Ψ Comment trouver l’index de la valeur 'terre' dans cete liste ?

Comment supprimer la valeur située à l’index 2 dans cete liste ?

Ψ Comment insérer la valeur 'ignescence' à l’index 2 dans cete liste ?

Ψ Comment ajouter la valeur 'bois' à la fn de cete liste (sans se préoccuper de sa longueur) ?

Comment ajouter en une seule fois les valeurs de la liste ['métal','roche'] à la fn de cete liste (sans se préoccuper de sa longueur) ?

Ψ Comment récupérer et supprimer en une seule opération la valeur située à l’index 3 dans cete liste ?

(2)

2 I - Pratique des listes

On va fabriquer une liste lst et travailler dessus.

Ψ Comment fabriquer une liste lst des entiers de 10 à 1000 (compris) par pas de 5 ?

Ψ Comment extraire de lst une liste qui contienne uniquement les éléments d’index pair ?

Comment remplacer les éléments de lst situés aux index 12 à 20 compris (tranche 12 à 21) par la séquence de trois éléments [0,1,2] en une seule expression ?

Ψ Comment créer une liste de chaînes représentant les valeurs fotantes issues d’une liste quelconque conte- nant des nombres fotants (algo à construire ou expression en compréhension) ?

Par exemple : [3.4,8.9,1.2,-7.3]['3.4','8.9','1.2','-7.3']

Comment supprimer toutes les occurrences d’une valeur particulière dans une liste existante (algo à construire, la liste existante doit être modifée) ?

Ψ Comment créer à partir de lst une nouvelle liste ne contenant que les valeur de lst qui sont multiples de 6 (algo à construire ou expression en compréhension) ?

2) Mutabilité des listes

Dans le Shell Python, construisez une liste l1 contenant les entiers de 1 à 12 compris. Afectez ensuite cete liste à une seconde variable l2 : l2=l1. Modifez des éléments contenus dans la liste l1, puis afchez l1 et l2. Qe constatez-vous ?

La fonction standard id() de Python permet de connaître l’identité d’une valeur1 — litérale ou associée à une variable. Afchez id(l1) et id(l2), que remarquez-vous ?

Ψ De quels moyens disposez-vous pour dupliquer le contenu d’une liste ?

Dans le Shell Python, construisez une liste l3 qui est une copie de l1. Afchez id(l3), que remarquez- vous ?

Modifez à nouveau des éléments de la liste l1, puis afchez l1 , l2 et l3. Qe constatez-vous ?

1 - Note : toute valeur est un objet en Python (son type est sa classe) et a une « identité » ; en CPython c’est simplement son adresse en mémoire. Pour certaines valeurs immutables très utilisées (les entiers négatifs et positifs autour de 0 par exemple), elles sont créées une fois pour toutes et réutilisées afn de gagner du temps, on peut donc retrouver les mêmes identités.

(3)

II - “Tableau” à 2 dimensions et graphique 3

II - “Tableau” à 2 dimensions et graphique

Nous allons reprendre le calcul d’IMC de l’exo 10 du TP1. Pour cela un module Python calculimc.py vous est fourni avec ce TP, qui contient deux fonctions :

calcul_imc(poids,taille), qui retourne la valeur numérique de l’IMC (poids en Kg, taille en cm)

classe_imc(imc), qui en fonction de la valeur de l’IMC retourne une chaîne correspondant à la classi- fcation.

Nous désirons construire une carte de couleurs avec les tailles en abscisse et les poids en ordonnée, la couleur correspondant à la valeur de l’IMC pour chaque couple (poids, taille). Nous prendrons des tailles de 140 cm à 210 cm et des poids de 40 Kg à 140 Kg, avec des pas de 1Kg pour les poids et 1cm pour les tailles.

Pour la partie graphique, nous allons faire appel au module matplotlib déjà utilisé au TP précédent. Nous allons nous inspirer d’un exemple2 trouvé sur la galerie de matplotlib, dont une version adaptée est fournie avec ce TP dans le fchier module TP3_carto.py. Cete version montre entre autre comment construire correc- tement les valeurs pour les axes des abscisses et des ordonnées, et comment modifer la chaîne afchée en bas de la fenêtre lorsque la souris survole la fgure. Vous pourrez copier/coller et adapter le code nécessaire pour construire votre programme.

Créez votre module Python TP3cartoimc.py dans votre répertoire personnel du TP3. Recopiez le fchier module calculimc.py à côté de votre module (pour qu’il puisse facilement être importé).

Dans votre module, commencez par importer les fonctions de calculimc dont vous aurez besoin.

Défnissez les variables globales constantes (donc en majuscules : PMIN, PMAX, TMIN, TMAX) correspondant aux limites en poids et en taille de la carte que l’on veut tracer (et bien sûr, vous utiliserez ces constantes dans votre programme).

Créez une table des valeurs à deux dimensions3 (poids pour la première dimension (“lignes”) et taille pour la seconde dimension (“colonnes”)) dans laquelle les valeurs stockées correspondront aux IMC calculés pour les poids et tailles correspondants.

En reprenant et en adaptant le code de TP3_carto.py, tracez la cartographie des IMC sur les plages défnies par les limites.

En adaptant la fonction format_coord(), faites qu’elle retourne une chaîne indiquant la taille, le poids, l’IMC, avec leurs unités, ainsi que le texte de la classifcation de l’IMC.

Dans cet exercice, vous aurez vu comment construire une liste de listes, utilisable comme un tableau à deux dimensions ou une matrice4, et comment réutiliser et adapter un code existant pour répondre facilement à un besoin.

III - Boucles while

1) Suivi d’exécution

On redonne le programme suivant (issu du TD) :

1. n = 0 2. s = 0

3. while s <= 100:

4. n = n + 1 5. s = s + n **2 6. print(n, n**2, s) 7. print(n)

En utilisant le débogueur dans l’environnement Pyzo (comme montré au TP précédent), exécutez cete boucle en pas à pas et observez les évolutions des valeurs, vérifez que cela donne ce qui était atendu en TD.

2 - htp://matplotlib.org/examples/api/image_zcoord.html

3 - En bref, une liste de listes, comme dans l’exemple, sauf que là vous construisez les listes à partir de boucles.

4 - Le module de calcul numpy (non compris en standard) fournit des services avancés sur les calculs matriciels.

(4)

4 III - Boucles while

2) Limites de calcul flotants

On rappelle que les nombres fotants sont représentés sur un nombre fxe de bits5, avec une partie mantisse donnant une valeur de base et une partie exposant donnant un exposant signé qui permet de décaler la virgule dans cete mantisse. Ces deux parties sont bien sûr codées en représentation binaire. Un bit spécifque code le signe du nombre.

On donne le code suivant :

1. epsilon = 1.0

2. while epsilon + 10 > 10 : 3. epsilon = epsilon/2 4. print(epsilon)

À la lecture du code, si besoin avec l’aide d’un tableau de suivi, indiquez à quoi devrait-on s’atendre lors de l’exécution ?

Recopiez das votre répertoire du TP3 le fchier module TP3_epsilon.py fourni. Il contient le code ci-dessus, exécutez-le, que se passe-t-il (notez la valeur fnale afchée de epsilon) ?

Modifez la condition de la boucle while avec les expressions logiques suivants, ré-exécutez et notez les valeurs fnales de epsilon.

epsilon+1>1

epsilon+0.5>0.5

epsilon+0.1>0.1

epsilon>0

Qe remarquez vous lorsque vous essayez l’expression 0.1**10 dans le Shell Python ? Lorsque vous faites le calcul de l’expression 1e32+1-1e32 ?

La variable float_info du module standard sys fournit des informations concernant les nombres à virgule fotante sur votre version de Python :

>>> import sys

>>> print(sys.float_info)

À noter : à partir de Python 3.5 le module math de Python fournit une fonction isclose() qui permet de tester si deux nombres fotants sont égaux à une tolérance près (absolue ou relative).

3) Break et continue

Note : ces deux instructions sont utilisables avec les boucles for et avec les boucles while.

a) Passage au break…

On redonne un exercice du TD3 (recherche dans une liste de chaînes, sans utiliser find() ni break), dont une solution est fournie dans le fchier TP3_ouestpaul.py. Recopiez ce fchier dans votre répertoire de TP3.

1. lst = ["youssef", "pierre", "paul", "jacques", "est", "ce", "que", "tu", "es", "là"]

2. i = 0

3. while i<len(lst) and lst[i] != "paul":

4. i = i + 1 5. if i == len(lst):

6. print(i) 7. else:

8. print(-1)

Modifez ce programme afn de déplacer la condition dans le corps de la boucle et d’utiliser une instruction

break lorsque le prénom « paul » a été trouvé. Suivez son exécution en pas à pas avec le débuger.

5 - Dans la plupart des langages, y-compris Python, les nombres fotants double précision sont stockés en utilisant 64 bits (8 octets).

(5)

III - Boucles while 5

b) Cas inintéressants

À la suite du script précédent, ajoutez une boucle for qui parcours l’ensemble de la liste lst et afche à chaque itération des versions de la chaîne concernée avec les méthodes upper(), title() et capitalize()

Excluez de l’afchage les chaînes qui ne contiennent pas de "e" une utilisant une instruction continue condi- tionnelle bien placée. L’instruction d’afchage doit être au niveau du bloc d’instructions de la boucle for.

IV - Travail personnel à rendre

N’oubliez pas l’en-tête dans les fchiers module Python que vous créez (avec le bon nom de fchier, date, nom d’au- teur), ainsi que la recopie à la fn du fchier des traces d’exécution dans des chaînes de caractères triple-guillemets.

Et là où il y a besoin… des #commentaires.

1) Validation oui/non

Rappel : pour éviter tout problème, vous devez metre des expressions logiques booléennes autour des opérateurs logiques and et or, et utiliser des parenthèses en cas de doute sur la priorité des opérateurs.

Créez un fchier TP3ouinon.py dans votre répertoire du TP3

Écrivez un programme qui pose une question à l’utilisateur à laquelle il doit répondre par une saisie de la letre

o (pour oui) ou de la letre n (pour non). Tant que l’utilisateur n’a pas répondu par une de ces deux letres (en minuscule ou en majuscule), répéter la demande et la saisie.

Lorsque l’utilisateur a terminé par une saisie valide, afchez "très bien" s’il a saisi la letre o et "tant pis"

s’il a saisi la letre n.

2) Vérifications de saisie des côtés triangle

Créez un fchier TP3tricote.py dans votre répertoire du TP3

Écrivez un programme qui demande à l’utilisateur de saisir les longueurs (nombres fotants) des trois cotés d’un triangle et qui refasse une nouvelle saisie de ces trois valeurs tant que ces valeurs ne correspondent pas à un triangle possible (la longueur du plus grand côté doit être inférieure ou égale à la somme des deux autres côtés). L’utilisateur doit pouvoir saisir les trois longueurs dans n’importe quel ordre.

3) Divination numérique

Créez un fchier TP3divination.py dans votre répertoire du TP3

La fonction randrange(a,b) du module random renvoie au hasard un entier compris entre a inclus et b exclus.

Écrire un programme pour :

• Tirer un nombre n aléatoire entre 1 et 100 compris.

• Demander à l’utilisateur quel est ce nombre, en le laissant recommencer s'il ne l'a pas trouvé, en lui laissant 5 tentatives au maximum.

• Si à la fn il n’a pas trouvé le nombre, lui afcher ce nombre. S’il l’a trouvé, féliciter l’utilisateur.

Ajouter au programme une amélioration pour guider l’utilisateur sans lui donner la réponse.

4) Recherche dichotomique dans une liste triée

Créez un fchier TP3dicho.py dans votre répertoire du TP3

À partir d'une liste trié, la recherche dichotomique de la présence (et de l'index) d'une valeur consiste à prendre une valeur à l'index milieu d'une tranche de la liste (au début la tranche fait toute la liste), si on a trouvé la valeur cherchée c'est terminé. Sinon, on utilise le fait que la liste soit triée pour savoir de quel côté peut se trouver la valeur recherchée par rapport à la valeur milieu, afn de défnir une nouvelle tranche de recherche en éliminant le côté inintéressant. On peut alors recommencer l'algorithme sur la nouvelle tranche défnie en réduisant de moitié à chaque tour la taille de la tranche de recherche. Si on arrive à une tranche vide… c'est que la valeur n'est pas dans le tableau.

Écrire un programme qui implémente cet algorithme en utilisant des variables :

(6)

6 IV - Travail personnel à rendre

lst pour la liste,

gauche et droite pour les index limites de la tranche de recherche,

milieu pour l'index de milieu dans cete tranche.

• + d'autres variables suivant vos besoins.

Le programme doit afcher la liste, la valeur rechercher et l'index trouvé de la valeur recherchée dans la liste, ou -1 si la valeur n'a pas été trouvée.

Ajoutez un compteur cpt du nombre d'itérations, que vous afcherez.

Faites des tests sur une petite liste, par exemple [1,3,5,6,8,9] en vous assurant de tester sufsamment de cas intéressants…

5) Calcul remboursement d’emprunt immobilier

Nous reprenons ci-dessous l'explication donnée sur htp://www.cbanque.com/credit/principe.php (en considérant des remboursements mensuels sur un nombre entier d'années).

Le tableau d'amortissement d'un crédit permet de connaître les mensualités payées, le capital restant dû, et la répartition de la mensualité entre remboursement des intérêts et remboursement du prêt principal.

Partant du taux annuel d'emprunt négocié (tauxan), sur un nombre d'année données (nban) et considérant un remboursement mensuel soit 12 échéances sur un an (et au total une durée nbmois = 12 × nban), on peut calcu- ler le taux périodique d'emprunt6 (tauxmois) :

tauxmois=

tauxan12 . C'est ce taux mensuel qui, multiplié par le capital restant à rembourser, permet de calculer chaque mois les intérêts à payer.

Pour l'assurance, on a un montant total basé sur un pourcentage du capital total emprunté, qui est réparti ensuite en parts fxes (assmois) sur chacun des nbmois mois que dure le remboursement de l'emprunt.

Le calcul du montant d'une échéance, en fonction du capital emprunté capital, du taux mensuel, du nombre de mois et de l'assurance mensuelle est :

echeance= capital× tauxmois×(1 + tauxmois)

nbmois

(1+ tauxmois)

nbmois

−1 + assmois

Créez un fchier TP3emprunt.py dans votre répertoire du TP3.

On utilisera des noms de variables correspondant à ceux utilisés dans les formules.

Écrivez un programme qui commence par faire saisir par l'utilisateur le capital, le nombre d'années ainsi que le taux annuel, et le taux d'assurance, puis qui afche un tableau d'amortissement théorique7 indiquant pour chaque mensualité :

• n° de mensualité,

• montant du capital restant dû au début de la mensualité,

• montant de l'intérêt remboursé sur l'échéance,

• montant du capital remboursé sur l'échéance,

• montant de l'assurance sur l'échéance,

• montant de l'échéance (normalement égale à la somme des trois montants précédents),

• total du capital déjà remboursé,

• total de l'intérêt déjà payé.

Dans l'exemple donné sur le site, pour un emprunt de 100000€ sur 1 an (12 mois) à un taux annuel de 5 % avec un taux d'assurance de 3,5 %, on obtient le tableau :

# caprest intremb capremb ass echean totremb totint

6 - Si on est en taux actuariel, typiquement pour un crédit à la consommation, la formule de calcul du taux périodique est un peu diférente — voir le site web donné en référence.

7 - Contrairement aux tableaux bancaires qui gèrent les centimes, le tableau « théorique » utilise des calculs sur des nombres fotants sans se préoccuper des reports ou non des centimes.

(7)

IV - Travail personnel à rendre 7

1 100000.00 41.67 814.41 2.92 858.99 814.41 41.67

2 9185.59 38.27 817.80 2.92 858.99 1632.21 79.94

3 8367.79 34.87 821.21 2.92 858.99 2453.42 114.81

4 7546.58 31.44 824.63 2.92 858.99 3278.05 146.25

5 6721.95 28.01 828.07 2.92 858.99 4106.12 174.26

6 5893.88 24.56 831.52 2.92 858.99 4937.63 198.82

7 5062.37 21.09 834.98 2.92 858.99 5772.61 219.91

8 4227.39 17.61 838.46 2.92 858.99 6611.08 237.52

9 3388.92 14.12 841.95 2.92 858.99 7453.03 251.64

10 2546.97 10.61 845.46 2.92 858.99 8298.49 262.26

11 1701.51 7.09 848.99 2.92 858.99 9147.48 269.35

12 852.52 3.55 852.52 2.92 858.99 100000.00 272.90

6) Rebonds

Pour les plus rapides : la balle rebondissante, une entrée en matière pour programmer un pong ou un casse- briques ou…

Créez un fchier TP3rebonds.py dans votre répertoire du TP3.

Nous allons utiliser le module turtle d'une façon un peu particulière pour réaliser une petite animation. Vous connaissez déjà les instructions de déplacement relatif, pour cet exercice nous allons utiliser des déplacements absolus et calculer nous-même les positions. En plus de ce qui est indiqué à la fn du TP2, on a :

gotoxy(x,y) positionne la tortue à la position absolue x,y dans la fenêtre (le 0,0 est au centre de la fenêtre lors de son ouverture)

shape('circle') sélectionne une forme ronde pour représenter la tortue.

stamp() place un tampon correspondant à l'image de la tortue là où elle est.

clearstamps() eface tous les tampons.

Défnissez des constantes globales G, D, H, B (correspondant à des limites gauche, droite, haut, bas), avec les valeurs respectives -300, 300, 210, -200. Avec des déplacements absolus de la tortue et une gestion du crayon, tracez un rectangle représentant ces limites.

Défnissez un pas de 5, des coordonnées curx et cury (initialement à 0), ainsi que des directions xdir et ydir

(initialement à 1). Dans une boucle sans fn :, gérez les calculs de curx et cury en prenant en compte les direc- tions et le pas, en réalisant des inversions de direction lorsqu'une position dépasse les limites défnies, déplacez la tortue à l'endroit cible, efacez les tampons précédents, et tracez un tampon à la nouvelle position.

Pour tracer le plus rapidement possible, vous pouvez commencer votre script par la séquence (en important les fonctions bien sûr) :

reset() speed(0) delay(0) hideturtle()

Et pour ralentir les tracés afn de voir le tampon, vous pouvez utiliser (au bon endroit) la fonction sleep() du module time en lui fournissant par exemple un délai de pause de 0.01 seconde.

Références

Documents relatifs

En Python, pour interrompre un programme qui boucle à l'infini, il suffit de faire Ctrl + C.3. Remarque :

pour écrire un programme qui : choisit au hasard un nombre x compris entre 1 et 127 ; demande à l'utilisateur d'entrer un nombre y ;.. renvoie comme message à l'utilisateur

(1985) étudient 53 enfants hémiplégiques divisés en 3 groupes selon que la lésion est survenue dans la période prénatale, dans les 2 premiers mois de vie ou après 5 ans

Vérification graphique : Utilisation de GeoGebra Il faut trouver la valeur du rayon du cylindre qui donne comme volume

• L'état du calcul en plein milieu d'une boucle est donné par l'ensemble des valeurs x i des variables v i de boucle... Ce phénomène de vases communiquants se rencontre

Cr´eer puis tester un programme permettant d’afficher la liste des multiples de sept inf´erieurs ou ´egaux ` a un entier n quelconque..

Panicum Apache Rose Rosier Flower Carpet Rouge. &#34; Rosier

Entre les deux extrêmes un avis spécialisé s’impose pour une prise en charge guidée et spécifique des CPNE afin d’éviter tout étiquetage pathologique