Analyse de programme
Instanciation¶
-
Créez une classe
Voiture
avec deux attributs d’instance:couleur
, qui stocke la couleur de la voiture sous forme de chaîne de caractèreskilometrage
, qui stocke le nombre de kilomètres de la voiture sous forme d’entier.
-
Instanciez deux objets de type
Voiture
: une voiture bleue de 20 000 kilomètres et une voiture rouge de 30 000 kilomètres. -
-
Écrire une méthode
affiche
de la classeVoiture
: cette méthode affiche les attributs de la voitureself
correspondant. -
Comment utiliser cette méthode pour faire afficher :
-
Comment faire pour que les instructions
print(v1)
,print(v2)
affichent le résultat de la question précédente ?
-
Mêmes méthodes¶
On considère le programme suivant :
1 2 3 4 5 6 7 8 9 10 11 12 |
|
- Qu'affiche le programme ?
- Quelle est la particularité des méthodes de ce code ?
Interaction¶
Vous répondrez aux questions suivantes en écrivant un code python dont l'exécution fournisse le résultat attendu. En particulier, toutes les méthodes dont on demande l'écriture devront être écrites dans le corps de la classe. Le code obtenu ne sera pas nécessairement écrit de bas en haut au fur et à mesure des questions, penser à laisser éventuellement de la place.
-
-
Écrire le code d'une classe
Heros
qui comporte les attributs suivants :nom
,cri_victoire
,cri_defaite
(des chaines de caractères),force
(un entier compris entre 0 et 100), etpdv
(un entier valant 10 par défaut, représentant les points de vie du héro). -
Instancier deux variables de type
Heros
:-
hercule
, représentant le héros Hercule de force 99, criant "HAN" dans la victoire, mais "Ouch" il est blessé. -
limace
, représentant le héros dit "la Limace Folle" de force 100, criant "GNIII" lorsqu'elle terrasse ses ennemis et "Blup" lorsqu'elle est blessée.
-
-
-
Écrire le code des méthodes
crier_victoire
etcrier_defaite
(de la classeHeros
) qui affichent respectivement lecri_victoire
et lecri_defaite
de l'objetself
.1 2 3
def crier_victoire(self): """ Heros -> None""" pass
1 2 3
def crier_defaite(self): """ Heros -> None""" pass
-
À chaque fois qu'un héros est blessé, le héros blessé crie (pas très héroïquement) de douleur, et ses points de vie sont diminués. Écrire une méthode
recoit_blessure
de la classeHeros
qui prend en argument un entierval
et qui diminue les points de vie du hérosself
de ce montant, puis affiche le cri de défaite du hérosself
.Vous n'utiliserez pas l'attribut
cri_defaite
dans le corps de la méthoderecoit_blessure
.1 2
def recoit_blessure(self, val): """ Heros, int -> None """
-
Écrire une méthode
attaquer
de la classeHeros
qui prend en argument un objetother
de typeHeros
et qui simule l'attaque deother
par le hérosself
:-
si la force de
other
est strictement supérieure à celle deself
, alors elle afficheRien ne se passe
. -
sinon, elle affiche le cri de victoire de l'objet
self
et inflige 1 point de blessure à l'objetother
. La force du hérosself
est diminuée de moitiée (arrondi à l'entier supérieur) : il en faut de l'énergie pour porter un tel coup !Vous n'utiliserez pas l'attribut
pdv
dans le corps de la méthodeattaquer
.1 2
def attaquer(self, other): """ Heros, Heros -> None """
-
-
Qu'affiche le code suivant ?
1 2 3
hercule.attaquer(limace) limace.attaquer(hercule) print(hercule.pdv, limace.pdv)
-
-
Écrire une fonction
jusqua_la_mort
qui étant donné deux hérosheros1
etheros2
les font s'affronter en un combat singulier, jusqu'à ce que l'un d'entre eux soit terrassé (ses points de vie sont réduits à 0). À chaque round, chaque héros attaque l'autre, en commençant parhero1
. La fonctionjusqua_la_mort
renverra le héros vainqueur.1 2 3
def jusqua_la_mort(herso1, heros2): """ Heros, Heros -> Heros """ pass
-
Quelle instruction python permet d'afficher le nom du héros vainqueur dans le combat qui oppose Hercule à la Limace Folle ?
-
Les attributs
pdv
deheros1
etheros2
peuvent-ils tous les deux être réduit simultanément à0
lors de l'exécution de l'instructionjusqua_la_mort(heros1, heros2)
? Ce comportement est-il souhaitable ? Proposer une modification du code permettant de palier à ce problème.
-
Classes de classes¶
On se propose d'implémenter quelques fonctionnalités Yahtzee, dont le but est d'enchaîner les combinaisons à l'aide de cinq dés pour remporter un maximum de points.
Dans cette version extrêmement simplifiée, on propose de jouer selon le principe suivant :
- À chaque tour de jeu, on prend dans sa main cinq dés ;
- On répète au plus 3 fois les opérations suivantes :
- On lance tous les dés présents dans notre main ;
-
On peut mettre de côté tout ou partie des dés.
Ceux-ci ne seront pas relancés par la suite. - À l'issue des 3 lancers, tous les dés restants sont écartés. - On compte le score : celui-ci est égal à la somme des dés mis de côté.
1 2 3 4 5 6 7 8 |
|
- Instancier une variable
de1
. Quelle instruction doit-on utiliser pour afficher le résultat d'un lancer dé dé ? -
La classe
Jeu
simule le fonctionnement simplifié du jeu de Yahtzee décrit plus haut. Toutes les méthodes dont on demande l'écriture ci-dessous sont des méthodes de la classeJeu
.1 2 3 4
class Jeu: def __init__(self): self.main = [] self.des_de_cote = []
-
Écrire une méthode
prendre_des
qui étant donné un entiern
ajoute à la listeself.main
un nombren
de dés. -
Écrire une méthode
lancer
qui lance tous les dés présents dans la listeself.main
.Cette méthode affichera également pour chaque dé lancé son indice dans la liste
self.main
ainsi que le résultat du dé. -
Écrire une méthode
ecarter
qui étant donné une listenums
d'indices compatibles avec la taille de la listeself.main
supprime de cette liste les éléments dont les indices sont donnés dansnums
pour les ajouter à la listeself.des_de_cote
. -
Écrire une méthode
compter_score
qui calcule la somme des dés présents dans la listeself.des_de_cote
. -
Écrire une méthode
jouer
qui simule le fonctionnement du jeu.Remarque. L'instruction
nums = map(int, list(input("Sélectionner les dés : ")))
converti l'entrée utilisateur en une liste de chiffres.
-
-
Souligner en rouge dans la description du jeu les mots correspondants aux noms des méthodes, en bleu les mots correspondant aux noms des attributs. Que constate-t-on ?
Aliassage¶
On considère la classe Point
suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
-
-
Quelle instruction python permet d'instancier une variable
a
de typePoint
représentant le point \(A(2 ; 4)\) ? -
Quels sont les attributs des objets de type
Point
? -
Quelles sont les méthodes des objets de type
Point
? -
Donner la signature complète des méthodes
deplace
etsymetrique
de la classePoint
. -
Qu'affiche le code ci-dessous ? Justifier votre réponse.
1 2 3 4 5 6
b = Point(1, 2) # représente B(1 ; 2) print(b) b.deplace(3, 5) print(b) b.symetrique() print(b)
-
-
-
Écrire le code d'une classe
Segment
, dont les instances de classe possèdent un attributdebut
et un attributfin
, tous deux de typePoint
. -
Écrire l'instruction python qui permet d'instancier une variable
s1
représentant le segment \([AB]\).
-
-
-
Écrire une méthode
deplace
de la classeSegment
qui prend en entrée deux nombres flottantsdx
etdy
et qui translate le segmentself
selon le vecteur \(\begin{pmatrix} \texttt{dx} \\ \texttt{dy} \end{pmatrix}\).1 2 3
def deplace(self, dx, dy): """ Segment, float, float -> None """ pass
-
Écrire une méthode
symetrique
de la classeSegment
qui renvoie le segment symétrique du segmentself
par rapport à l'origine du repère.1 2 3
def symetrique(self): """ Segment -> Segment """ pass
-
-
La méthode
__str__
de la classeSegment
est définie de la manière suivante :1 2
def __str__(self): return f"Segment {self.debut.x, self.debut.y} -- {self.fin.x, self.fin.y}"
Quel affichage réalise le code suivant ? Justifier votre réponse.
1 2 3 4 5 6
print(s1) s1.deplace(8, 2) print(s1) s1.symetrique() print(s1) print(a, b)