C5 Notions de programmation orienté objet
Activités
Activité 1 : Introduction à la programmation orientée objet
Activité 2 : Syntaxe objet en Python
-
On donne le code python suivant :
class Duree: def __init__(self,heures,minutes,secondes): self.heures=heures self.minutes=minutes self.secondes=secondes def __str__(self): return f"{self.heures}h {self.minutes}m {self.secondes}s"
- Quelle classe est crée ? Quels sont les attributs des objets de cette classe ?
- Quelle méthode est crée pour les objets de cette classe ?
-
Le record du monde du marathon est actuellement détenu par Eliud Kipchoge avec un temps de deux heures, une minute et neuf secondes, créer à l'aide de la classe ci-dessus un objet
record_marathon
représentant cette durée et l'afficher. -
Ecrire une méthode
nombre_secondes
qui renvoie le nombre de secondes d'un objet durée. L'utiliser pour afficher le record du monde du marathon en secondes. -
Ajouter une méthode
ajoute_secondes(nb_secondes)
à la classeDuree
qui permet d'ajouternb_secondes
à un objet de type durée.
Activité 3 : Getters et setters
- Créer une classe
Eleve
possédant les attributs suivants : nom, prénom, et classe. - Instancier cette classe pour créer l'élève
spiderman
, son nom est Parker, son prénom Peter et il est en première 5. -
Quel est l'effet de l'instruction
spiderman.classe = 'Terminale 2'
?Important
Bien que l'instruction précédente soit correcte, elle est contraire à l'esprit de la programmation objet dans lequel l'accès aux attributs d'un objet (ou la modification) devrait toujours se faire par des méthodes de l'objet. On respecte ainsi le principe d'encapsulation qui assure que l'utilisation des objets se fait indépendamment de leur structure interne (qui est susceptible d'être modifiée) Les méthodes permettant d'accéder à un attribut s'appellent des getters (accesseur) et celles permettant de modifier un attribut s'appellent des setter (mutateur)
-
Ecrire une méthode permettant d'accéder la classe d'un élève (le getter).
- Ecrire une méthode permettant de modifier la classe d'un élève (le setter).
- Modifier de nouveau (mais cette fois "proprement") la classe de
spiderman
.
Cours
Vous pouvez télécharger une copie au format pdf du diaporama de synthèse de cours présenté en classe :
Attention
Ce diaporama ne vous donne que quelques points de repères lors de vos révisions. Il devrait être complété par la relecture attentive de vos propres notes de cours et par une révision approfondie des exercices.
Exercices
Exercice 1 : Personnage d'un jeu vidéo
Dans un jeu vidéo, un personnage doit se déplacer dans un environnement à deux dimensions, sa position y est repéré par son abscisse et son ordonnée. D'autre part ce personnage dispose d'un certain nombre de points de vie qui peuvent évoluer durant le jeu. On considère la définition de la classe Perso
suivante :
class Perso:
def __init__(self,nom):
self.nom = nom
self.x = 0
self.y = 0
self.pv = 100
- Au départ combien de points de vie possède un personnage ? Et à quel coordonnées du repère est-il positionné ?
- Lorsqu'un personnage boit une potion de vie, il récupère 10 points de vie mais sans dépasser le maximum de vie qui est 100. Ecrire la méthode
boit_potion
qui implémente ce fonctionnement. - Ecrire la méthode
avance(nbcases)
qui permet au personnage d'avancer denbcases
vers l'avant.
Exercice 2 : Salles de classe
-
Ecrire une classe permettant de modéliser les salles de classes d'un lycée, chaque salle a un numéro d'étage et un numéro de porte et une capacité maximale. D'autre part une salle est destinée ou non à l'enseignement de l'informatique, ce qu'on modélisera par un attribut
informatique
de type booléen qui vautTrue
lorsqu'il s'agit d'une salle informatique. -
Créer
Salle_721
, salle informatique située étage 7, porte 21 d'une capacité maximale de 24 places. -
Créer
Salle_720
, salle non informatique, située étage 7, porte 20 et d'une capacité maximale de 35 places.
Exercice 3 : Equipe de foot
Dans un jeu vidéo de fantasy football, le joueur incarne le dirigeant d'un club de football qui peut vendre ou acheter des footballeurs. Chaque footballeur possède les caractéristiques suivantes : prenom, nom, age, nationalité, prix, salaire, poste.
- Créer la classe
footballeur
- Créer la variable
MK
représentant Millian K'Bappe, agé de 23 ans, Français qui joue attaquant pour un salaire annuel de 90 millions d'euros. Son prix d'achat est de 360 millions d'euros. - Ecrire et tester une méthode
est_star
qui renvoieTrue
ouFalse
suivant qu'un joueur perçoit ou non un salaire supérieur à 20 millions d'euros.
Exercice 4 : Modéliser un compte en banque
On modélise un compte bancaire par :
un numéro de compte
un nom de titulaire
un solde (négatif si le compte est débiteur)
- Ecrire une classe
CompteBancaire
représentant cette modélisation - Créer le compte n°421 de M. Tartampion ayant un solde de \(-125,10\) € et le compte n° 705 de Mme Untel ayant un solde de \(3120,07\) €.
- Ecrire et tester la méthode spéciale
__str__
permettant d'afficher l'objet CompteBancaire. Par exemple l'affichage de l'objet représentant le compte bancaire de M. Tartampion donnera :N°421 - M. Tartampion : -125,10 euros
- Ecrire les méthodes
depot
etretrait
permettant respectivement d'ajouter ou de retirer une somme d'argent d'un objet CompteBancaire. - Ecrire la méthode
virement
permettant de transférer une somme d'argent entre deux comptes. Par exemple siC1
etC2
sont deux objets de typeCompteBancaire
, alorsC1.virement(C2,montant)
aura pour effet d'enlevermontant
euros du compteC1
et de les transférer au compteC2
.
Exercice 5 : Un peu de géométrie
On donne la classe Point
définie ci-dessous qui représente un point du plan par son nom et ses coordonnées dans un repère. Cette classe est déjà dotée d'une méthode d'affichage.
class Point:
def __init__(self,nom,abcisse,ordonnee):
self.nom = nom
self.x = abcisse
self.y = ordonnee
def __str__(self):
return f'{self.nom}({self.x};{self.y})'
- En utilisant cette classe, créer et afficher les points \(A(3;-2)\) et \(B(-1;6)\).
-
Ecrire une méthode
milieu(self,other,nom_milieu)
qui renvoie le point milieu du segment ayant pour extrémités les deux points passés en paramètres (self
etother
) en lui donnant le nom contenu dansnom_milieu
.Aide
On rappelle (mais c'est au programme de classe de seconde) que pour deux points \(A(x_A,y_A)\) et \(B(x_B,y_B)\) les coordonnes \(x_I\) et \(y_I\) du milieu \(I\) du segment \([AB]\) sont :
\(x_I = \dfrac{x_A+y_B}{2}\) et \(y_I = \dfrac{y_A+y_B}{2}\) -
Utiliser cette méthode pour calculer le milieu \(I\) des points \(A\) et \(B\) définis plus haut et l'afficher.
Aide
Vous devrier obtenir \(I(1;2)\)
-
Ecrire et tester une méthode permettant de calculer la distance entre deux points.
Aide
On rappelle que pour deux points \(A(x_A,y_A)\) et \(B(x_B,y_B)\) on a \(AB = \sqrt{(x_B-x_A)^2+(y_B-y_A)^2}\). D'autre part la fonction racine carrée doit être importée depuis le module
math
Exercice 6 : Une classe date
- Définir et écrire le constructeur d'une classe
date
possédant trois attributs :jour
,mois
,année
. Ces trois attributs sont entiers, par exemple le 27 octobre 2020 a comme attributjour : 27
,mois : 10
etannée : 2020
. -
Affiner le constructeur défini plus haut pour n'accepter que des dates valides, c'est à dire avec un mois compris entre 1 et 12 et le jour ne dépassant pas le nombre de jours du mois.
Aide
Une idée consiste par exemple à utiliser un dictionnaire contenant les jours de chaque mois :
nb_jours = { 1:31, 2:28, 3:31, 4:30, 5:31 ... }
Pour aller plus loin, on pourra tenir compte des années bissextiles de façon à accepter le 29/02/2004 mais pas le 29/02/2005 !
-
Ecrire et tester une méthode spéciale permettant de renvoyer une chaîne de caractères de la forme JJ/MM/AAAA pour la date.
- Proposer et implémenter un autre format d'affichage par exemple 5 Avril 2005 pour le 05/04/2005.
- Ecrire et tester une méthode
date.lendemain()
qui retourne le lendemain de l'objetdate
. Par exemple si l'objetdate
correspond au 27/10/2020 alorsdate.lendemain()
doit retourner l'objet date correspondant au 28/10/2020. -
Ecrire et tester la méthode spéciale permettant de tester si une date |
date1
est antérieure à une autredate2
en écrivant simplementd1<d2
.Aide
Cette méthode spéciale est
__lt__
Exercice 7 : Cartes à jouer
Un jeu de cartes traditionnel contient 32 cartes, chaque carte a une couleur (pique, coeur, carreau ou trèfle) et une valeur (de 7 à 10 puis valet, dame, roi et as).
- Créer une classe Carte ayant deux attributs : couleur et valeur.
-
Ecrire une méthode spéciale permettant d'afficher une carte en utilisant le caractère unicode qui la représente. Consulter la page wikipedia de la liste des caractère unicode des cartes.
Aide
En python pour afficher le caractère unicode
U+1F0A7
, on peut par exemple écrireprint(chr(0x1F0A7))
- Ecrire une méthode pour comparer deux cartes
- Utiliser la programmation objet afin de simuler le jeu de la bataille entre deux joueurs.
Exercice 8 : Module fraction
L'énoncé est au format pdf
, téléchargeable ci-dessous :
Exercice 9 : Cryptage selon le code de César
Dans cet exercice, on étudie une méthode de chiffrement de chaînes de caractères alphabétiques. Pour des raisons historiques, cette méthode de chiffrement est appelée "code de César". On considère que les messages ne contiennent que les lettres capitales de l’alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ" et la méthode de chiffrement utilise un nombre entier fixé appelé la clé de chiffrement.
- Soit la classe
CodeCesar
définie ci-dessous :
class CodeCesar:
def __init__(self, cle):
self.cle = cle
self.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def decale(self, lettre):
num1 = self.alphabet.find(lettre)
num2 = num1+self.cle
if num2 >= 26:
num2 = num2-26
if num2 < 0:
num2 = num2+26
nouvelle_lettre = self.alphabet[num2]
return nouvelle_lettre
On rappelle que la méthode str.find(lettre)
renvoie l'indice (index) de la lettre
dans la chaîne de caractères str
Représenter le résultat d'exécution du code Python suivant :
code1 = CodeCesar(3)
print(code1.decale('A'))
print(code1.decale('X'))
Ajouter une méthode cryptage(self,texte)
dans la classe CodeCesar
définieà la question précédente, qui reçoit en paramètre une chaîne de caractères (le message à crypter) et qui retourne une chaîne de caractères (le message crypté).
Cette méthode cryptage(self, texte)
doit crypter la chaîne texte avec la clé de l'objet de la classe CodeCesar qui a été instancié.
Exemple :
>>> code1 = CodeCesar(3)
>>> code1.cryptage("NSI")
'QVL'
demande de saisir la clé de chiffrement
crée un objet de classe CodeCesar
demande de saisir le texte à chiffrer
affiche le texte chiffré en appelant la méthode cryptage
4- On ajoute la méthode transforme(texte)
à la classe CodeCesar
:
def transforme(self, texte):
self.cle = -self.cle
message = self.cryptage(texte)
self.cle = -self.cle
return message
print(CodeCesar(10).transforme("PSX"))
Que va-t-il s'afficher ? Expliquer votre réponse.
Exercice 10 : Exercices du bac session 2022
-
Métropole (Jour 1) - Exercice 5
Corrigé disponible
-
Métropole session de septembre (Jour 1) - Exercice 2
Corrigé disponible
-
Nouvelle-Calédonie (Jour 1) - Exercice 5
Corrigé disponible