Académique Documents
Professionnel Documents
Culture Documents
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Génie Informatique
1
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Solution : TD n° 1
Solution :
a + b - 2 * c // expression 1
2 * x / (y * z) // expression 2
On pourrait aussi écrire cette expression 2*x/y/z mais l’ordre des calculs sera différent, ce qui
peut avoir une légère incidence sur le résultat.
(x + 3) * (n%p) // expression 3
Ici aucune parenthèse ne peut être supprimée car * et % sont de même priorité ; la suppression
de la seconde paire de parenthèses conduirait à une expression équivalent à : ((x+3)*n)%p.
-a / -(b + c) // expression 4
Ne pas oublier que l’opérateur unaire - est prioritaire sur tous les opérateurs arithmétiques à
deux opérandes.
x/y%-z // expression 5
x/(y%-z) // expression 6
Solution :
b1+b2 = 30 // 1
L’opérateur + soumet les valeurs de b1 et b2 à la promotion numérique de byte en int. Le
résutat est de type int.
p+b1 = 210 // 2
L’opérateur + soumet ses opérandes à des promotions numériques : de short en int pour p et de
byte en int pour b1. Le résultat est de type int.
b1*b2 = 200 // 3
Là encore, avant d’effectuer le produit, les valeurs de b1 et de b2 sont soumises à la promotion
numérique de byte en int. Le résultat est de type int.
q+p*(b1+b2) = 6100 // 4
On évalue tout d’abord la somme s=b1+b2, en soumettant les valeurs des deux opérandes aux
promotions numériques de byte en int. La valeur de s est de type int. Puis on effectue la somme
q+p en soumettant le second opérande à une conversion d’ajustement de type de short en long
(type de q). Le résultat est de type long. Il faut maintenant le multiplier par s, ce qui se fait en
soumettant la valeur de s à une conversion d’ajustement de type de int en long. Le résultat final
est de type long.
x+q*n =50002.5 // 5
On évalue tout d’abord le produit q*n en soumettant la valeur de n à une conversion d’ajustement
de type de int en long. Le résultat est de type long. Pour pouvoir l’ajouter à la valeur de
x, on le soumet à une conversion d’ajustement de type de long en float. Le résultat est de type
float.
b1*q/x=400.0 // 6
On évalue tout d’abord le quotient q/x en soumettant la valeur de q à une conversion d’ajustement
de type de long en float. Le résultat est de type float. Pour pouvoir lui ajouter la valeur de
2
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
b1, on soumet cette dernière à une conversion d’ajustement de type de byte en float (ou, ce qui
revient au même, d’abord à une promotion numérique de byte en int, puis à une conversion
d’ajustement de type de int en float). Le résultat est de type float.
b1*q*2./x=800.0 // 7
On évalue tout d’abord le produit q*2., en soumettant la valeur de q à une conversion d’ajustement
de type de long en double (attention, la constante 2. est de type double et non de type
float). Le résultat est de type double. Il est divisé par la valeur obtenue par conversion d’ajustement
de type de x de float en double. Le résultat, de type double est alors multiplié par la
valeur obtenue par conversion d’ajustement de type de b1 en double. Le résultat est de type
double.
b1*q*2.f/x=800.0 // 8
Il s’agit de l’expression précédente, dans laquelle la constante 2. (de type double) est
remplacée par 2.f de type float. La même démarche s’applique, en substituant le type float au
type double. Le résultat final est de type float.
-------
B) Soit ces déclarations :
char c = 60, ce = 'e', cg = 'g' ; byte b = 10 ;
Donner le type et la valeur des expressions suivantes :
Solution :
c + 1 = 61
L’opérateur + soumet ici son premier opérande à la promotion numérique de char en int, ce
qui fournit la valeur 601. Le résultat est de type int.
2 * c = 120
L’opérateur * soumet ici son second opérande à la promotion numérique de char en int, ce qui
fournit la valeur 602. Le résultat est de type int.
cg - ce = 2
L’opérateur - soumet ici ses deux opérandes à la promotion numérique de char en int. On
obtient un résultat de type int qui représente l’écart entre les codes des caractères g et e (dans
le code Unicode, les lettres consécutives d’une même casse ont des codes consécutifs).
b * c = 600
L’opérateur * soumet ici ses deux opérandes aux promotions numériques : de byte en int pour
le premier, de char en int pour le second. On notera qu’aucun problème de dépassement de
capacité n’apparaît puisque le produit est bien effectué dans le type int (il en irait différemment
s’il était effectué dans le type byte puisque 600 n’est pas représentable dans ce type).
Parmi les expressions suivantes, lesquelles sont incorrectes et pourquoi ? Lorsque l’expression est correcte, citer
les conversions éventuellement mises en jeu.
Solution :
b = n ; // 1 Erreur
La conversion de int en byte n’est pas autorisée par affectation.
b = 25 ; // 2 OK
D’une manière générale, la conversion de int en byte n’est pas acceptée par affectation. Mais
une exception a lieu pour les expressions constantes (calculables à la compilation), à condition
que leur valeur soit représentable dans le type d’arrivée, ce qui est manifestement le cas ici.
b = 500 ; // 3 Erreur
On est dans la même situation que précédemment, avec cette différence que la valeur 500 n’est
pas représentable dans le type byte.
x = 2*q ; // 4 OK
Ici, l’expression 2*q est évaluée en effectuant la conversion d’ajustement de type de 2 en long.
3
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Puis le résultat, de type long, est converti dans le type float avant d’être affecté à x.
y = b*b ; // 5 OK
La valeur de l’expression b*b est évaluée en effectuant la promotion numérique de b en int. Le
résultat, de type int, est converti dans le type double avant d’être affecté à y.
p = b*b ; // 6 Erreur
Là encore, la valeur de l’expression b*b est de type int. La conversion de int en short est illégale
par affectation.
b = b+5 ; // 7 Erreur
La valeur de l’expression b+5 est de type int. La conversion de int en short est illégale par
affectation.
p = 5*N-3 ; // 8 OK
L’expression 5*N-3 est de type int. Mais comme il s’agit d’une expression constante (calculable
à la compilation), sa conversion en short est légale par affectation pour peu que sa valeur
soit représentable dans ce type, ce qui est le cas ici.
Exercice 3
Quels résultats fournit ce programme ?
public class CourCir
{ public static void main (String args[])
{ int i=10, j=5 ;
Solution :
&&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é particulière dont bénéficient les opérateurs &&
et || dits à court-circuit. Ils n’évaluent leur second opérande que lorsque cela est nécessaire.
----
A : n = 15 p = 10 q = 5
B : n = 15 p = 11 q = 10
C : n = 16 p = 11 q = 15
4
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Solution : TD n° 2
Solution :
return p[--pos];
}
x: abscisse du point,
y: ordonnée du point.
La classe Point doit disposer des constructeurs suivants:
Point(): constructeur par défaut
6
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Point(x, y),
Point(Point).
La classe Point doit contenir des accesseurs et mutateurs pour les différents
attributs. Elle doit aussi contenir les méthodes:
distance(x, y),
distance(Point),
distance(x1, y1, x2, y2): version statique,
deplacer(x, y),
translater(dx, dy),
toString(): donne une représentation d'un point.
7
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
}
public double getY() {
return this.y;
}
Solution : TD n° 3
EXERCICE 1 :
import java.io.* ;
public class Console {
public static void printString(String myStr){
System.out.println(myStr) ;
8
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
}
public static String readString() throws IOException {
String myStr = null ;
BufferedReader inputStream = new BufferedReader(new
InputStreamReader(System.in)) ;
myStr = inputStream.readLine() ;
return myStr ;
}
public static void printInt(int myInt){
System.out.println(myInt) ;
}
public static int readInt() throws IOException , NumberFormatException {
int n = Integer.parseInt(readString()) ;
return n ;
}
1. Ecrire dans une classe séparée un programme principal permettant de tester ces
méthodes.
// fichier TestConsole.java
public class TestConsole {
public static void main(String[] argv){
try{
Console.printString("Saisissez une chaine") ;
String myStr = Console.readString() ;
Console.printString("Vous avez saisi : "+ myStr ) ;
Console.printString("Saisissez un nombre") ;
int n = Console.readInt() ;
Console.printString("Vous avez saisi : "+ n ) ;
}
catch(Exception e){
// affichage sur la sortie d'erreur standard.
// on peut aussi utiliser System.out.println
System.err.println(e) ;
}
}
}
// fichier ReadIntException.java
public class ReadIntException extends Exception {
public ReadIntException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
// fichier ReadStringException.java
public class ReadStringException extends Exception {
public ReadStringException(String message) {
super(message);
9
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
/**
* Lit un entier sur l'entree standard.
* @throws IOException si l'opération de lecture echoue.
* @throws NumberFormatException si la suite de caracteres lus ne correspond pas a un entier.
*/
public static int readInt() throws ReadIntException {
int n = 0 ;
try{
n = Integer.parseInt(readString()) ;
}
// exception eventuellement levee par readString()
catch(ReadStringException e){
throw new ReadIntException("La lecture a ¶echou¶e") ;
}
// exception eventuellement levee par Integer.parseInt
catch(NumberFormatException e){
throw new ReadIntException("Ce n'est pas un nombre entier") ;
}
return n ;
}
----------------
Exercice 2
Expliquer le comportement des programmes.
Programme 1:
class Essai1Exception extends Exception{
Essai1Exception(String s){
super(s) ;}
}
class Essai2Exception extends Essai1Exception{
Essai2Exception(String s){
super(s) ;}
}
public class Exn{
static void throwEssais(int i) throws Exception {
switch (i){
case 1:
10
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
System.out.println("Lancement de Essai1Exception") ;
throw new Essai1Exception ("Essai1Exception de throwEssais") ;
case 2:
System.out.println("Lancement de Essai2Exception") ;
throw new Essai2Exception ("Essai2Exception de throwEssais") ;
default:
System.out.println("Lancement de Exception") ;
throw new Exception("Exception de throwEssais") ;
}}
public static void main(String[] args){
for (int i = 1 ; i <=3 ; i++){
try {
Exn.throwEssais(i) ;
}
catch (Essai2Exception e){ System.out.println("Catch Essai2: " + e.getMessage()) ;
}
catch (Essai1Exception e){ System.out.println("Catch Essai1: " + e.getMessage()) ;
}
catch (Exception e){ System.out.println("Catch Exception : " + e.getMessage()) ;
}
finally { System.out.println("Finally de main.") ;
}
}
}
}
Programme 2:
try {
throwEssais(i) ;
}
catch (Essai1Exception e){ System.out.println("Catch Essai1: " +
e.getMessage()) ;
}
catch (Essai2Exception e){ System.out.println("Catch Essai2: " +
e.getMessage()) ;
}
catch (Exception e){ System.out.println("Catch Exception : " +
e.getMessage()) ;
}
finally { System.out.println("Finally de main.") ;
}
} }}
---------------------
Correction : Faites tourner le programme et regardez comment sont définis les types des
exceptions :
**dans le premier exemple, Essai2Exception est un sous type de Essai1Exception qui est un
sous type de Exception. Le premier bloc catch récupère donc à la fois les exceptions
Essai2Exception et Essai1Exception.
12
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Classe : Marchandise
import java.util.ArrayList;
import java.util.Iterator;
13
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
}
public void ajouter(Marchandise m){
vectt.add(m);
Marchandise mar ;
Iterator <Marchandise> i = vectt.listIterator();
while (i.hasNext()){
mar =i.next();
if(mar.numero == num ){
return mar.toString();
}
}
return "Non Trouvée !!! ";
}}
Classe CargaisonRoutiere
import java.util.Iterator;
public class CargaisonRoutière extends Cargaison {
public CargaisonRoutière(double distance) {
super(distance);
}
14
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Classe CargaisonAérienne
import java.util.Iterator;
public class CargaisonAérienne extends Cargaison {
public CargaisonAérienne(double distance) {
super(distance);
}
public double cout() {
double c =0,v = 0,p=0;
Iterator<Marchandise> it = vectt.iterator();
while(it.hasNext()){
v+=it.next().volume;
p+=it.next().poids;
}
if(v< 80000)
c = 10*distance*p;
else c = 12*distance*p;
return c;
}
Application :
}}
16
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
Solution : TD n° 5
17
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
18
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
19
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
20
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
21
er
Université Hassan 1
Faculté des Sciences et Techniques
Département Mathématiques et Informatique
Filière : GI 2014/2015
(a) Hewlett-Packard
(b) Sun Microsystems
(c) Microsoft
(d) Oracle
3. Combien d’instances de la classe A crée le code suivant?
A x,u,v;
x=new A();
A y=x;
A z=new A();
(a) Aucune
(b) Cinq
(c) Trois
(d) Deux
4. Pour la classe B définie comme suit:
class B {
public B() {System.out.print("Ciao");};
public B(int i) {this(); System.out.println("Bonjour "+i);};
}
5.
(a) Une classe peut implémenter plusieurs interfaces mais doit étendre une seule classe
(b) Une classe peut implémenter plusieurs classes mais doit étendre une seule interface
(c) Une classe peut implémenter plusieurs classes et peut étendre plusieurs interfaces
(d) Une classe doit implémenter une seule interface et étendre une seule classe
(a) l’encapsulation
(b) le polymorphisme
(c) l’héritage
(d) la marginalisation
7. Etant donné que la classe Grande étend la classe Petite, trouvez une ligne correcte
parmi les suivantes
class C {
public static int i;
public int j;
public C() {i++; j=i; }
}
(a) 2 et 2
(b) 1 et 1
(c) 2 et 1
(d) 1 et 3
23