Exercices en POO
Consignes
- Ne pas se faire aider par des IA ou genAI
Série 1
- Définir une classe
Personne
avec les attributsnom
,prenom
etage
. Ajouter une méthodeafficher
qui affiche les informations de la personne. Implémenter les méthodes__eq__
et__str__
.- Créer quelques personnes et les afficher..
- Afficher le résultat du
==
- On souhaite gérer un collection de consoles et jeux rétro avec la POO. Définir les classes
VideoGame
etVideoGameConsole
. Chaque classe propose les propriétés:name
,releaseYear
. La classeVideoGame
a en plus la propriétédeveloper
qui est la compagnie ou le développeur qui a développé le jeu. La classeVideoGameConsole
a en plus la propriétémanufacturer
qui est la compagnie qui a fabriqué la console. Implémenter la méthode__str__
.- Créer une liste
consoles
qui contient les consoles suivantes avec lesname
,manufacturer
etreleaseYear
suivants:- DegaDrive, Dega, 1992.
- Satourne, Dega, 1995.
- Super Nontendo, Nontendo, 1991.
- Nontendo, Nontendo, 1983.
- Ponystation, Pony, 1996.
- Créer une liste
games
qui contient les jeux suivants avec lesname
,developer
etreleaseYear
suivants:- Sanic, Dega, 1991.
- Spodermin, Morvel, 1992.
- Y-Men, Morvel, 1993.
- Nario, Nontendo, 1985.
- Zebda, Nontendo, 1986.
- First Fantasy, Rectangle, 1987.
- Paper Gear, Bonami, 1987.
- A partir de la liste
consoles
, afficher:- La liste des consoles fabriquées par Nontendo.
- La liste des consoles sorties à partir du 1er janvier 1990.
- A partir de la liste
games
, afficher:- La liste des jeux développés par Morvel.
- La liste des jeux sortis à partir du premier janvier 1985.
- Créer une liste
- Définir une classe
Point
qui possède deux propriétés x et y de type correspondant aux coordonnées du point.- Implémenter le constructeur
__init__(self, x, y)
qui permet d'initialiser les coordonnées. - Implémenter la méthode
__str__
qui représente le point de cette façon (ici, x = 2 et y = 3):Point | x : 2 | y : 3
- Implémenter la méthode
translate(self, tx, ty)
qui ajoutetx
àx
etty
ày
. - Implémenter la méthode
distance(self, point)
qui retourne la distance entre le point courant et le point passé en paramètre et retourne cela sous forme d'un point. - Instancier deux points et :
- Afficher la distance entre les deux points.
- Translater le premier point de 2 en x et 3 en y.
- Afficher les deux points.
- Afficher la nouvelle distance entre les deux points.
- Implémenter le constructeur
- Définir une classe
BankAccount
modélisant un compte en banque. La classe possède deux propriétés initialisées dans le constructeur.balance
correspond au solde du compte.managementCost
qui correspond au frais de gestion du compte.- Implémenter le constructeur
__init__(...)
. - Implémenter la méthode
__str__(self)
qui affiche les informations du compte de cette façon:Compte ( solde: 1000€ | frais de gestion: 13€ )
- Implémenter la méthode
debit(self, amount)
qui enlèveamount
au solde du compte uniquement si le solde est suffisant. Elle retourne un booléen qui renvoietrue
si le débit a réussi, sinonfalse
. - Implémenter la méthode
send(self, bankAccount, amount)
qui transfère de l'argent vers un autre compte uniquement si le solde est suffisant. La méthode retourne un booléen calculé de la même façon que la méthodedebit
. - Instancier deux comptes et effectuer des opérations de débit et de transfert. Afficher l'état de réussite de chaque opération et l'état des comptes après chaque opération.
- Implémenter le constructeur
- On souhaite générer des prédictions météorologiques sur une durée de 30 jours et faire des traitements dessus. Définir la classe
WeatherForecast
avec la propriétéday
(entier entre 1 et 30) ettemperature
(entier qui représente la température en Celsius).- Implémenter le constructeur
- Implémenter la méthode
to_farhenheit(self)
qui retourne la température en Fahrenheit avec la formule suivante:F = C * 9/5 + 32
- Implémenter la méthode
__str__
qui affiche la prévision de cette façon:Jour 1: 20°C | 68°F
- Instancier une liste de de 30 prévisions pour chacun des jours avec des températures aléatoires sous forme d'entier entre -10 et 40 degrés.
- Calculer les résultats suivants sans utiliser
avg
,min
,max
.- La température moyenne sur les 30 jours.
- La température la plus faible ainsi que les jours où cette température a été enregistrée. Par exemple si la température la plus faible est -10, on doit afficher les jours où -10 a été enregistré.
- La température la plus élevée ainsi que les jours où cette température a été enregistrée.
- Afficher les prévisions triées par température croissante avec et sans utiliser les méthodes de tri prédéfinies.
- Afficher les prévisions triées par température décroissante avec et sans utiliser les méthodes de tri prédéfinies.
- Le nombre de jours où la température est supérieure à 20°C et le nombre de jours où la température est inférieure à 0°C.
- Un dictionnaire qui compter le nombre prévisions qui ont les mêmes températures. Par exemple si 5 jours ont une température de
20°C
, et les reste des jours ont-5°C
le dictionnaire sera{"20°C": 5, "-5°C": 25}
.
- Générateur de personnage RPG et un simulateur de combat.
- Définir la classe
Character
avec les attributsname
,level
,attack
ethealth
. Implémenter une méthodeattack(self, target)
(où target est unCharacter
) qui diminue la santé de la cible. Ajouter une méthodeis_alive(self)
qui retourneTrue
si le personnage est vivant,False
sinon. Implémenter le constructeur qui initialise les attributsname
,level
,attack
(entier aléatoire entre 1 et 5) ethealth
(entier aléatoire entre 10 et 20). Implémenter une méthodeheal(self)
qui rétablithealth
de5 + level // 10
(// est la division entière). - Définir la fonction
fight(character1, character2)
qui simule un combat entre deux personnages. Le combat se déroule de la façon suivante:- Tant que les deux personnages sont vivants, ils s'attaquent à tour de rôle.
- Le personnage 1 attaque le personnage 2, puis le personnage 2 attaque le personnage 1.
- L'attaque de p1 envers p2 diminue le
health
de p2 avec la formule suivantep2.health - p1.attack * (réel aléatoire entre 0.75 et 1.25)
. - Le déroulement du combat est affiché au fur et à mesure.
health
doit toujours être >= 0
- Définir la fonction
fight_alternative(character1, character2)
qui reprend le même algo quefight
, mais permet au joueur actuel d'appeler sa méthodeheal
en plus d'attaquer. La méthodeheal
est appelée si un nombre aléatoire en 50 et 100 généré au moment où son tour débute est strictement inférieur à son(numéro du tour * level) / health
. Par exemple, si le joueur 1 a un niveau de 5 et 2 points de vie et qu'au tour 30, le nombre aléatoire est 60, alors le joueur 1 peut se soigner car(30 * 5) / 2 = 75 est supérieur à 60
. Par contre, si le nombre aléatoire généré était de 75 ou plus, alors le joueur ne peut pas se soigner.
- Définir la classe
Solution Person
class Person:
def __init__(self, first_name: str, last_name: str, age: int):
self.first_name = first_name
self.last_name = last_name
self.age = age
def __str__(self):
return f"Person(name: {self.first_name} {self.last_name}, age: {self.age})"
def __eq__(self, other: object) -> bool:
return isinstance(other, Person) and self.first_name == other.first_name \
and self.last_name == other.last_name and self.age == other.age
p1 = Person("Ram", "Bo", 40)
p2 = Person("Ryuuji", "Itadori", 17)
p3 = Person("Ryuuji", "Itadori", 17)
print(p1)
print(p2)
print(p3)
print(p1 == 10)
print(p1 == p2)
print(p2 == p3)
Solution Retro games and consoles
class VideoGameConsole:
def __init__(self, name: str, manufacturer: str, release_year: int):
self.name = name
self.release_year = release_year
self.manufacturer = manufacturer
def __str__(self):
return f"The {self.name} was release in {self.release_year} and manufactured by {self.manufacturer}"
def __repr__(self):
return self.__str__()
class VideoGame:
def __init__(self, name: str, developer: str, release_year: int):
self.name = name
self.release_year = release_year
self.developer = developer
def __str__(self):
return f"The game {self.name} was release in {self.release_year} and was developed by {self.developer}"
def __repr__(self):
return self.__str__()
consoles: list[VideoGameConsole] = [
VideoGameConsole("DegaDrive", "Dega", 1992),
VideoGameConsole("Satourne", "Dega", 1995),
VideoGameConsole("Super Nontendo", "Nontendo", 1991),
VideoGameConsole("Nontendo", "Nontendo", 1983),
VideoGameConsole("Ponystation", "Pony", 1996)
]
games: list[VideoGame] = [
VideoGame("Sanic", "Dega", 1991),
VideoGame("Spodermin", "Morvel", 1992),
VideoGame("Y-Men", "Morvel", 1993),
VideoGame("Nario", "Nontendo", 1985),
VideoGame("Zebda", "Nontendo", 1986),
VideoGame("First Fantasy", "Rectangle", 1987),
VideoGame("Paper Gear", "Bonami", 1987)
]
nontendo_consoles: list[VideoGameConsole] = []
ninety_consoles : list[VideoGameConsole] = []
for console in consoles:
if console.manufacturer == "Nontendo":
nontendo_consoles.append(console)
if console.release_year >= 1990:
ninety_consoles.append(console)
print("La liste des consoles fabriquées par Nontendo", nontendo_consoles)
# Syntaxe de la Compréhension
print("La liste des consoles fabriquées par Nontendo méthode 2", [c for c in consoles if c.manufacturer == "Nontendo"])
print("La liste des consoles >= 1990", ninety_consoles)
print("La liste des consoles >= 1990 méthode 2", [c for c in consoles if c.release_year >= 1990])
morvel_games: list[VideoGame] = []
eighty_five_consoles : list[VideoGame] = []
for game in games:
if game.developer == "Morvel":
morvel_games.append(game)
if game.release_year >= 1985:
eighty_five_consoles.append(game)
print("La liste des jeux développés par Morvel", morvel_games)
print("La liste des jeux développés par Morvel méthode 2", [g for g in games if g.developer == "Morvel"])
print("La liste des jeux >= 1990", eighty_five_consoles)
print("La liste des jeux >= 1990 méthode 2", [g for g in games if g.release_year >= 1985])
Série 2
- Créer une classe
StringUtils
qui contient les méthodes statiques suivantes:is_palindrome(word: str) -> bool
qui retourneTrue
si le mot est un palindrome,False
sinoncount_vowels(word: str) -> int
qui retourne le nombre de voyelles dans le motcount_uppercase(word: str) -> int
qui retourne le nombre de majuscules dans le motcount_lowercase(word: str) -> int
qui retourne le nombre de minuscules dans le mot