Module I5 – Java Corrigé TP2 RT I – Création d`une classe IUT

publicité
Module I5 – Java
Corrigé TP2
RT
I – Création d'une classe
! Ne sont reproduites que les modifications apportées à l'application entre deux paragraphes.
1,1 – Classe Point
class Point {
int x,y;
void affiche() {
System.out.println("Point : x= " + x + " / y = " + y);
}
}
public static void main(String [] args) {
Point P1=new Point();
P1.affiche();
P1.x=5;
P1.y=3;
P1.affiche();
}
1,2 – Indépendance des objets
Point P2=new Point();
P2.affiche();
P2=P1;
P2.affiche();
P2.x=1;
P2.y=2;
P1.affiche();
P2.affiche();
// Ajout en fin de main
// ! A partir de ce point, P1 et P2 représentent le
// le même objet
// Les 2 affichages sont donc identiques
=> L'opération P2=P1 entraine la même utilisation de l'espace mémoire par les 2 références.
Autrement dit, P2 et P1 représentent le même objet.
1,3 – Ajout de méthodes
void deplace(int dx, int dy) {
x+=dx;
y+=dy;
}
void rotation() {
int c=x;
x=y;
y=-c;
}
void normalise() {
if (x<0)
x=-x;
if (y<0)
y=-y;
}
... main ...
P1.deplace(5,-3);
P2.rotation();
P1.normalise();
IUT Elbeuf
// Le point P1 est déplacé de 5 en x, et -3 en y
1/8
S.H.
Module I5 – Java
Corrigé TP2
RT
1,4 – Comparaison d'objets
boolean testEgal(Point Px) {
if ((x==Px.x) && (y==Px.y))
else
}
...main...
if(P1.testEgal(P2))
else
return
true;
return false;
System.out.println("P1 et P2 sont identiques");
System.out.println("P1 et P2 sont différents");
1,5 – Constructeur
Pour l'instant, la classe Point utilise le constructeur par défaut généré par Java. Ce constructeur est
utilisé dans le main lors de la création d'un nouvel objet :
Point P2=new Point();
// Utilisation du constructeur par défaut Point()
! Ce constructeur est généré par Java
Point(int a, int b) {
x=a;
y=b;
}
...main...
Point P3=new Point(1,2);
// Utilisation du constructeur Point(int a, intb)
Maintenant, le constructeur par défaut ne fonctionne plus. En effet, lorsque vous définissez un
constructeur pour votre classe, Java ne génère plus de constructeur par défaut : vous devez le recréer si vous
en avez besoin.
// Redéfinition du constructeur par défaut
Point() {
}
Remarques :
Un constructeur porte strictement le même nom que la classe
Soyez attentif au format d'écriture du constructeur (pas de void, ...)
1,6 – Surcharge de méthodes
Point(Point Px) {
x=Px.x;
}
y=Px.y;
...main...
Point P4=new Point(P1);
// Utilisation du constructeur Point(Point Px)
1,7 – Domaine d'existence des variables
1,7,1 – Modification du constructeur
Point(int x, int y) {
this.x=x;
}
this.y=y;
// Le mot clé "this" permet d'accéder aux variables
// de l'objet, le x seul faisant référence à l'argument
Les 2 constructeurs cohabitent sans problème (principe de la prog. Objet). Java reconnaît le modèle
au format et au nombre d'argument.
IUT Elbeuf
2/8
S.H.
Module I5 – Java
Corrigé TP2
RT
1,7,2 – initPoint
Point()
{
initPoint(0,0);
}
Point(int x, int y)
{
initPoint(x,y);
}
Point(Point Px)
{
initPoint(Px.x, Px.y); }
void initPoint(int a, int b) {
x=a;
y=b;
}
1,8 – Utilisation de variables statiques
1,8,1 – copiePoint
Point copiePoint() {
Point Pr=new Point();
Pr.x=x;
Pr.y=y;
return Pr;
}
Peut être optimiser par
Point copiePoint() {
Point Pr=new Point(this);
return Pr;
}
La meilleure des versions
Point copiePoint() {
return new Point(this);
}
...main...
P2=P1.copiePoint();
1,8,2 – copiePoint : version statique
Puisque la méthode devient statique, elle ne peut plus faire référence à l'objet d'appel. Il faut donc lui
passer les valeurs en argument :
static Point copiePoint(Point Pr) {
return new Point(Pr);
}
...main...
P2=P1.copiePoint(P1);
P2=P2.copiePoint(P1);
P2=Point.copiePoint(P1);
IUT Elbeuf
// Ces 3 écritures sont strictement équivalentes
3/8
S.H.
Module I5 – Java
Corrigé TP2
RT
1,8,3 – Compteur
méthode 1
static cmpt=0;
Point()
Point(int x, int y)
Point(Point Px)
{
{
{
cmpt++;
cmpt++;
cmpt++;
void initPoint(int a, int b) {
x=a;
initPoint(0,0);
}
initPoint(x,y);
}
initPoint(Px.x, Px.y); }
y=b;
}
méthode 2
static cmpt=0;
Point()
Point(int x, int y)
Point(Point Px)
{
{
{
initPoint(0,0);
}
initPoint(x,y);
}
initPoint(Px.x, Px.y); }
void initPoint(int a, int b) {
x=a;
y=b;
cmpt++;}
=> Pour les 2 méthodes, il faut également ajouter l'affichage de cmpt dans la méthode affiche()
Le compteur cmpt est initialisé au niveau de sa déclaration dans la classe (non obligatoire si = 0)
La méthode 2 présente l'avantage de ne nécessiter qu'une seule fois l'opération, puisque l'appel à la méthode
initPoint est ici systématique dans tous les constructeurs.
Cmpt déclaré en statique, donc élément commun à tous les objets de type Point. L'accès peut être réalisé de
façon équivalente par les lignes suivantes :
P1.cmp
<=>
P2.cmpt
<=>
Point.cmpt
1,8,4 – Somme
Point somme(Point Ps) {
Point Pt=new Point();
Pt.x=x+Ps.x;
Pt.y=y+Ps.y;
Pt.affiche();
return Pt;
}
... main ...
P4.affiche();
P4=P1.somme(P2);
P4.affiche();
=>
On remarque grâce à l'affichage, que chaque appel au constructeur incrémente le compteur
cmpt, y compris pour la création d'un élément temporaire (Pt créé dans la méthode somme)
IUT Elbeuf
4/8
S.H.
Module I5 – Java
Corrigé TP2
RT
II – Utilisation de projet
2,1 – 2 classes dans un fichier
class Rectangle {
Point Ph, Pb;
void affiche() {
System.out.println("Rectangle : Ph = ("+Ph.x+","+Ph.y+") / ("
+Pb.x+","+Pb.y+")");
}
void initRect(int a, int b, int c, int d) {
Ph.x=a;
Ph.y=b;
Pb.x=c;
Pb.y=d;
}
void initRect(Point P1, Point P2) {
Ph.x=P1.x;
Ph.y=P1.y;
Pb.x=P2.x;
Pb.y=P2.y;
}
... main ...
Rectangle R=new Rectangle();
R.affiche();
R.initRect(1,2,3,4);
R.affiche();
Point P1=new Point(10,11);
Point P2=new Point(20,21);
R.initRect(P1,P2);
R.affiche();
–
–
=> Pour que le programme fonctionne, il faut repecter les points suivants :
1 seule classe est déclarée publique dans le fichier
La classe Point, et la classe Rectangle sont déclarée dans le même fichier
2.2 – 2 classes dans un fichier séparé
=> Principe :
–
–
–
A l'aide d' un copier coller pour obtenir dans le même répertoire 2 fichiers au contenu identique, mais
dont l'un s'appelle Point, et l'autre Rectangle (du nom des 2 classes utilisées)
Dans chacun des fichiers, ne conserver que la classe correspondant au nom du fichier, en la déclarant en
publique
Compilez les 2 fichiers, et lancez l'exécution (sur le fichier contenant le main)
Remarque : Quelque soit la classe contenant le main, le fonctionnement sera identique
IUT Elbeuf
5/8
S.H.
Module I5 – Java
Corrigé TP2
RT
2.3 – 2 fonctions main
=> Principe :
–
–
A l'aide d'un copier coller, recopier la fonction main à l'identique dans les 2 fichiers.
Au début de la fonction main, dans chaque fichier, insérer la ligne de code :
–
Lancer l'exécution depuis l'un ou l'autre des fichiers
System.out.println("Execution du code main du fichier ...");
// Remplacer ... par le nom du fichier
=> On constate alors que le main exécuté correspond à la fonction "main" du fichier qui a permis de
démarrer l'exécution de l'application.
2.4 – Classe PointColor
public class Point {
...
}
class PointColor {
int x,y;
String color=new String();
void affiche() {
System.out.print("Point : x= " + x + " / y = " + y );
System.out.println(" / Couleur = " + color);
}
PointColor() {
}
PointColor(int a, int b, String s) {
x=a; y=b; color=s;
}
...
// Suite identique à Point
}
–
L'utilisation de la classe "PointColor" ne pose pas de problème au niveau de la fonction main contenue
dans la classe Point (même fichier)
–
Par contre, dans la méthode main contenue dans la classe Rectangle, il n'est pas possible de l'exploiter.
Ceci est dû au fait que ces 2 éléments sont déclarés dans des fichiers séparés, et que la classe
"PointColor" ne soit pas déclarée en classe publique.
IUT Elbeuf
6/8
S.H.
Module I5 – Java
Corrigé TP2
RT
III – Utilisation de tableaux
3,1 – Tableaux simple dimension
public class SaisieTableau
{
public static void main(String[] args) throws IOException {
BufferedReader clavier = new BufferedReader(
new InputStreamReader(System.in));
String s;
int n=0;
int tab[]=new int[10];
for (n=0; n<10; n++) {
System.out.print("Entrez la valeur de n" + n + " : ");
s=clavier.readLine();
tab[n]=Integer.ParseInt(s);
}
System.out.print("Valeurs saisies : ");
for (n=0; n<10; n++) {
System.out.print("Valeur de n" + n + " : ");
}
}
}
3,2 – Tri à bulle
Listing de la fonction tri, inséré à la fin du code précédent.
int z;
for (n=0; n<9; n++) {
if (tab[n] > tab[n+1]
{
z=tab[n];
tab[n]=tab[n+1];
tab[n+1]=z;
if (n>0)
n-=2;
}
}
System.out.print("Valeurs triées : ");
for (n=0; n<10; n++) {
System.out.print("Valeur de n" + n + " : ");
}
3,3 – Utilisation d'un tableau à 2 dimensions
int tab[][]=new int[5][2];
int n,m;
for ( n=0 ; n<2 ; n++) {
for ( m=0; m<5; m++) {
...
IUT Elbeuf
7/8
S.H.
Module I5 – Java
Corrigé TP2
RT
IV – Traitement de chaînes de caractères
...
BufferedReader clavier = new BufferedReader(new InputStreamReader(System.in));
String s;
System.out.print("Entrez un texte : ");
s=s.toUpperCase();
System.out.print("En majuscule s=>"+s);
s=s.toLowerCase();
System.out.print("En minuscule s=>"+s);
IUT Elbeuf
8/8
S.H.
Téléchargement