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
© Copyright 2025 ExpyDoc