Les objets en Java Plan Types et Classes Exemple 1: fraction
Transcription
Les objets en Java Plan Types et Classes Exemple 1: fraction
Plan Les objets en Java Joël Quinqueton Dépt MIAp, UFR IV UPV - Université Montpellier III • • • • Types et classes Premier exemple de classe Second exemple: une liste L’héritage en Java Types et Classes • Types primitifs • Tableaux • Classes: – définit un nouveau type – Contient des champs (variables locales) – Contient des méthodes (comportement) Variables locales: • Numérateur, Dénominateur: ce sont des entiers • On peut choisir leur type en fonction de ce que l’on veut faire (long, int ou short) • Ces variables seront connues de toutes les méthodes définies dans la classe Exemple 1: fraction • Variables locales: – Numérateur – Dénominateur • Méthodes: – – – – Calcul: addition, soustraction, multiplication, division Comparaison: égalité, inégalités Impression Réduction, création,… Méthodes • Possèdent un nom, choisi par le programmeur (exemple: maMethode) • Renvoient ou non des valeurs • Peuvent avoir des arguments • S’appliquent aux instances de la classe (ici les fractions que l’on aura créées) • Lancées par un appel du genre: Fraction f; … f.maMethode(); 1 Définition en Java public class Fraction { int numerateur; int denominateur; } • On ne se préoccupe pas pour l’instant des problèmes de réductibilité. Algorithmique des calculs (1) • Multiplication – multiplier les numérateurs et les dénominateurs – N1/D1 x N2/D2 = (N1 x N2) / (D1 x D2) • Division – Multiplier le numérateur de l’une par le dénominateur de l’autre – N1/D1 / N2/D2 = (N1 x D2) / (D1 x N2) Où sont mises les méthodes? • Elles sont ajoutées à la définition de la classe public class Fraction { int numerateur; int denominateur; Fraction mul(Fraction f) { … return r; } } Méthodes de calcul • Renvoient une nouvelle fraction – Il faut la créer: new Fraction() • Opèrent sur 2 fractions: – L’une est la fraction à laquelle s’applique la méthode – L’autre est donnée en argument Fraction maMethode(Fraction arg) {…} Multiplication en Java Fraction mul(Fraction f) { Fraction r = new Fraction(); r.numerateur = numerateur * f.numerateur; r.denominateur = denominateur * f.denominateur; return r; } Division en Java Fraction div(Fraction f) { Fraction r = new Fraction(); r.numerateur = numerateur * f.denominateur; r.denominateur = denominateur * f.numerateur; return r; } 2 Algorithmique des calculs (2) • Addition – Multiplier les dénominateurs etc… – N1/D1 + N2/D2 = (N1 x D2 + D1 x N2) / (D1 x D2) • Soustraction – Même principe – N1/D1 - N2/D2 = (N1 x D2 - D1 x N2) / (D1 x D2) Soustraction en Java Fraction sub(Fraction f) { Fraction r = new Fraction(); r.numerateur = numerateur * f.denominateur - f.numerateur * denominateur; r.denominateur = denominateur * f.denominateur; return r; } Algorithmique des comparaisons • Egalité – Différent de l’identité: vrai si les deux fractions représentent la même valeur – N1/D1 = N2/D2 ssi N1 x D2 = D1 x N2 • Inégalité – On utilise le même principe – N1/D1 > N2/D2: • si D2 de même signe, si N1 x D2 > D1 x N2 • Sinon, si N1 x D2 < D1 x N2 Addition en Java Fraction add(Fraction f) { Fraction r = new Fraction(); r.numerateur = numerateur * f.denominateur + f.numerateur * denominateur; r.denominateur = denominateur * f.denominateur; return r; } Méthodes de comparaison • Renvoient une valeur booléenne – C’est un type primitif: boolean • Comme pour le calcul, opèrent sur 2 fractions: – L’une est la fraction à laquelle s’applique la méthode – L’autre est donnée en argument boolean maMethode(Fraction arg) {…} Égalité en Java boolean equals(Fraction f) { boolean r; r = (numerateur * f.denominateur) == (denominateur * f.numerateur); return r; } 3 Égalité en Java (plus compact?) boolean equals(Fraction f) { return (numerateur * f.denominateur) == (denominateur * f.numerateur); } Méthodes d’impression • Ne renvoient rien (void) • N’opèrent que sur la fraction à laquelle s’applique la méthode • Deux étapes: – il faut d’abord transformer notre fraction en chaine de caractère – puis l’imprimer • décomposer en 2 méthodes? Lancement • Lui ajouter le modificateur public • Lui ajouter une méthode main • Sauvegarder notre classe dans un fichier Fraction.java • Le compiler • Le lancer par java Fraction Inégalité en Java boolean moreThan(Fraction f) { if (denominateur * f.denominateur > 0) return (numerateur * f.denominateur) > (denominateur * f.numerateur); else return (numerateur * f.denominateur) < (denominateur * f.numerateur); } Impression en Java • On propose d’imprimer le numérateur, suivi du symbole de fraction, et suivi du dénominateur void print() { System.out.print("" + numerateur + "/" + denominateur) } Le fichier Fraction.java public class Fraction { int numerateur; int denominateur; Fraction mul(Fraction f) {…} … public static void main (String [] args) {…} } 4 Liste (rappels) • Structure de données élémentaire – Adaptée au stockage de données ordonnées (ou à ordonner) – Permet de résoudre un vaste ensemble de problèmes • Actions élémentaires à implémenter – Insertion / Délétion d’un nouvel élément – Recherche d’un élément dans la liste – Tri des éléments de la liste Types de listes • Liste dont les entrées et sorties sont contraintes: – Files – Piles • Liste d’éléments du même type: – Tableaux – On doit connaître la longueur • Proposer une structure générale Structure de liste Structure de liste • Implémentation «!dynamique!» – Possibilité de faire croître la taille de la liste au cours de l’exécution du programme • On ne peut pas supposer que les éléments sont consécutifs en mémoire – Nécessité pour chaque élément de stocker une information permettant l’accès au suivant Insertion dans une liste • Il suffit de gérer les liens entre éléments • La liste elle-même est une référence à son premier élément • Le dernier élément pointe vers le vide Insertion en fin de liste • Parcours de la liste jusqu’à ce qu’elle soit vide 5 Insertion en début de liste Définition d’une liste Classe Liste: • Élément: de type quelconque • Suivant: une liste (pouvant être vide) • Modifier l’entrée dans la liste Parcours • On ne peut accéder à un élément à partir de son indice dans le liste • Nécessité de parcourir la liste • Affichage de la liste: • Tant que la liste n’est pas vide – Afficher son élément – Donner à la liste la valeur de la liste suivante (liste.suivant) Longueur d’une liste • • • • – Incrémenter la longueur de 1 – Donner à la liste la valeur de la liste suivante (liste.suivant) • Retourner la longueur Accès à un élément • • • • Nécessité de parcourir la liste Élément n de la liste: Mettre e à n Tant que la liste n’est pas vide et que e>0 – Décrémenter e de 1 – Donner à la liste la valeur de la liste suivante (liste.suivant) • Retourner l’élément Nécessité de parcourir la liste Longueur de la liste: Mettre la longueur à 0 Tant que la liste n’est pas vide Indice d’un élément • • • • Nécessité de parcourir la liste Indice de x dans la liste: Mettre i à 0 Tant que la liste n’est pas vide et que l’élément est différent de x – Incrémenter i de 1 – Donner à la liste la valeur de la liste suivante (liste.suivant) • Retourner i 6 Autres fonctions souhaitables • Effacement d’un élément • Jonction de 2 listes Affichage d’une liste • On se propose d’afficher les éléments côte à côte void print() { System.out.print(" " + element); if (suivant != null) { suivant.print(); } else System.out.println(); } Longueur d’une liste • Cette méthode doit renvoyer un entier int longueur() { int lo = 0; Liste li = this; for (li = this; li.suivant != null; li = li.suivant) { lo = lo + 1; } return lo; } Implémentation en Java public class Liste { Object element; Liste suivant; } • Object est la classe racine de Java • La définition est récursive Affichage d’une liste • Définition non récursive void print() { Liste li = this; while (li.suivant != null) { System.out.print(" " + li.element); li = li.suivant; } System.out.println(); } Accès à un élément • Cette méthode doit renvoyer un objet quelconque et utilise un argument entier Object nieme(int i) { int lo = i; Liste li = this; for (li = this; li.suivant != null && lo > 0; li = li.suivant) { lo = lo - 1; } return li.element; } 7 Indice d’un élément • Cette méthode doit renvoyer un entier et utilise un argument de type quelconque int indexOf(Object x) { int lo = 0; Liste li = this; for (li = this; li.suivant != null && element != x; li = li.suivant) { lo = lo + 1; } return lo; } Insertion en début de liste • Cette méthode doit renvoyer la liste modifiée et utilise un argument d’un type quelconque Liste insererDebut(Object x) { Liste li = new Liste(); li.element = x; li.suivant = this; return li; } Insertion d’un élément • Utilisation des cas particuliers précédents Liste inserer (int i, Object x) { if (i <= 0) return insererDebut(x); int lo = i; Liste li; for (li = this; li.suivant != null && lo > 0; li = li.suivant) lo = lo - 1; if (lo > 0) li.suivant = li.suivant.insererDebut(x); else li.insererFin(x); return this; } Insertion d’un élément • Il y a plusieurs manières de désigner l’endroit de la liste où on veut insérer un élément: – Son indice (y compris début ou fin) – L’élément qui est après – Celui qui est avant • Seul le test de fin de parcours diffère • Si l’element doit etre inséré au début, il est nécessaire de renvoyer la liste modifiée Insertion en fin de liste • Cette méthode doit renvoyer la liste modifiée et utilise un argument de type quelconque Liste insererFin (Object x) { Liste li; lj = new Liste(); lj.element = x; for (li = this; li.suivant != null; li = li.suivant); li.suivant = lj; return this; } Types de listes • Liste dont les entrées et sorties sont contraintes: – Files – Piles – Listes triées • Définir des sous classes de la classe Liste 8