Exercices POO

Dates

Soit la classe Date  définie par le diagramme de classe UML suivant :

Implémenter cette classe en Python.
Dans la méthode de construction de la classe, prévoir un dispositif pour éviter les dates impossibles (du genre 32/14/2020).
Dans ce cas, la création doit provoquer une erreur, chose possible grâce à l’instruction raise (documentation à rechercher !).
Ajouter une méthode __repr__  permettant d’afficher la date sous la forme "25 janvier 1989". Les noms des mois seront définis en tant qu’attributAttribut Un attribut est un identifiant (un nom) décrivant une information stockée dans une base. Les attributs correspondent aux colonnes si la relation à laquelle il appartient est représentée sous forme de table. de classe à l’aide d’une liste.
Ajouter une méthode __lt__ qui permet de comparer deux dates.
L’expression d1 < d2 (d1 et d2 étant deux objets de type Date) doit grâce à cette méthode renvoyer True ou False .

 


 IMC

Écrire sous forme de diagramme de classe la définition de la classe Personne ayant trois attributs définissant certaines caractéristiques d’une personne réelle : taille, poids et age .
Cette classe aura :

  • une méthode imc() qui détermine l’IMC de la personne,
  • une méthode interpretation() qui affiche "Insuffisance pondérale" si l’IMC est inférieur ou égale à 18,5 et qui affiche "obésité" si l’IMC est supérieur ou égale à 30.
    Rappel : l’IMC (Indice de masse corporelle) est donné par la formule \(\frac{poids}{taille^2}\) avec le poids en kg et la taille en m.

Implémenter cette classe en Python.

 


géOOmétrie

Le programme Python suivant est écrit en programmation procédurale.

géOOmétrie
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
   Ce programme permet :
   - d'afficher des figures géométriques (de tailles et de couleurs différentes)
   - de modifier leur position en les faisant glisser
   - de modifier leur couleur en cliquant dessus

   Mais il n'est pas orienté objet !
"""

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import matplotlib.patches as mpatches
from random import random, randint
from matplotlib import colors
import six

# Une liste de couleurs
couleurs = [c[1] for c in list(six.iteritems(colors.cnames))]
def couleur_aleatoire():
   return couleurs[randint(0, len(couleurs)-1)]

def dimension_aleatoire(maxi = 0.2):
   return max(0.1, maxi*random())

# Une figure, un système d'axes
fig, ax = plt.subplots()
ax.set_title('Faire glisser les formes ... ou changer leur couleur en cliquant')

# Des cercles
for i in range(5):
   ax.add_artist(mpatches.Circle((random(),random()), dimension_aleatoire(),
                                 color = couleur_aleatoire(),
                                 ec = "none", picker = True))

# Des rectangles
for i in range(5):
   ax.add_artist(mpatches.Rectangle((random(),random()),
                                    dimension_aleatoire(0.4), dimension_aleatoire(0.4),
                                    color = couleur_aleatoire(),
                                    ec = "none", picker = True))

# Variables globales
dx, dy = 0.0, 0.0 # Coordonnées relatives
ar = None # artiste (forme géométrique)
mvt = False # Pour indiquer qu'un mouvement a commencé

# Ce qui se produit quand une forme est sélectionnée
def quandChoix(event):
   global dx, dy, ar
   ar = event.artist

   if isinstance(ar, mpatches.Circle):
      xdata, ydata = ar.center
   elif isinstance(ar, mpatches.Rectangle):
      xdata, ydata = ar.xy
   dx, dy = event.mouseevent.xdata - xdata, event.mouseevent.ydata-ydata


# Ce qui se produit quand la souris se déplace
def quandMouvement(event):
   global mvt

   if event.inaxes is None: # Le mouvement est en dehors du système d'axes
      return
   if event.button != 1: # Le bouton de la souris n'est pas appuyé
      return
   if ar == None: # Pas de forme sélectionnée
      return

   mvt = True # Un mouvement a commencé
   x, y = event.xdata, event.ydata # Les coordonnées de la souris

   if isinstance(ar, mpatches.Circle):
      ar.center = (x-dx, y-dy)

   elif isinstance(ar, mpatches.Rectangle):
      ar.set_x(x-dx)
      ar.set_y(y-dy)

   fig.canvas.draw()


# Ce qui se produit quand le bouton de la souris est relâché
def quandRelache(event):
   global ar, mvt
   if not mvt and ar is not None:
      ar.set_color(couleur_aleatoire())
      fig.canvas.draw()
   ar = None
   mvt = False


# Connection du canvas avec des événements
fig.canvas.mpl_connect('motion_notify_event', quandMouvement)
fig.canvas.mpl_connect('pick_event', quandChoix)
fig.canvas.mpl_connect('button_release_event', quandRelache)

plt.show()

La programmation procédurale est constituée de fonctions sans liens particuliers entre elles, agissant sur des données dissociées, et cela peut mener rapidement à des difficultés en cas de modification de la structure des données. Dans le cas de géOOmétrie ce type de programmation impose de différencier les types de donnée (isinstance()) car les données des objets Circleet Rectanglene sont pas structurées de la même manière.

 

Tester et analyser le programme fourni. Identifier les attributs et les méthodes communs à la classe Forme_geometrique , ou au contraire spécifiques à ses sous-classes (choisir parmi la liste ci-dessous et compléter le diagramme de classes ci-dessous).

 

Le réécrire en utilisant de la programmation orientée objet, et en respectant le diagramme de classe.
Ajouter une classe permettant de gérer de la même manière des polygones réguliers

 

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *