Les objets en Java Plan Types et Classes Exemple 1: fraction

publicité
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
Téléchargement