Polycopie Krit Tds Tps Java 2016
Polycopie Krit Tds Tps Java 2016
Polycopie Krit Tds Tps Java 2016
1. Introduction
Java est un langage de programmation orient objet cr en 1991 par
SUN Microsystem : cest une socit qui est rachete par Oracle en
avril 2009 . Lobjectif initial tait la programmation de petits
appareils comme des tlcommandes, la programmation dapplications
Web. Il est devenu actuellement lun des langages de programmation
gnraliste les plus utiliss. Le langage Java connu beaucoup
dvolution depuis sa cration. Plusieurs versions ont t
dveloppes: la premire version Java 1.0 en 1996 ..
Plusieurs environnements java sont disponibles:
- Java SE (Standard Edition)
- Java ME (Mobile Edition)
- Java EE (Enterprise Edition)
Environnement Java SE
- Outil JDK : Outils de dveloppement JDK (Java Developpment Kit) de
SUN (voir site :
http://java.sun.com).
Il est gratuit.
Il contient un ensemble de paquetages trs riches et trs varis.
Il contient un ensemble doutils : le compilateur : javac , le
JVM (Java Virtual Machine) java , le gnrateur de documentation.
- Des environnements de dveloppements gratuits sont disponibles, par
exemple :
NetBeans : http://www.netbeans.org/
Eclipse : http://www.eclipse.org/
2. Quelques caractristiques
Java est un langage purement orient objet. En effet, l'entit de
base de tout code Java est la classe :
c'est--dire quen Java, tout se trouve dans une classe, il ne peut y
avoir de dclarations ou de code endehors du corps d'une classe.
La syntaxe du langage Java est trs proche du langage C++ (et par
consquent du langage C). Ci aprson donne une simple comparaison
entre ces deux langages :
- Cration des langages:
C++ est cre dans les laboratoires AT&T Bell en 1983.
Java est cre dans les laboratoires de Sun Microsystems en
1991.
- Java vite les points "critiques" du langage C++:
Les pointeurs
La surcharge des oprateurs
Lhritage multiple
- Gestion de la mmoire : En java, la libration de la mmoire
seffectue de manire implicite : ilexiste un mcanisme de gestion
automatique de la mmoire, connu sous le nom de ramasse miettes(en
anglais Garbage Collector) qui est charg de dtecter les objets
dtruire. Ceci permet un gainde fiabilit au dtriment dune perte en
rapidit par rapport C++.
- Portabilit :
Le compilateur C++ produit un excutable qui dpend de
lenvironnement de travail (processeur,systme dexploitation, etc.)
o le code source est compil. Par consquent, priori, pour
uneexcution sur un autre environnement, on doit donc crer des
excutables propres chaque typedarchitecture sur laquelle on veut
excuter le programme.
En Java, la compilation ne traduit pas directement le programme
source dans le code natif delordinateur. Le code source est dabord
traduit dans un langage intermdiaire appel "bytecode",langage dune
machine virtuelle (JVM Java Virtual Machine) dfinie par Sun. Le
bytecode,gnr par le compilateur, ne dpend pas de lenvironnement
de travail ou le code source estcompil. Au moment de lexcution, il
sera traduit dans le langage machine relatif la machinesur laquelle
il sera excut.
3. Compilation
Le nom du fichier source compiler doit tre identique au nom de la
classe auquel on rajoutelextension .java . Sun fournit le
compilateur javac avec le JDK. Par exemple, si NomDeClasse.java
est le nom du fichier source compiler, alors la commande :
javac NomDeClasse.java
compile la classe NomDeClasse dont le code source est situ dans
le fichier NomDeClasse.java .
Cette compilation cre un fichier nomm NomDeClasse.class qui
contient le bytecode . Cest cebytecode qui sera excut par une
JVM. En gnrale, si un systme possde une JVM alors il peutexcuter
tous les bytecodes (fichiers .class) compils sur nimporte quel
autre systme.
Important : Si le fichier NomDeClasse.java fait rfrence des
classes, situes dans desrpertoires diffrents du rpertoire courant
(rpertoire de travail), alors il faut les spcifier:
- Soit pendant la compilation laide de loption -classpath .
Exemple : supposons quon faitrfrences des classes situes dans
les rpertoires /prog/exemple et /cours , alors on doit
lesspcifier de la faon suivante:
sous windows: javac -classpath /prog/exemple ; /cours;
NomDeClasse.java
sous Linux : javac -classpath /prog/exemple:/cours : NomDeClasse.java
- Soit dans la variable denvironnement CLASSPATH . Cette variable
indique le chemin ou setrouve les classes (par dfaut la recherche
des classes se fait dans le rpertoire courant).
4. Excution du bytecode
La compilation dun programme Java ne traduit pas directement le code
source en fichier excutable.
Elle traduit dabord le code source en un code intermdiaire appel
bytecode. Cest le bytecode quisera ensuite excut par une machine
virtuelle (JVM ; Java Virtual Machine). Ceci permet de rendre lecode
indpendant de larchitecture de la machine sur laquelle le programme
a t compil.
Le bytecode est excut par une JVM (simule par un programme) qui-
lit les instructions (en bytecode) du programme .class,
- les traduit dans le langage natif de la machine sur laquelle il
sera excut.
- lance lexcution
Sun fournit le programme java qui simule une JVM. Pour
lexcution, il suffit dutiliser lacommande: java NomDeClasse
Important :
- Il ne faut pas rajouter lextension .class
- Si des classes dautres rpertoires sont ncessaires, alors :
Soit, il faut les spcifier laide de loption classpath. Si par
exemple on fait rfrences desclasses situes dans les rpertoires
/prog/exemple et /cours , alors on doit les spcifi
pendantlexcution de la faon suivante:
sous windows: java -classpath /prog/exemple; /cours NomDeClasse
sous Linux: java -classpath /prog/exemple:/cours: NomDeClasse
Soit, il faut les rajouter dans la variable denvironnement
CLASSPATH .
5. Un exemple de programme java
Considrons la classe MonPremProg dfinie ci-desous:
public class MonPremProg {
public static void main(String args[]) {
System.out.println(" Bonjour: mon premier programme Java " );
}
}
- Ce code doit tre sauvegard obligatoirement dans un fichier texte
(fichier source) dont le nom est lenom de la classe avec lextension
.java : le nom de la classe est MonPremProg donc lefichier
source sera nomm MonPremProg.java
- Cette classe est excutable car elle possder la mthode main()
ayant la signature :
public static void main(String[] args).
Pour compiler, on utilise la commande javac:
javac MonPremProg.java
La compilation gnre un fichier nomme MonPremProg.class cest
la bytecode.
Pour lexcution, on utilise la commande java:
java MonPremProg
La machine virtuelle JVM interprte le bytecode de la mthode
main() de la classe MonPremProg . Lexcution du programme
MonPremProg affiche lcran la chane decaractres:
Bonjour: mon premier programme Java
Ceci grce linstruction: System.out.println("Bonjour: mon premier
programme Java ");
De manire gnrale :
- Dans tout programme destin tre excut, doit contenir une
mthode particulire nommemain() . Elle contient le programme
principal excuter. Elle est dfinie de la manire suivante:
public static void main(String args[]) {
/* corps de la mthode */
}
Le paramtre args est un tableau dobjets de type String. Il est
exig par le compilateur Java.
- La mthode main() ne peut pas retourner dentier comme en C.
- La classe contenant la mthode main() doit obligatoirement tre
public afin que la machine virtuelle yaccde.
- Dans lexemple prcdent, le contenu de la classe MonPremProg
est rduit la dfinition dunemthode main().
- Un fichier source peut contenir plusieurs classes mais une seule
doit tre public (dans lexemple cestla classe: MonPremProg ).
- Le nom du fichier source est identique au nom de la classe publique
qu'il contient avec lextension .java . Dans lexemple prcdent,
le fichier source doit obligatoirement avoir le nom:
MonPremProg.java .
Questions Gnrales
Filires : GL, SMI, IGE (S5)
Module : POO JAVA
Prof : S.KRIT
Questions gnrales :
1. Donner la dfinition et les avantages des langages POO.
2. Que signifie classe, objet, package, encapsulation, JVM, API,
constructeur.
3. Que signifie lhritage.
4. Quelle est la diffrence entre les variables dinstance (objet) et
les variables de classe.
5. Quel sont les dfrentes modificateurs
Voir le cours
6. Trouver la phrase qui rsume la dfinition dencapsulation et les
trois autres qui dcrivent les divers aspects du polymorphisme
a. le P. est un mcanisme consistant rassembler les donnes et
les mthodes au sein dune structure en cachant limplmentation
de lobjet.
b. le P. signifie que la mme opration peut se comporter
diffremment sur diffrentes classes de la hirarchie.
c. le P. offre la possibilit plusieurs objets de natures
diffrentes dexposer une interface identique au systme, et
ainsi rpondre un mme message dune manire qui leur est
propre
d. le P. consiste autoriser le mme code tre utilis avec
diffrents types, ce qui permet des implmentations plus
abstraites et gnrales.
Exercice 1.2
Ecrire un programme en java qui lit une chaine de caractres au clavier et
affiche le mot.
Solution :
package tps;
import java.util.*;
/* @author Salah */
public class exo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str;
System.out.println("Veuillez saisir un mot :");
str= sc.nextLine();
System.out.println("Vous avez saisi : " + str);
} }
Exercice 1.3
Ecrire un programme en java qui affiche la somme et la multiplication de
trois variables de type entier qui sont entres au clavier.
Solution :
package tps;
import java.util.*;
Exercice 1.4
Ecrire un programme qui affiche le quotient et le reste de la division
entire de deux nombres entiers entrs au clavier ainsi que le quotient
rationnel de ces nombres.
Solution :
package tps;
import java.util.*;
dev=a/b;
rest=a%b;
System.out.println("Division entiere: " +dev) ;
System.out.println("Reste de devision: " +rest) ;
System.out.println("Quotient rationnel: " +(float)a/b);
} }
Exercice 1.5
Rappelons quen Java aucune opration sur les flottants ne conduit un arrt de
lexcution.
En revanche, les nombres flottants respectent les conventions IEEE 754 qui imposent
lexistence dun motif particulier reprsentant les valeurs infinies, lequel
simprime sous la forme Infinity ou -Infinity. Les constantes correspondantes se
notent Float.Infinity ou Double.Infinity.
De mme, il existe un motif particulier reprsentant une valeur non calculable ; il
peut sobtenir par Float.NaN ou Double.NaN et il simprime sous la forme NaN.
Exercice 1.6 (operateurs logique)
&&1 faux
i = 10 j = 5
& faux
i = 10 j = 6
&&2 vrai
i = 10 j = 7
|| vrai
i = 10 j = 7
Il faut simplement tenir compte de la proprit particulire dont
bnficient les oprateurs && et || dits court-circuit. Ils
nvaluent leur second oprande que lorsque cela est ncessaire.
A : i = 1 n = 0
B : i = 11 n = 11
C : i = 21 j = 6 n = 120
D : i = 18 n = 18
E : i = 12 j = 4 n = 12
II. Les boucles
Exercice 2.1
Ecrire un programme permettant de rsoudre une quation du second
degr : ax2 + bx + c =0, avec a,b et c des rels donns par
lutilisateur.
Solution :
package tps;
import java.util.*;
public class Equation {
public static void main(String[] args) {
float a,b,c;
Scanner sc = new Scanner(System.in);
if(a==0){
if(b==0){
if(c==0){
System.out.println("La soltuion est l'ensemble R"); }
else
System.out.println("La solution est l'ensemble vide");}
else
System.out.println("La solution est:"+(-c/b));}
else {
float d;
d=(b*b)-4*a*c;
if(d>0) {
System.out.println("Solution 1 :"+(-b-Math.sqrt(d))/(2*a));
System.out.println("Solution 2:"+(-b+Math.sqrt(d))/(2*a));}
Else
package tps;
import java.util.*;
public class exo2_2a {
public static void main(String[] args){
int i, n, som ;
som = 0 ;
i = 0 ;
while (i<4)
{ System.out.println ("donnez un entier ") ;
Scanner sc = new Scanner(System.in);
n = sc.nextInt() ;
som += n ;
i++ ;
}
System.out.println ("Somme : " + som) ;}}
Solution2 : Avec une instruction do... while :
package tps;
import java.util.*;
public class exo2_2b
{ public static void main(String[] args){
int i, n, som ;som = 0 ;i = 0 ;
do{
System.out.println ("donnez un entier: ") ;
Scanner sc = new Scanner(System.in);
n = sc.nextInt() ;
som += n ;
i++ ;}
while (i<4) ;System.out.println ("Somme : " + som) ;}}
Exercice 2.3
Quels rsultats fournit le programme suivant ?
public class exo2_3
{ public static void main(String[] args)
{ int n, p ;
n = 0 ;
while (n<=5) n++ ;
System.out.println ("A : n = " + n) ;
n = p = 0 ;
while (n<=8) n += p++ ;
System.out.println ("B : n = " + n) ;
n = p = 0 ;
while (n<=8) n += ++p ;
System.out.println ("C : n = " + n) ;
n = p = 0 ;
while (p<=5) n += p++ ;
System.out.println ("D : n = " + n) ;
n = p = 0 ;
while (p<=5) n+= ++p ;
System.out.println ("D : n = " + n) ;
}}
Solution :
A : n = 6
B : n = 10
C : n = 10
D : n = 15
D : n = 21
Exercice 2.4
package tps;
import java.util.*;
public class exo2_4
{ public static void main (String[] args)
{ int n ; // nombre de termes de la serie harmonique
float som ; // pour la somme de la serie
int i ;
do
{
System.out.print ("combien de termes : ") ;
Scanner sc = new Scanner(System.in);
n = sc.nextInt() ;
}
while (n<1) ;
for (i=1, som=0 ; i<=n ; i++)
som += (float)1/i ;
System.out.println ("Somme des " + n + " premiers termes = " + som) ;
}
}
Exercice 2.5
k = 21
Exercice 2.6
Solution :
k= 10
k= 14
k= 17
k= 20
k= 22
k= 23
k= 25
k= 26
k= 27
Exercice 2.7
crire un programme qui affiche un triangle isocle form
dtoiles. La hauteur du triangle (cest--dire son nombre
de lignes) sera fourni en donnea, comme dans lexemple ci-
dessous.
On sarrangera pour que la dernire ligne du triangle
saffiche sur le bord gauche de lcran.
combien de lignes ? 8
*
***
*****
*******
*********
***********
*************
***************
Solution :
package tps;
import java.util.Scanner;
public class exo2_7 {
Exercice 2.8
Ecrire un programme enjava qui lit 3 nombres au clavier (x, y, z),
les classes dans l'ordre croissant et les affiche du plus petit au
plus grand sur la console. Exemple de compilation :
1er nombre : 15
2me nombre : 10
3me nombre : 22
les nombres dans l'ordre croissant : 15 17 22
Solution :
package tps;
import java.util.*;
public class exo2_8 {
package tps;
public class exo3_3 {
public static double f1(double x) {
return x*x+1;
}
public static double f2(double x) {
if (x>0)
return -x*x;
else
return 4*x;
}
public static double f3(double x) {
return 2*f2(x*x);
}
public static void main(String args[]) {
System.out.println(f1(f1(2)));
System.out.println(f2(f2(3)));
System.out.println(f2(f3(1)));
} }
Solution :
26.0
-36.0
-8.0
Exercice 3.4 :
Ecrire une fonction de prototype int puissance(int a, int b) qui
calcule ab, a et b sontdesentiers.
Solution :
package tps;
import java.util.*;
public class exo3_4 {
static double puis (int a,int b)
{
return Math.pow(a,b);
}
public static void main(String[] args) {
double p; //un objet da la classe puissance
int x,y;
Scanner sc = new Scanner(System.in); //sc objet de la classe
Scanner
System.out.println("Entrer x: ");
x=sc.nextInt();
System.out.println("Entrer y: ");
y=sc.nextInt();
p=puis(x,y); //objet=class.methode()
System.out.println(x+ " puissnce " +y+ " est: "+ p);
} }
==============deuxime mthode==================
package tps;
import java.util.*;
public class exo3_4a {
static int Puissance(int x, int y) {
int p=1;
for(int i=1;i<=y; i++)
p=x*p;
return(p); }
public static void main(String[] args) {
//exo3_4a p=new exo3_4a();
Scanner sc = new Scanner(System.in);
int a, b, res;
System.out.println(" Entrer a : ");
a=sc.nextInt();
System.out.println(" Entrer b : ");
b=sc.nextInt();
res = Puissance(a,b);
System.out.println(a+ " a la Puissance " +b+ " = " +
res); } }
IV. Les classes et les objets
Exercice 4.1
Ecrire un programme qui afficher les coordonner x et y
avant et aprs de deplacer(x=x+dx et y=y+dy).
Solution :
import java.util.*;
public class Point {
int x ; // un membre
int y ; // un autre membre
Scanner sc = new Scanner(System.in);
void initialise(int a, int b) {
x = a;
y = b;
}
void deplace(int dx, int dy) {
x += dx;
y += dy;
System.out.println("x= : " +x);
System.out.println("y= : " +y);
}
void affiche() {
System.out.println("Entrez le Nombre x : ");
x=sc.nextInt();
System.out.println("Entrez le Nombre y : ");
y=sc.nextInt();
System.out.println("======x et y==========");
System.out.println("x= : " +x);
System.out.println("y= : " +y); }
public static void main(String[] args){
Point a =new Point();
a.affiche();
System.out.println("==apres deplace(x,y)===");
a.deplace( 3, 4); }}
Exercice 4.2
Raliser une classe Point permettant de reprsenter un point sur un
axe. Chaque point sera caractris par un nom (de type char) et une
abscisse (de type double). On prvoira :
un constructeur recevant en arguments le nom et labscisse dun
point,
une mthode affiche imprimant (en fentre console) le nom du point
et son abscisse,
une mthode translate effectuant une translation dfinie par la
valeur de son argument.
crire un petit programme utilisant cette classe pour crer un point,
en afficher les caractristiques, le dplacer et en afficher
nouveau les caractristiques.
Solution :
package tps;
class Point {
// class Point ne doit pas dclarer public. si non
dplacer le dans un fichier Point.java
public Point (char c, double x) // constructeur
{ nom = c ;
abs = x ;
}
public void affiche ()
{ System.out.println ("Point de nom " + nom + " d'abscisse
" + abs) ;
}
public void translate (double dx)
{ abs += dx ;
}
private char nom ; // nom du point
private double abs ; // abscisse du point
}
public class TstPtAxe {
public static void main (String args[]){
Point a = new Point ('C', 2.5) ;
a.affiche() ; // Point de nom C d'abscisse 2.5
Point b = new Point ('D', 5.25) ;
b.affiche() ; //Point de nom D d'abscisse 5.25
b.translate(2.25) ;
b.affiche() ;//Point de nom D d'abscisse 7.5
} }
Exercice 4.3
Ecrire la classe Point qui dcrit un point gomtrique dans le cadre
d'un programme de dessin. Onse limitera aux dessins sur un plan.
Ecrivez un constructeur, les mthodes d'accs et au moins deux
autres mthodes dont la mthode toString() ;
Solution
Exercice 4.4
Ecrire la classe Polygone utilisant la classe Point dfinie dans
Exercice 4.1 ci-dessus. Ecrivez, ici aussi, un constructeur, les
mthodes d'accs et au moins deux autres mthodes dont la mthode
toString() ;
Solution
return true;
}
public String toString() {
String s="Polygone{\n";
for(int i=0; i<nbPoints; i++){
s+=mesPoints[i]+"\n";
}
s+="}\n";
return s;
}
}
Exercice 4.5
Soit le diagramme de classes d'UML suivant :
1. Ecrire le programme "Banque.java" permettant d'implmenter la
classe "Banque"
2. Ecrire un programme "test.java" pour :
Crer un compte : 1, 5000.75, "AB 1200"
Afficher les informations de ce compte
Afficher son solde
Dposer 500
Afficher les informations de ce compte
Afficher son solde
Retirer 200
Afficher les informations de ce compte
Afficher son solde
3. Refaire la question prcdente de telle sorte que les informations
du compte seront passes en argument
Solution :
public class banque {
private int NCompte;
private float Solde;
private String CIN;
public banque(int NCompte,float Solde,String CIN){
this.NCompte=NCompte;
this.Solde=Solde;
this.CIN=CIN;}
public int getn(){
return NCompte;}
public void deposer(float Somme){
Solde=Solde+Somme;}
public void retirer(float Somme){
if(Solde<Somme)
System.out.println("SOLDE INSUFFISANT");
else
Solde=Solde-Somme;}
public float avoirSolde(){
return Solde;}
public String avoirInf(){
return("N carte:"+CIN+ "\nsolde:"+Solde +
"NCompte"+NCompte);}}
public class test {
public static void main(String[] args) {
banque b = new banque(1,5000,"AB1200");
System.out.println(b.avoirInf());
System.out.println(b.avoirSolde());
b.deposer(500);
System.out.println(b.avoirInf());
System.out.println(b.avoirSolde());
b.retirer(7000);
System.out.println(b.avoirInf());
System.out.println(b.avoirSolde());}}
V. Les Tableaux
Exercice 5.1
Ecrire un programme qu'initialise un tableau de 100 entiers multiples
de 4 et l'affiche l'cran 10nombres par ligne
Solution :
public class Tab4 {
public static void main(String[] args) {
int tab4[] = new int[100];
int j = 0;
for (int i = 0; i < 100; i++) {
tab4[i] = j;
j += 4;
}
for (int i = 0; i < 100; i++) {
System.out.print(tab4[i] + " ");
if((i+1)%10==0)
System.out.println();
}
}
}
Exercice 5.2
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
Solution
// Construction triangle de Pascal et affichage.
Exercice 5.3
Solution
import java.util.*;
public class maxmin {
public static void main(String[] args) {
int t[]=new int[10];
for(int i=0;i<10;i++){
t[i]=(int) (10*Math.random()+0);}
for(int i=0;i<10;i++){
System.out.print(" "+t[i]+" "); }
int max=t[0], min=t[0], pos=t[0], p=t[0];
for(int i=0;i<10;i++){
if(t[i]>max){
max=t[i];
pos=i;}
if(t[i]<min){
min=t[i];
p=i;}}
System.out.println("\nle maximim est :"+max+" il est
dans la position:"+pos);
System.out.println("le minimum est :"+min+" il est dans
la position:"+p);}}
Exercice 5.4
Crer un tableau dentier. Insrer un lment dans un tableau. La
position dinsertion est donn par lutilisateur (au dbut, la fin
et au milieu)
Solution :
public class Insertion {
public static void main(String[] args) {
Scanner sc=new
Scanner(System.in);
int t[] = new
int[10],pos,x;
for(int i=0;i<10;i++)
t[i]= (int)
(11*Math.random()+11);
for(int
i=0;i<10;i++)
System.out.print("
"+t[i]+" ");
Exercice 5.5 :
Ecrire un programme, mais cette fois ci pour supprimer un lment
dun tableau de String partir de son indice. Distinguer le cas ou
lindice nexiste pas dans le tableau
Solution :
import java.util.*;
public class suppression {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t[] = new int[10],pos=0;
int trouve=1;
for(int i=0;i<10;i++)
t[i]= (int) (11*Math.random()+11);
for(int i=0;i<10;i++)
System.out.print(" "+t[i]+" ");
System.out.println("\nEntrez l'entier que vous voulez
supprimer:");
int x=sc.nextInt();
for(int i=0;i<10;i++){
if(t[i]==x)
pos=i;
else trouve=0; }
if(trouve==0)
System.out.println("L'lment recherch est supprim !");
System.out.println(" voici le nouveau tableau : ");
for(int i=pos;i<9;i++)
t[i]=t[i+1];
for(int i=0;i<9;i++)
System.out.print(" "+t[i]+" "); }}
Exercice 5.6 :
Quels rsultats fournit le programme suivant ?
public class Matrice
{ public static void main (String args[])
{ int [] [] t = new int [3][] ;
for (int i=0 ; i<3 ; i++)
{ t[i] = new int [i+1] ;
for (int j=0 ; j<t[i].length ; j++)
t[i][j] = i+j ;
}
for (int i=0 ; i<3 ; i++)
{ System.out.print ("tableau numero " + i + " = ") ;
for (int j=0 ; j<t[i].length ; j++)
System.out.print (t[i][j] + " ") ;
System.out.println () ;
}}}
Solution :
Pour chaque valeur de i :
linstruction :
t[i] = new int [i+1] ;
cre un tableau dentiers de taille i+1 et en place la rfrence dans
t[i].
linstruction :
t[i][j] = i+j ;
place des valeurs dans chacun des i+1 lments de ce tableau.
Do les rsultats :
tableau numero 0 = 0
tableau numero 1 = 1 2
tableau numero 2 = 2 3 4
VI. LHritage et le Polymorphisme
Exercice 6.1 :
a) On a la classe suivante :
public class A extends B{
....
}
Cela signifie que (une seule rponse) :
o A a un B
o A est relie a un B
o A dpends de B
o A exclue un B
o A prcde un B
o A est un B
Exercice 6.2 :
Le directeur des systmes dinformation de la socit COLAPS souhaite
dvelopper un module pour la gestion des utilisateurs de son service,
pour cela il vous a fait appel pour raliser cette tche.
Le diagramme de classe a t tabli par un analyste afin de mettre en
place une base de donnes sous ORACLE ou MySQL :
Larborescence du projet :
La classe Profile :
package Heritage;
public class Profile {
private int id;
private String code;
private String libelle;
private static int comp;
public Profile(String code, String libelle) {
comp++;
this.id = comp;
this.code = code;
this.libelle = libelle;
}
public Profile(){
comp++;
this.id = comp;}
public String getCode() {
return code;}
public void setCode(String code) {
this.code = code;}
public String getLibelle() {
return libelle;}
public void setLibelle(String libelle) {
this.libelle = libelle;}}
La classe Personne :
package Heritage;
public class Personne {
protected int id;
protected String nom;
protected String prenom;
protected String email;
protected String telephone;
protected double salaire;
private static int comp;
public Personne(String nom, String prenom, String email, String
telephone, double salaire) {
comp++;
this.id = comp;
this.nom = nom;
this.prenom = prenom;
this.email = email;
this.telephone = telephone;
this.salaire = salaire;
}
public Personne(){
comp++;
this.id = comp;
}
public double calculerSalaire(){
return this.salaire;
}
public void afficher(){
System.out.print(this.nom+" "+this.prenom+" "+this.telephone);
}
}
La classe Utilisateur :
package Heritage;
public class Utilisateur extends Personne {
private String login;
private String password;
private String service;
private Profile profile;
public Utilisateur(String nom, String prenom, String email,String
telephone, double salaire, String login, String password,String
service, Profile profile) {
super(nom, prenom, email, telephone, salaire);
this.login = login;
this.password = password;
this.service = service;
this.profile = profile;}
public Profile getProfile() {
return profile;}
public void setProfile(Profile profile) {
this.profile = profile;}
public double calculerSalaire(){
if(this.profile.getCode().equals("MN")) return this.salaire + 0.1 *
this.salaire;
if(this.profile.getCode().equals("DG")) return this.salaire + 0.4 *
this.salaire;
return this.salaire;}
public void afficher(){
super.afficher();
System.out.println(" "+profile.getLibelle()+" "+
calculerSalaire());}}
La classe Test :
package Heritage;
public class Test {
public static void main(String[] args) {
Profile profile[] = new Profile[5];
profile[0] = new Profile("CP","Chef de projet");
profile[1] = new Profile("DP","Directeur de projet");
profile[2] = new Profile("MN","Manager");
profile[3] = new Profile("DRH","Directeur de ressources humaine");
profile[4] = new Profile("DG","Directeur general");
Utilisateur user[] = new Utilisateur[5];
user[0] = new Utilisateur("SMI", "Mohamed", "[email protected]","1234",
1200.00,"alaoui", "12354", "Sevice des ressources humaines",
profile[3] );
user[1] = new Utilisateur("IGE", "Maoun", "[email protected]", "1234",
1200.00, "dourid", "12354", "Sevice des ressources humaines",
profile[2] );
user[2] = new Utilisateur("GL", "Youri", "[email protected]", "1234",
1200.00, "lachgar", "12354", "Manager", profile[1] );
user[3] = new Utilisateur("LAOUD", "Karima", "[email protected]", "1234",
1300.00, "laoud", "12354", "manager", profile[2] );
user[4] = new Utilisateur("SMI", "Emad", "[email protected]", "1234",
1200.00, "alaoui", "12354", "Sevice des ressources humaines",
profile[3] );
for (Utilisateur p : user){
if(p.getProfile().getCode().equals("MN"))p.afficher();
if(p.getProfile().getCode().equals("DP"))p.afficher();
if(p.getProfile().getCode().equals("DRH"))p.afficher();
} } }
Exercice 6.3 : Drivations successives et
redfinition
Quels rsultats fournit le programme suivant ?
class A {
public void affiche() {
System.out.println ("Je suis un A") ;
} }
class B extends A { }
class C extends A {
public void affiche() {
System.out.println ("Je suis un C") ;
} }
class D extends C {
public void affiche() {
System.out.println ("Je suis un D") ;
} }
class E extends B {}
class F extends C {}
Solution:
** A **
A.f(double=1.0) A.f(double=5.0)
** B **
A.f(double=1.0) A.f(double=5.0)
A.f(double=1.0) A.f(double=5.0)
** C **
C.f(long=1) C.f(long=4) A.f(double=5.0)
A.f(double=1.0) A.f(double=4.0) A.f(double=5.0)
** D **
D.f(int=1) C.f(long=4) A.f(double=6.0)
A.f(double=1.0) A.f(double=4.0) A.f(double=6.0)
** F **
F.f(int=1) F.f(int=3) F.f(float=5.0) A.f(double=6.0)
A.f(double=1.0) A.f(double=3.0) A.f(double=5.0) A.f(double=6.0)
C.f(long=1) C.f(long=3) A.f(double=5.0) A.f(double=6.0)
Exercice 6.5: Gestion dune bibliothque
Pour la gestion dune bibliothque on nous demande dcrire une
application traitant des documentsde nature diverse : des livres, qui
peuvent tre des romansou des manuels, des revues, des dictionnaires,
etc.
Tous les documents ont un numro denregistrement (un entier) et un
titre (une chane de caractres). Les livres ont, en plus, un auteur
(une chane) et un nombre de pages (un entier). Les romans ont
ventuellement un prix littraire (un entier conventionnel, parmi :
GONCOURT, MEDICIS, INTERALLIE, etc.), tandis que les manuels ont un
niveau scolaire (un entier). Les revues ont un mois et une anne (des
entiers) et les dictionnaires ont une langue (une chane de
caractres appartenant un ensemble prdfini, comme "anglais",
"allemand", "espagnol", etc.).
Tous les divers objets en question ici (livres, revues,
dictionnaires, romans, etc.) doivent pouvoir tremanipules en tant
que documents. Voici le diagramme de classes :
Solution:
Question A
Fichier Document.java
Fichier Livre.java
Fichier Roman.java
Fichier Manuel.java
Fichier Revue.java
public class Revue extends Document {
private int mois, annee;
Fichier Dictionnaire.java
Question B
Fichier Bibliotheque.java
bib.afficherDocuments();
System.out.println("-----------------------------------------
--------------------");
bib.afficherAuteurs();
System.out.println("-----------------------------------------
--------------------");
Question C
Fichier Livrotheque.java
En effet, cette mthode najoute que des livres, mais elle nest pas
une redfinition de la mthode ajouter(Document doc) hrite, qui
reste donc utilisable cte de ajouter(Livre doc) (cela sappelle la
surcharge des noms des fonctions).
appui en 172 74
relachement en 172 74
appui en 166 126
relachement en 166 126
appui en 72 75
relachement en 239 131
appui en 49 85
relachement en -57 100
Solution2 :
Cette fois, il est ncessaire de dfinir une classe distincte de MaFenetre (ici
Ecout) implmentantlinterface MouseListener. La dfinition des mthodes concernes
peut cependant rester lamme que prcdemment. Dans le constructeur de MaFenetre,
on associe la fentre un objetcouteur de type Ecout par add (new Ecout()).
import javax.swing.* ; // pour JFrame
import java.awt.event.* ; // pour MouseEvent et MouseListener
class MaFenetre extends JFrame
{ public MaFenetre () // constructeur
{ setTitle ("Gestion de clics") ;
setBounds (10, 20, 300, 200) ;
addMouseListener (new Ecout()) ; // on ecoute avec un objet de type
Ecout
}
}
class Ecout implements MouseListener
{ public void mousePressed (MouseEvent ev)
{ System.out.println ("appui en " + ev.getX() + " " + ev.getY()) ;
}
public void mouseReleased(MouseEvent ev)
{ System.out.println ("relachement en " + ev.getX() + " " +
ev.getY()) ;
}
public void mouseClicked(MouseEvent ev) {}
public void mouseEntered (MouseEvent ev) {}
public void mouseExited (MouseEvent ev) {}
}
public class Clic2
{ public static void main (String args[])
{ MaFenetre fen = new MaFenetre() ;
fen.setVisible(true) ;
}
}
double chiffre1;
double chiffre2;
double resultat;
int clickpuls, clickmoins, clickfois,clicksur,clickpuissance;
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
private void btnonoffActionPerformed(java.awt.event.ActionEvent
evt) {
if (ecran.getText().equals(""))
{ ecran.setText("0");}
else { ecran.setText("");} }
chiffre1= Double.parseDouble(ecran.getText());
ecran.setText("0");
clickmoins =1;
}
}
private void
btnmultiplicationActionPerformed(java.awt.event.ActionEvent evt) {
if (!ecran.getText().equals(""))
{
chiffre1= Double.parseDouble(ecran.getText());
ecran.setText("0");
clickfois =1;
}
}
chiffre1= Double.parseDouble(ecran.getText());
ecran.setText("0");
clicksur =1;
}
}
if (clickpuls ==1)
{
resultat= chiffre1 + chiffre2;
ecran.setText(String.valueOf(resultat));
clickpuls =0;
resultat =0;
}//////////////////////
if (clickmoins ==1)
{
resultat= chiffre1 - chiffre2;
ecran.setText(String.valueOf(resultat));
clickmoins =0;
resultat =0;
}//////////////////////////////////
if (clicksur ==1)
{
if (chiffre2 !=0)
{
resultat= chiffre1 / chiffre2;
ecran.setText(String.valueOf(resultat));
}
else
{
ecran.setText("Division par zero impossible");
}
clicksur =0;
resultat =0;
}////////////////////
if (clickfois ==1)
{
resultat= chiffre1 * chiffre2;
ecran.setText(String.valueOf(resultat));
clickfois =0;
resultat =0;
}////////////////////////////////////
if (clickpuissance ==1)
{
resultat= Math.pow(chiffre1, chiffre2);
ecran.setText(String.valueOf(resultat));
clickpuissance =0;
resultat =0;
}
}
}
Exercice 7.3:
Cration de boutons et choixdun gestionnaire FlowLayout
Solution :
Rappelons quon ajoute un composant (tel un bouton), non pas
directement un objet fentre (type JFrame ou driv), mais son
contenu (objet de type Container) dont on obtient la rfrence
laide de la mthode getContentPane de la classe JFrame.
Par ailleurs, ici, on ne peut pas se contenter dutiliser le
gestionnaire par dfaut de JFrame qui est de type BorderLayout (il ne
permet de placer quau maximum 5 composants). Il faut utiliser un
gestionnaire de type FlowLayout. Le choix dun gestionnaire se fait
laide de la mthode setLayout quon applique l encore au contenu de
la fentre, et laquelle on transmet en argument la rfrence dun
objet du type voulu.
import javax.swing.* ;
import java.awt.* ;
class FenBoutons extends JFrame
{
public FenBoutons (int nBout)
{ setTitle ("BOUTONS") ;
setSize (200, 150) ;
Container contenu = getContentPane() ;
contenu.setLayout (new FlowLayout()) ;
for (int i=0 ; i<nBout ; i++)
{ unBouton = new JButton ("BOUTON"+(i+1)) ;
contenu.add(unBouton) ;
}
}
private JButton unBouton ;
}
public class Boutons
{ public static void main (String args[])
{ System.out.print ("Combien de boutons ? ") ;
int nBoutons = Clavier.lireInt() ;
FenBoutons fen = new FenBoutons(nBoutons) ;
fen.setVisible(true) ;
}
}
Solution :
Nous placerons les trois cases dans un panneau associ la fentre. Nous
faisons de la fentrelcouteur des boutons et des cases. Comme limpose
lnonc, nous redfinissons la fois lesmthodes actionPerformed et
itemStateChanged.
import javax.swing.* ;
import java.awt.* ;
import java.awt.event.* ;
Solution :
Ici, nous pouvons nous permettre dintroduire directement dans la fentre les
diffrentscontrles dont nous avons besoin. Nous remplaons simplement le
gestionnaire par dfaut parun gestionnaire de type FlowLayout.
Nous utilisons des objets de type JLabel pour les libells, ainsi que pour la
valeur du carr. Lasaisie du nombre se fait dans un objet nomm nombre de type
JTextField.
Ici, nous navons pas nous proccuper des vnements gnrs par nombre puisque
le calculproprement dit est dclench par une action extrieure lobjet. En
revanche, nous devonstraiter les vnements de type Action dclenchs par le
bouton. Nous y rcuprons le contenudu champ texte que nous convertissons en entier
avec la mthode Integer.parseInt. Celle-cidclenche une exception
NumberFormatException lorsque la chane ne correspond pas unnombre entier (y
compris lorsquelle contient trop de chiffres). Dans le gestionnaire
dexceptioncorrespondant, nous nous contentons de remettre blanc le contenu du
champ texte.
Ici, nous calculons le carr du nombre dans le type long, ce qui vite tout
problme dedpassement de capacit.
import java.awt.* ;
import java.awt.event.* ;
import javax.swing.* ;
class MaFenetre extends JFrame implements ActionListener
{ public MaFenetre ()
{ setTitle ("Carres") ;
setSize (400, 100) ;
Container contenu = getContentPane() ;
contenu.setLayout (new FlowLayout() ) ;
labNombre = new JLabel (etiqNombre) ;
contenu.add(labNombre) ;
nombre = new JTextField (10) ;
contenu.add(nombre) ;
boutonCalcul = new JButton ("CALCUL") ;
contenu.add(boutonCalcul) ;
boutonCalcul.addActionListener(this) ;
labCarre = new JLabel (etiqCarre) ;
contenu.add(labCarre) ;
}
public void actionPerformed (ActionEvent e)
{ if (e.getSource() == boutonCalcul)
try
{ String texte = nombre.getText() ;
int n = Integer.parseInt(texte) ;
long carre = (long)n*(long)n ;
labCarre.setText (etiqCarre + carre) ;
}
catch (NumberFormatException ex)
{ nombre.setText ("") ;
labCarre.setText (etiqCarre) ;
}
}
private JLabel labNombre, labCarre ;
private JTextField nombre ;
static private String etiqNombre = "Nombre : ", etiqCarre = "Carre :
" ;
private JButton boutonCalcul ;
}
public class Carre
{ public static void main (String args[])
{ MaFenetre fen = new MaFenetre() ;
fen.setVisible(true) ;
}
}
Exercice 7.6:Cration dun menu droulant usuel
Crer une fentre (drive de JFrame) munie dune barre de menus
constitue :
dun menu Fichier comportant les options : Ouvrir, Sauvegarder et
Fermer,
dun menu Edition comportant les options : Copier et Coller.
I. La Classe Horloge :
package realisation_horloge;
import java.awt.*;
import java.util.*;
public class Horloge extends Object
{
private Color couleurSec;
private Color couleurMin;
private Color couleurHeure;
private Color couleurCercle;
private Color couleurNb;
private Color couleurFond;
private Dimension dimension; //taille de l'horloge
private FontMetrics fm;
private Point centre;
private Point debut;
private int rayon;
private int diam; //diamtre de l'horloge
private Point[] coordNb; // coordonnes des emplacements des
12 nombres
private String[] txtNb; // les 12 nombres au format texte
(12, 1, 2, ...)
private int raySec; //rayon de l'aiguille des secondes
private int rayMin; //rayon de l'aiguille des minutes
private int rayHeure; //rayon de l'aiguille des heures
private double sa = Math.PI / 2; //radians pour 1/4 de cercle
private double rs1s = Math.PI / 30; //rotation de 1 sec de
l'aiguille des secondes
private double rm1s = rs1s / 60; //rotation de 1 sec de
l'aiguille des minutes
private double rh1s = rm1s / 12; //Constructeur
public Horloge(Rectangle rect, FontMetrics fm) {
this.fm = fm;
couleurCercle = Color.lightGray;
couleurNb = Color.black;
couleurSec = Color.red;
couleurMin = Color.black;
couleurHeure = Color.black;
couleurFond = Color.white;
dimension = new Dimension(rect.width, rect.height);
diam = Math.min(rect.width, rect.height);
rayon = diam / 2;
debut = new Point(rect.x, rect.y);
centre = new Point(debut.x + rayon, debut.y + rayon);
raySec = rayon;
rayMin = (int) (.9 * rayon);
rayHeure = (int) (.5 * rayon);
calcPosNum((int) (rayon*8/ 10)); }
public void draw(Graphics g)
{
Date date = new Date();
int s = date.getSeconds();
int m = date.getMinutes();
int h = date.getHours() % 12;
int ms = m * 60;
int hs = h * 60 * 60;
//On efface la zone de l'horloge
g.setColor(couleurFond);
g.fillRect(debut.x, debut.y, dimension.width, dimension.height);
// On dessine le cercle plein
g.setColor(couleurCercle);
g.fillOval(debut.x, debut.y, diam, diam);
// On dessine les 12 nombres
g.setColor(couleurNb);
g.drawOval(debut.x, debut.y, diam, diam);
for (int i = 0; i < coordNb.length; i++)
{
g.drawString(txtNb[i], coordNb[i].x, coordNb[i].y);
}
// Dessin de l'aiguille des secondes
g.setColor(couleurSec);
int sx = (int) ((Math.cos((s * rs1s) - sa) * raySec) +
centre.x);
int sy = (int) ((Math.sin((s * rs1s) - sa) * raySec) +
centre.y);
g.drawLine(centre.x, centre.y, sx, sy);
// Dessin de l'aiguille des minutes
g.setColor(couleurMin);
int mx = (int) ((Math.cos(((ms + s) * rm1s) - sa) * rayMin) +
centre.x);
int my = (int) ((Math.sin(((ms + s) * rm1s) - sa) * rayMin) +
centre.y);
g.drawLine(centre.x, centre.y - 1, mx, my);
g.drawLine(centre.x - 1, centre.y, mx, my);
// Dessin de l'aiguille des heures
g.setColor(couleurHeure);
int hx = (int) ((Math.cos(((hs + ms + s) * rh1s) - sa) *
rayHeure) + centre.x);
int hy = (int) ((Math.sin(((hs + ms + s) * rh1s) - sa) *
rayHeure) + centre.y);
g.drawLine(centre.x, centre.y - 2, hx, hy);
g.drawLine(centre.x - 2, centre.y, hx, hy);
}
private void calcPosNum(int r)
{
coordNb = new Point[12];
txtNb = new String[12];
double nda = Math.PI / 6; // angle de 30 en radians
txtNb[0] = "12";
for (int i = 1; i < coordNb.length; i++)
{
txtNb[i] = Integer.toString(i);
}
int a = fm.getMaxAscent();
int h = (fm.getMaxAscent() + fm.getMaxDescent()) / 2;
// Calcul des positions des nombres
for (int i = 0; i < coordNb.length; i++)
{
int nx = (int) ((Math.cos((i * nda) - sa) * r) + centre.x);
int ny = (int) ((Math.sin((i * nda) - sa) * r) + centre.y);
int w = fm.stringWidth(txtNb[i]) / 2;
coordNb[i] = new Point(nx - w, ny + a - h);
}}}
II. La Classe AppletHorloge
package realisation_horloge;
import java.applet.*;
import java.awt.*;
public class AppletHorloge extends Applet implements Runnable {
private Horloge horloge;
private Image tmpImage; // image pour le double-buffering
private Graphics tmpG; // contexte graphique pour le double-buffering
private Thread animation;
private Dimension dimension;
private long delai; //en ms
private FontMetrics fm;
private Color couleurFond;
private Font font;
private int bordure;
private Rectangle rect;
public void init() {
dimension = size();
couleurFond = Color.blue;
setBackground(couleurFond);
delai = 100;
bordure = 10;
// Creation de l'image tampon pour le double-buffering
tmpImage = createImage(dimension.width, dimension.height);
tmpG = tmpImage.getGraphics(); //nouveau contexte graphique de
l'image
tmpG.setColor(couleurFond);
tmpG.fillRect(0, 0, dimension.width, dimension.height);
rect = new Rectangle( bordure,
bordure,
dimension.width - (2 * bordure),
dimension.height - (2 * bordure));
font = new Font("TimesRoman", Font.BOLD, 12);
tmpG.setFont(font);
fm = tmpG.getFontMetrics();
horloge = new Horloge(rect, fm);
}
public void start() {
if ((animation == null) || (!animation.isAlive())) {
animation = new Thread(this);
}
animation.start();
}
public void run() {
while (Thread.currentThread() == animation) {
try {
repaint(); //on provoque le redessin de l'image
Thread.sleep(delai); //et on attend
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void update(Graphics g) {
horloge.draw(tmpG);
paint(g);
}
public void paint(Graphics g) {
g.drawImage(tmpImage, 0, 0, this);
}
public void stop() {
if ((animation != null) && (animation.isAlive())) {
animation.stop();
}
}
public void destroy() {
animation = null; // provoque l'arret de l'animation (boucle while de
run() )
tmpG.dispose(); // libration des ressources du contexte graphique
}
}