Les types

Java et Objet
Amélie Lambert
2013-2014
Amélie Lambert ()
2013-2014
1 / 60
Chapitre 2
Les types de données
Amélie Lambert ()
2013-2014
2 / 60
Plan du cours
Notion de type de données
I
Types primitifs
I
Le type String
Rappel : les structures de contrôle
Exercices
Amélie Lambert ()
2013-2014
3 / 60
Notion de type de données
Types primitifs
Le type String
Amélie Lambert ()
2013-2014
4 / 60
Notion de type de données
Toutes les variables ont un type
Un type définit l’ensemble des valeurs que peut prendre un objet
informatique ainsi que les opérations permises sur ces valeurs
Exemple de type :
Ensemble de valeurs : N
+
Ensemble d’opérations sur ces valeurs (+, −, ∗, /, ==, . . .)
Notion d’objet informatique :
Toute entité à laquelle un type est associé (variable, constante,
fonction, procédure, exception, paquetage, ...) est un objet
informatique.
Amélie Lambert ()
2013-2014
5 / 60
Intérêt du concept de type
Comment fournir à la machine les informations nécessaires pour
qu’elle soit en mesure de vérifier que l’utilisation des objets d’un
programme est bien conforme à l’intention préalable du
programmeur ?
Lorsque nous déclarons un objet (variable, constante, fonction,
...), nous spécifions les contraintes de son utilisation, l’ensemble des
valeurs qui pourront lui être associées et ainsi définir le cadre
légitime de son utilisation.
L’utilisation de cet objet sera précédée d’une vérification effectuée
par le compilateur. La valeur qu’il prend appartient-elle à cet
ensemble ? Son utilisation est-elle conforme aux contraintes spécifiées ?
Le concept de type permet d’établir un lien sémantique entre la
déclaration et l’utilisation d’un objet.
Amélie Lambert ()
2013-2014
6 / 60
Les types primitifs
Amélie Lambert ()
2013-2014
7 / 60
Type de données primitifs (1/2)
Chaque type possède un nom, identificateur construit selon les règles
lexicales du langage
On distingue les types numériques
I
types entiers : byte, short, int, long
I
types réels : float, double
le type booléen : boolean
le type caractère : char
Amélie Lambert ()
2013-2014
8 / 60
Représentation interne des entiers
On réprésente les entiers en binaires :
les entiers naturels N
les entiers relatifs Z en complément à deux
complément à 2 ⇒
4
complément à 1
on ajoute 1 → −4
→ 00000100
→ 11111011
→ 11111100
Exemple : addition de 3 et (−4)
3 + (−4)
11111111
00000011
00000000 complément à 1
⇒
11111100
00000001 ajouter 1
1
valeur du nombre négatif
11111111
Amélie Lambert ()
2013-2014
9 / 60
Représentation interne des réels (1/3)
exposant
mantisse
simple précision
nombre signe
de
bits
32
1
8
23
double pécision
64
11
52
Amélie Lambert ()
1
plages des valeurs représentées
-3.4E38
→ 3.4E 38 (14
ou 15 décimaux
significatifs)
-1.7E308
→ 1.7E 308 (14
ou 15 décimaux
significatifs)
2013-2014
10 / 60
Représentation interne des réels (2/3)
S
E exposant sur 8 bits
mantisse M sur 23 bits
norme IEEE754
Avec :
S : réprésentant le signe : 0 si nombre positif, 1 si nombre négatif
E : est codé avec un excédant à 127 de manière à coder une valeur
positive. L’exposant E codé est alors égal à E’ + 127.
M : est normalisée sous la forme 1, XXXX (pseudo-mantisse) et le 1
n’est pas codé en machine (bit caché). Le signe est codé sur un bit
valant 0 si la mantisse est positive, et 1 si elle est négative.
Amélie Lambert ()
2013-2014
11 / 60
Représentation interne des réels (3/3)
Exemple : Représenter (8, 625)10 :
partie entière en binaire (reste des divisions successives par 2) :
8 = 1 ∗ 23 + 0 ∗ 22 + 0 ∗ 21 + 0 ∗ 20
⇒ (8)10 = (1000)2
partie décimale en binaire (partie entière des multiplications succesives
par 2) :
0.625 ∗ 2 = 1.25 ⇒ 1
0.25 ∗ 2 = 0.5
⇒ 0
0.5 ∗ 2 = 1
⇒ 1
⇒ (0.625)10 = (0.101)2
(8, 625)10 = (1000 + 0, 101) = 1, 000101 ∗ 23
exposant E = 3 + 127 = 130 = (10000010)2 représentation interne de
9.75
représentation finale : 1
Amélie Lambert ()
10000010
00010100000000000000000
2013-2014
12 / 60
Les types primitifs
Nom
type
byte
short
int
long
float
double
du
boolean
Amélie Lambert ()
Ensemble des valeurs
[−128, . . . , 127]([−27 , . . . , 27 − 1])
[−32768, . . . , 32767]([−215 , . . . , 215 − 1])
[−231 , . . . , 231 − 1]
[−263 , . . . , 263 − 1]
réels simple précision ( 7 chiffres significatifs)
réels double précision ( 15 chiffres significatifs)
true, false
Nombre
d’octets
1
2
4
8
4
8
1
2013-2014
13 / 60
Valeurs littérales numériques
valeur
2
type
int
2.0
2.0f
ou
2.0F
double float
2.0d
2l ou
ou
2L
2.0D
double long
2f ou
2F
2d ou
2D
float
double
Un entier suivi de f (F) devient un float
Un entier suivi de d (D) devient un double
La représentation physique de la valeur dépend du type associé
Amélie Lambert ()
2013-2014
14 / 60
Opérateurs arithmétiques
Opérateurs sur les types entiers (byte, short, int, long)
I
+, -, *, /, %
I
Exemples : 9/4 = 2, 9%4 = 1
Opérateurs sur les types réels (double, float)
I
+,-,*,/
I
Exemple : 9/4 = 2,25
Opérateurs relationnels
I
<, >, <=, >=, ==, !=
I
Exemples : 5 > x, a == ’b’, (a != 0) && (a <= 100)
Amélie Lambert ()
2013-2014
15 / 60
Précédence des opérateurs (1/2)
Les expressions composées de plusieurs opérateurs sont évaluées de la
gauche vers la droite, selon des règles de précédence indiquant la
priorité des opérateurs les uns par rapport aux autres.
2 + 3 * 4 ⇒ équivaut à 2 +(3*4)
⇒ s’évalue en 14 et non pas en 20
2 + 3 > 4 ⇒ s’évalue en true
2 + (3 > 7) ⇒ produit une erreur
Amélie Lambert ()
2013-2014
16 / 60
Précédence des opérateurs (2/2)
De la plus haute à la plus basse priorité :
opérateurs unaires +,opérateur booléen !
* / %
+ < <= > >=
== !=
&&
||
Amélie Lambert ()
2013-2014
17 / 60
L’opérateur conditionnel ternaire ? :
z = (x>y)? x : y;
⇐⇒
if (x>y) z = x; else z = y;
3 opérandes : (x>y), x et y
Si la première opérande vaut true, l’expression a pour valeur celle de x
sinon elle a pour valeur celle de y
Exemple :
int x = ......;
System.out.println(
(x%2==0)? x+"␣est␣pair" : x+"␣est␣impair")
Amélie Lambert ()
2013-2014
18 / 60
Opérateurs et expressions
Un opérateur permet de réaliser des calculs sur une ou plusieurs
valeurs appelées opérandes.
Il existe des opérateurs unaires (une seule opérande), binaires et
ternaires (ex : !true, 9 ∗ X)
Les expressions sont des constructions décrivant des opérations à
l’aide d’opérateurs et d’opérandes
Les opérandes d’une expression peuvent être des constantes, des
variables valuées ou des appels de fonction :
I
I
I
(34 + Math.min(X,Y)) où X et Y sont les arguments valués de la
fonction min de la classe Math
2 > 5 est une expression booléenne dont le résultat est false
!(2 > 5) est une expression booléenne lue : non 2 plus grand que 5
Une expression correspond toujours à la valeur qu’elle calcule
Amélie Lambert ()
2013-2014
19 / 60
Conversions implicites entre types numériques
Cas 1 Les opérandes sont de même type ⇒ le résultat est du même type
Cas 2 Pour que l’opération soit réalisée, il faut que toutes les opérandes
soient de même type
⇒ nécessité de convertir certaines opérandes. La conversion se fait
vers le type le plus large selon la hiérarchie :
double
↑
float
↑
long
↑
int
↑
short
↑
byte
Amélie Lambert ()
2013-2014
20 / 60
Exemple
6.2 − 4 ⇒ 6.2 − 4.0
5.4f + 55.8 ⇒ 5.4 + 55.8
Remarque : aucune perte d’information
Amélie Lambert ()
2013-2014
21 / 60
Conversions explicites entre types numériques
Une conversion explicite est appelée "cast" en Java
syntaxe : (type_cible)val
I
I
type_cible est le type vers lequel on fait la conversion
val la valeur à convertir
Exemples :
I
(int)64.89 ⇒ 64 on passe d’une représentation sur 8 octets vers une à
4 octets avec changement de codage de la valeur
I
(float)64.89 ⇒ on passe d’une représentation sur 8 octets vers une à
4 octets sans changement de codage de la valeur
Amélie Lambert ()
2013-2014
22 / 60
Le type Boolean
Ensemble des valeurs du type : true, false
Ensemble des opérateurs : &&,||,! :
I
I
I
&& conjonction, se dit "et"
|| disjonction, se dit "ou"
! négation, se dit "non"
Exemples :
I
I
I
I
true && false ⇒ false
!x || (b && c)
(0 a0 <0 y0 && 0 b0 >0 x0 ) ⇒ false
(X%400 == 0) || (X%4 == 0 && X%100! = 0) ⇒ true si X est une
année bissextile.
Amélie Lambert ()
2013-2014
23 / 60
Tables de vérité
p q p && q
v v
v
v f
f
f v
f
f f
f
Conjonction
Amélie Lambert ()
p q p || q
v v
v
v f
v
f v
v
f f
f
Disjonction
p q p ^ q
v v
f
v f
v
f v
v
f f
f
Disjonction
exclusive
2013-2014
24 / 60
Simplification des expressions booléennes (1/3)
On peut utiliser les lois d’équivalences suivantes :
Absorption :
p||true ≡ true
p&&false ≡ false
Elément neutre : (élément qui laisse tous les autres éléments
inchangés lorsqu’il est combiné avec eux)
p||false ≡ p
p&&true ≡ p
Idempotence : (opération qui a le même effet qu’on l’applique une ou
plusieur fois)
p||p ≡ p
p&&p ≡ p
!(!p) ≡ p
Amélie Lambert ()
2013-2014
25 / 60
Simplification des expressions booléennes (2/3)
Loi de Morgan :
!(p||q) ≡!p&&!q
!(p&&q) ≡!p||!q
Simplification :
p||(p&&q) ≡ p
p&&(p||q) ≡ p
Elimination des négations :
p||(!p&&q) ≡ p||q
p&&(!p||q) ≡ p&&q
Distribution :
p||(q&&r) ≡ (p||q)&&(p||r)
p&&(q||r) ≡ (p&&q)||(p&&r)
Amélie Lambert ()
2013-2014
26 / 60
Simplification des expressions booléennes (2/2)
Exemple (Elimination des négations) :
p||(!p&&q) ⇔ p||q ⇒ (a < b)||(c == d)
application de la distribution
(p||!p)&&(p||q)
absorption
true&&(p||q)
élément neutre
p||q
Application :
(a < b)||((a >= b)&&(c == d))
est de la forme
p||(!p&&q) ⇔ p||q ⇒ (a < b)||(c == d)
Amélie Lambert ()
2013-2014
27 / 60
Le type primitif char(1/2)
Il est codé en Unicode sur 16 bits
Permet l’échange, le traitement et l’affichage de texte dans différentes
langues www.unicode.org
L’unicode utilise 2 octets précédés par \u exprimés par 4 chiffres
hexadécimaux (de 0 \u00000 à 0 \uFFFF0 )
Permet de représenter 65.536 caractères
Amélie Lambert ()
2013-2014
28 / 60
Le type primitif char (2/2)
Exemples :
’A’ ≡ 0 \u00410 ;
Unicode inclut les 128 caractères ASCII (American Standard Code for
Information Interchange) (de 0 \u00000 à 0 \u007F0 )
0 \u03b10
→α
0 \u03b20
→β
0 \u03b30
→γ
0 \u00090
→ 0 \t0 tabulation
0 \u000A0
→ 0 \n0 nouvelle ligne
0 \u000C0
→ nouvelle page
Amélie Lambert ()
2013-2014
29 / 60
Encodage de l’Unicode : UTF
Pour traiter efficacement à la fois les caractères ASCII et Unicode, les
systèmes utilisent le schéma de codification UTF (Universal character
set Transformation Format).
Si une application utilise uniquement des caractères ASCII, il est
inefficace de le représenter sur 2 octets.
Le codage UTF utilise :
I
I
I
1 octet pour les caractères ASCII
2 octets pour d’autres caractères régulièrement utilisés
3 octets pour les autres
Amélie Lambert ()
2013-2014
30 / 60
Le type String
Amélie Lambert ()
2013-2014
31 / 60
Le type String
Le type String n’est pas un type primitif. Ses valeurs sont des objets
représentant des chaînes de caractères.
Les valeurs du type String s’écrivent entre quotes :
I
"hello" "123" "__XX_"
I
"mon nom est : \"Martin\"!"
Opérateur de concaténation : +
La chaîne : "hello"+" world" est identique à "hello world"
Amélie Lambert ()
2013-2014
32 / 60
Utilisation du type String
Syntaxe :
<chaine>.<ident_méthode>(<liste_param>)
<chaine> est une valeur du type String
<ident_méthode> est un nom de méthode applicable sur les valeurs
du type String
<liste_param> le ou les paramètres séparés par une virgule
Exemple :
int i = "toto".length; // i ← 4
Amélie Lambert ()
2013-2014
33 / 60
Quelques méthodes du type String
char charAt( int n) retourne le n-ième caractère de la chaîne
Exemple : char c = "bonjour".charAt(0); // c ← ’b’
char[] toCharArray() transforme une chaîne en un tableau de
caractères
Exemple : char[] t = "bonjour".toCharArray();
t −→
’b’
0
’o’
1
’n’
2
’j’
3
’o’
4
’u’
5
’r’
6
String toLowerCase(), String toUpperCase() pour transformer
les caractères en majuscules ou en minuscules
Amélie Lambert ()
2013-2014
34 / 60
Comparaison de chaînes
int compareTo(String s2)
Compare une chaîne s1 avec une chaîne s2 selon l’ordre lexicographique.
s1 < s2 retourne un entier < 0
s1 = s2 retourne un entier = 0
s 1> s2 retourne un entier > 0
Exemple :
String s = "SOS", t = "HELP";
if (s.compareTo(t) > 0)
System.out.println( t+"␣>␣"+s);
else System.out.println( t+"␣<=␣"+s);
MAIS attention :
if (s > t) // ILLEGAL
Amélie Lambert ()
2013-2014
35 / 60
Egalité entre chaînes (1/2)
boolean equals(String s2)
Teste l’égalité d’une chaîne s1 avec une chaîne s2, et retourne true ou
false
Exemple :
String s5 = "SOS";
String s6 = "OSS";
if( s5.equals(s6))
System.out.println( s5+"␣=␣"+s6);
else
System.out.println( s5+"␣!=␣"+s6);
String s7 = "SOS";
String s8 = "SOS";
if( s7.equals(s8) )
System.out.println( s7+"␣=␣"+s8);
else
System.out.println( s7+"␣!=␣"+s8);
Amélie Lambert ()
2013-2014
36 / 60
Egalité entre chaînes (2/2)
On distingue 2 sortes d’égalité : l’égalité de contenant (d’objets) et
l’égalité de contenu.
Les opérateurs : == et != testent si deux noms de variables différents
désignent le même contenant.
Exemple :
String s1 = "SOS";
String s2 = s1;
if( s1==s2)
System.out.println( s1+"␣=␣"+s2);
else
System.out.println( s1+"␣!=␣"+s2);
String s3 = "SOS";
String s4 = "SOS";
if( s3==s4)
System.out.println( s3+"␣=␣"+s4);
else
System.out.println( s3+"␣!=␣"+s4);
Amélie Lambert ()
2013-2014
37 / 60
Conversion vers les types primitifs
String → int
Exemple :
String s = "123";
int x = Integer.parseInt(s); // x ← 123
String → int
Exemple :
String s = "123";
double x = Double.parseDouble(s); // x ← 123
String → int
Exemple :
String s = "true";
boolean x = Boolean.parseBoolean(s); // x ← true
String s = "toto";
boolean x = Boolean.parseBoolean(s); // x ← false
Idem pour String → float, String → short ...
Amélie Lambert ()
2013-2014
38 / 60
Conversion vers le type String
int → String
Exemple :
int i = 15;
String s = ""+15; // s ← "15"
double → String
Exemple :
double i = 15.23;
String s = ""+15.23; // s ← "15.23"
boolean → String
Exemple :
boolean i = true;
String s = ""+true; // s ← "true"
Amélie Lambert ()
2013-2014
39 / 60
Les structures de contrôle
Amélie Lambert ()
2013-2014
40 / 60
Structures de contrôle
La seule instruction qui a des effets sur le contenu de la mémoire est
l’affectation.
Les autres instructions ne sont là que pour permettre d’organiser de
manière à la fois plus concise et plus lisible la suite des affectations.
On appelle ces instructions des structures de contrôle.
On distingue les structures de contrôle conditionnelles et itératives.
Amélie Lambert ()
2013-2014
41 / 60
Conditionnelle
Syntaxe :
<conditionnelle>::=
if(<expression_booléenne>)
<suite_instructions>
[ else <suite_instructions> ]
<suite_instructions>::=
<instruction_simple>|<suite_instructions>
Sémantique :
I
I
I
Les parties entre crochets sont optionnelles
Si la condition est vraie, la suite d’instructions associée est exécutée et
l’instruction conditionnelle est terminée
Si la condition est fausse, la partie else est exécutée et l’instruction
conditionnelle est terminée
Amélie Lambert ()
2013-2014
42 / 60
Expressions conditionnelles
Syntaxe :
<expression_conditionnelle>::=
<expression_booléeenne> ? <expression> :
<expression>
Exemples :
int y = (x>0) ? 1 : −1
// équivalent à
int y;
if (x>0) y=1; else y=−1;
System.out.println((num%2==0) ? "num␣pair":"num␣impair");
// ? est le seul opérateur ternaire en Java
Amélie Lambert ()
2013-2014
43 / 60
Choix multiple
Syntaxe :
<choix>::=
switch(<expression>){
case <valeur>:<instructions>;break;
case <valeur>:<instructions>;break;
case <valeur>:<instructions>;break;
[default : <instructions>;]
}
<expression> est obligatoirement de type char,byte,short ou int
<valeur> est une constante de même type que <expression>
<instructions> est une suite d’instructions simples
Amélie Lambert ()
2013-2014
44 / 60
Structure itérative : boucle while
Syntaxe :
<boucle>::=
while(<condition>){
<suite_instructions>;
}
Sémantique :
<condition> est une expression booléenne évaluée avant chaque
itération
I
I
si <condition> est vrai, <suite_instructions> est exécutée, puis
de nouveau la condition est évaluée
si <condition> est faux, le contrôle passe à l’instruction qui suit la
boucle
Amélie Lambert ()
2013-2014
45 / 60
Structure itérative : boucle do...while
Syntaxe :
<boucle>::=
do{
<suite_instructions>
}while(<condition>);
Sémantique :
1
2
<suite_instructions> est exécutée
<condition> est une expression booléenne évaluée à la fin de chaque
itération
F
F
si <condition> est vrai, le contrôle revient à <suite_instructions>
si <condition> est faux, le contrôle passe à l’instruction qui suit la
boucle
Amélie Lambert ()
2013-2014
46 / 60
Boucle for
Syntaxe :
<boucle_for>::=
for( <init_inst >;<expr_bool>;<modif_inst>){
<suite_instructions>
}
<init_inst> sont les instructions d’initialisation de la boucle séparées
par des virgules
<expr_bool> est une expression booléenne, condition de continuation de
l’itération
<modif_inst> sont les instructions de mise à jour des variables de la
boucle séparées par des virgules
Amélie Lambert ()
2013-2014
47 / 60
Exemple : boucle infinie
for(;;){
<suite_instructions>
}
équivalent à
while(true){
<suite_instructions>
}
Amélie Lambert ()
2013-2014
48 / 60
Rupture de contrôle : break (1/2)
public class TestBreak{
public static void main(String[] args){
int n = 1;
for(;;){
System.out.println("A");
if ( n>=1 ){
System.out.println("B");
break;
}
else
System.out.println("C");
System.out.println("D");
}
System.out.println("F");
}
}
Amélie Lambert ()
2013-2014
49 / 60
Rupture de contrôle : break (2/2)
Résultat affiché :
A
B
F
L’instruction break permet une sortie immédiate de la boucle la plus
interne et non d’un bloc quelconque.
Amélie Lambert ()
2013-2014
50 / 60
Instruction continue
public class TestContinue{
public static void main(String[] args){
int somme = 0;
int n = 0;
while( n<30 ){
n++;
if( n==10||n==12 ) continue;
somme = somme+n;
}
System.out.println("n="+n); // n=30
System.out.println("somme="+somme); // somme =443
}
}
L’instruction continue termine le pas d’itération en cours pour commencer
le suivant.
Dans l’exemple, si n=10 ou 12, l’instruction somme = somme+n; n’est pas
exécutée. L’itération n’en est pas pour autant terminée.
Amélie Lambert ()
2013-2014
51 / 60
Appel de méthode
Syntaxe
<ident_sous_programme>(<arg>,<arg>,...,<arg>)
Le sous-programme est invoqué en lui passant les données
(arguments) à traiter.
Les arguments peuvent changer à chaque appel
Comme résultat, on obtient une valeur ou bien une modification de
l’état de la machine appelée effet de bord ou bien encore les deux.
Amélie Lambert ()
2013-2014
52 / 60
Transmission de paramètre
Lors de l’appel d’une fonction, le paramètre effectif est transmis au
paramètre formel.
Tout se passe comme si une copie de la valeur du paramètre effectif
initialisait le paramètre formel
On parle de passage par valeur
Conséquence : l’exécution de la fonction ne peut pas modifier le
paramètre effectif
Le paramètre formel x est une variable pendant toute l’exécution de
la procédure
Note : la valeur transmise est une référence si le paramètre est un
tableau ou un objet
Amélie Lambert ()
2013-2014
53 / 60
Notion de bloc
Un bloc est une suite d’instructions contenue entre accolades
Exemples : Le corps d’une boucle (for, while) est donc un bloc.
Les instructions entre les accolades d’un if, d’un else sont des blocs.
Un bloc est un environnement local de déclarations de variables. Les
variables n’existent que dans le bloc dans lequel elles sont déclarées
Exemples :
public static void main(String[] args){
int a=5;
if (a==0){
int b=3+2∗a;
System.out println("b="+b);
}
else{
int c=3+a;
System.out println("c="+c); // b est inconnu
}
System.out println("a="+a); // b et c sont inconnus
}
Amélie Lambert ()
2013-2014
54 / 60
Exercices
Amélie Lambert ()
2013-2014
55 / 60
Exercice 1 (1/2)
Donnez la représentation interne du réel 15, 25
Amélie Lambert ()
2013-2014
56 / 60
Exercice 2 (1/2)
Donnez la représentation binaire de l’entier 17 puis du résultat de -17+2.
Amélie Lambert ()
2013-2014
57 / 60
Exercice 3 (1/2)
Quelle est la valeur des expressions suivantes ?
1
53%7+5*5-3
2
12+53%7*(4*3%2)
Quelles sont les valeurs de b et c ? int a=1;
boolean b = !(a>0) && (a>0);
boolean c = (a!=1) == !(a==1);
Amélie Lambert ()
2013-2014
58 / 60
Exercice 4 (1/2)
L’instruction System.out.println( String chaine ) permet d’afficher
une chaîne de caractères sur un terminal.
Supposons que la variable age contienne une valeur entière.
Compléter la seule instruction System.out.println(...), afin d’afficher
le message "tarif réduit" si la valeur de age est inférieure ou égale à 26 ou
le message "tarif normal" si elle est supérieure à 26.
Amélie Lambert ()
2013-2014
59 / 60
Exercice 5 (1/2)
Donnez les spécification et la documentation de l’interface Java SMSEdit
d’un éditeur de SMS.
Les fonctionnalités de cet éditeur simple sont :
Ajouter un caractère au texte rédigé
Effacer le dernier caractère ajouté
Enregistrer le texte dans un fichier connu par son nom
La longueur maximale du texte est de 194 caractères.
Amélie Lambert ()
2013-2014
60 / 60