Exercice 1: / simulation de la croissance d’une plante
Aujourd’hui, du chiendent (une plante invasive) occupe \(150 \ m^2\) d’un
jardin de \(2000 \ m^2\) . Chaque semaine, on constate que cette surface
envahie augmente de \(10 \%\) en raison du développement des rhizomes, mais
à ceci s’ajoute \(5 \ m^2\) par dissémination des graines.
a) Vérifier qu’au bout de deux semaines, le chiendent recouvrira exactement
\(192 m^2\) du jardin.
b) Écrire une fonction seuil_chiendent()ayant pour paramètre surface_seuil
qui permet de déterminer le nombre de semaines à partir
duquel la surface envahie par le chiendent sera supérieure, pour la première fois,
à la surface_seuil, si cela se produit.
c) Au bout de combien de semaines le chiendent va t-il recouvrir plus de la
moitié de ce jardin ? plus des trois quarts de ce jardin ?
Exercice 2: / il ne peut en rester qu’un …
Sur une île bien inhospitalière règne une compétition à outrance entre trois
espèces animales: des crabes, des lézards et des oiseaux.
Chaque matin, chaque crabe tue un lézard. Chaque après-midi, chaque lézard
survivant tue un oiseau. Chaque soir, chaque oiseau tue un crabe. Ce cycle de
prédation se répéte chaque jour à l’aube.
a) Si à l’aube du premier jour, il y avait 100 crabes, 175 lézards et 132
oiseaux, vérifier qu’au bout de deux jours (à l’aube du 3ème jour), il ne
restera plus que 18 crabes, 32 lézards et 25 oiseaux sur cet île. Vous pourrez évidemment utiliser cette réponse en guise de test dans la fonction à écrire dans la fonction suivante.
b) Écrire une fonction survivants() qui admet comme paramètres, crabes,
lezards, oiseaux et nb_jours (respectivement le nombre de crabes, de
lézards, d’oiseaux et de jours d’observation) et qui renvoie le tuple
(crabes, lezards, oiseaux) (le nombre d’individus de chaque espèce après
cette période d’observation).
c) Si à l’aube du premier jour, il y avait 55405 crabes, 97229 lézards et
73396 oiseaux, combien de jours vont s’écouler avec que le nombre de lézards
passe sous les 10 individus à l’aube ?
d) À l’aube du 14ème jour, il ne restait plus que 1 crabe, 3 lézards et 2
oiseaux. Combien y avait-il d’individus de chaque espèce à l’aube du premier
jour ?
Exercice 3: / de jolis dessins …
Python possède de multiples modules pour réaliser des dessins (des plus simples
figures géométriques au plus complexes). On s’intéresse ici au module
turtle.
Voici un exemple de construction réalisée avec ce module qui a consisté ici à
définir un motif de base (en rouge sur la figure) à répéter 8 fois.
Le code Python qui a permis de l’obtenir est le suivant:
#!/usr/bin/python3# -*- coding: utf-8 -*-"""
:nom: Olivier Hennebelle
Figure 0 réalisée avec le module turtle
"""from turtle import*defmotif_0(longueur):
"""
Dessine le motif de base pour réaliser la figure 0
:param longueur: (int) la longueur désirée
:return: (None) on ne récupère rien d'utilisable (pas de return)
:effet de bord: affiche les différents tracés
"""
width(8) # définition de l'épaisseur des traits
color("orange") # définition de la couleur
forward(longueur) # avancer de la longueur donnée
left(135) # tourner vers la gauche de 135°
forward(longueur /2)
right(90)
forward(longueur /2)
right(90)
deffigure_0(longueur):
"""
Dessine le la figure 0 par répétition du motif de base
:param longueur: (int) la longueur désirée
:return: (None) on ne récupère rien d'utilisable (pas de return)
:effet de bord: affiche les différents tracés
"""
c =0while c <8: # répétition du motif 8 fois
motif_0(longueur)
c = c +1
hideturtle() # si vous souhaitez faire disparaître la tortue (flèche) avant# de sauvegarder l'image
getcanvas().postscript(file ="figure0.eps") # si vous souhaitez sauvegarder# votre dessinif __name__ =='__main__':
figure_0(100) # pour éxécuter votre programme en précisant la longueur choisie
a) Télécharger les calques qui vont aideront à tester vos constructions.
b) Télécharger les scripts à compléter. Il sont à placer dans le même dossier
que les calques.
c) Compléter ou réaliser les algorithmes qui permettent d’obtenir les figures.
Exercice 4: / quelques manipulations de fichiers
Dans cet exercice, vous devrez vous inspirer de l’exemple vu dans l’exposé de
cours sur la boucle TantQue impliquant des manipulations de fichiers.
Placer les fichiers précédents et le script contenant les fonctions suivantes dans un même dossier
a) Écrire un prédicat sont_identiques() qui prend en paramètres deux fichiers
afin de vérifier s’ils sont identiques ou non (au niveau de leur contenu).
b) Écrire une fonction decompter qui permet de dénombrer le nombre de fois qu’un caractère
donné en paramètre est présent dans un fichier lui aussi donné en paramètre.
Jeu de tests:
>>> decompter("ex4_fichier_test.txt", "u")
119
c) Écrire une fonction modifier() qui permet de copier partiellement un
fichier en remplaçant un caratère choisi par un autre voire par une chaîne de
caractères. Elle prendra en paramètres deux fichiers source et
destination et deux autres paramètres a_remplacer (que l’on cherche à
remplacer) et a_placer (le caractère qui remplacera a_remplacer dans le
fichier destination).
Notez que le résultat n’est pas parfait: présence pas forcément désiré d’espaces
résiduels en début de ligne. Il faudra faire appel à des fonctions spécifiques
(méthodes) aux strings. Il faudra vous montrer patient !
Exercice 5: du côté des images …
À l’aide de module spécialement conçu dans cet objectif, il est possible de
travailler avec des images.
Est-il possible d’estimer l’ampleur de l’évolution des glaces dans l’Artique,
l’évolution de la forêt amazonienne sur une certaine période grâce aux images
satellitaires de la Terre ?
Interessons nous au module PIL. Voici quelques fonctions qui utilisent ce
module.
#!/usr/bin/python3# -*- coding: utf-8 -*-"""
:nom: Christophe Mieszczak, un collègue
Premières manipulations d'images RVB (rouge, vert, bleu)
"""from PIL import Image
defouvrir(chemin):
"""
Renvoie l'image lue dans le fichier de nom "chemin".
:param chemin: (file) chemin pointant vers l'image
:return: (ImageFile) fichier image
Exemple de chemin: "C:\Documents\Images\photo.jpg"
"""return Image.open(chemin)
defafficher(image):
"""
Ouvre une fenêtre et affiche l'image.
:param image: (ImageFile) fichier image
:return: (None)
:effet de bord: affiche l'image
"""
image.show()
defsauver(image, chemin):
"""
Sauvegarde l'image donnée dans le fichier de nom "chemin".
:param image: (ImageFile) fichier image
:param chemin: (file) chemin où l'on souhaite sauver l'image
:return: (None)
:effet de bord: sauve l'image dans un fichier
Exemple de chemin: "C:\Documents\Images\photo1.jpg"
"""
image.save(chemin)
defdimensions(image):
"""
Renvoie les dimensions de l'image
:param image: (ImageFile) fichier image
:return (longueur, largeur): (Tuple) un tuple donnant la longueur et \
la hauteur de l'image
"""
longueur, largeur = image.size
return longueur, largeur
defcouleur(image, x, y):
"""
Renvoie la couleur du pixel de coordonnées x, y de l'image donnée
:param image: (ImageFile) fichier image
:param x: (int) l'abscisse du pixel
:param y: (int) l'ordonnée du pixel
:return color: (Tuple) un tuple donnant la couleur du pixel en RVB (rouge, vert, bleu)
Exemples de couleur:
(0, 0, 0) correspond à la couleur noire
(250, 125, 0) correspond à une couleur orangée rougeoyante \
(mélange de rouge et de vert avec deux fois de rouge que de vert)
(255, 255, 255) correspond à la couleur blanche
"""
color = image.getpixel((x, y))
return color
[Mise à jour du 09/11]
Pour répondre aux questions suivantes, vous pouvez faire usage de l’IDE en
ligne repl.it à la place de Thonny.
Vous pouvez procéder comme suit.
a) Tester ces fonctions avec les images ci-jointes:
Cela signifie que le pixel en position (150, 200) de ex5_photo.jpg a pour
couleur gris foncé (un peu de mélange à quantité égale de rouge, de vert et de
bleu).
b) Écrire un prédicat seuil_couleur() ayant pour paramètres image, x, y
(les coordonnées du pixel considéré), seuil_rouge, seuil_vert,
seuil_bleu (des entiers entre 0 et 255) qui renvoie True dans le cas où
chacune des composantes de la couleur du pixel dépasse le seuil associé.
Jeu de tests (déjà connu puisque l’on connait la couleur du pixel
en (150, 200) dans ex5_photo.jpg):
c) Écrire une fonction compter() ayant pour paramètres image, seuil_rouge,
seuil_vert, seuil_bleu (des entiers entre 0 et 255) qui renvoie le nombre
de pixels de l’image dont chacune des composantes de sa couleur dépasse le
seuil associé.
Dans cet exemple, on peut lire que ex5_photo.jpg a exactement 118 pixels
blancs (255, 255, 255).
d) Écrire une ou des fonctions qui permet(tent) de tirer le taux d’évolution
dans l’étude des glaces en Artique ou de la parcelle de forêt amazonienne.
Vous pouvez, si vous le souhaitez écrire les résultats dans un fichier en
vous inspirant du travail réalisé dans l’exercice précédent.
Choisir comme seuils:
pour l’Artique, seuil_rouge = 0, seuil_vert = 0 et seuil_bleu = 170
(seuil d’environ \(25 %\) de concentration de glace dans l’eau d’après la
légende jointe aux images voir
site
pour l’Amazonie: seuil_rouge = 70, seuil_vert = 0 et seuil_bleu = 0.
Ces seuils ont été obtenus avec l’usage d’un logiciel capable de lire la
couleur d’un pixel désiré. Exemple de tel logiciel:
GIMP. Il en existe beaucoup d’autres.
Exercice 6: / des élèves turbulents …
Un immeuble dispose d’un certain nombre d’étages numérotés à partir de 1. Des
enfants de cet immeuble passablement turbulents montent les étages en appuyant
sur un interrupteur pour allumer ou éteindre les lumières des étages de la façon
suivante:
Le premier appuie sur tous les interrupteurs.
À la suite , le second appuie sur les interrupteurs des étages 2, 4, 6, 8, …
Ensuite, le troisième appuie sur les interrupteurs des étages 3, 6, 9, …
Cela se répète jusqu’au dernier enfant.
En supposant que tous les étages étaient éteints au début, combien d’étages seront
allumés après leur passage ?
Répondre à la question en écrivant des fonctions.
Une aide ?
Es tu sûr d'avoir suffisamment cherché ?
Vraiment ?
Vous pouvez commencer avec un nombre fixé d’enfants (par exemple, 3 enfants)
et raisonner sur nb_etages étages.
Écrire un prédicat de paramètre etage qui contôle si l’étage dont le numéro
est donné est allumé ou non. Enfin finir avec une fonction etages_allumes
qui renvoie le nombre d’étages allumés en fonction de nb_etages.
puis généraliser avec nb_enfants enfants et nb_etages étages en modifiant
les fonctions précédentes.