IUT Montpellier — Informatique — Licence professionnelle Programmation par objets en Java 2009/10 Dossier 1 Principaux éléments de syntaxe Java Cette partie n'aborde pas les notions de classe et d'objet (et ne considère que certains aspects de la notion de tableau, car tableaux et objets sont gérés de la même façon). Types et variables Il existe des types primitifs et 2 types construits : les classes et les tableaux. Types primitifs Type Contenu Taille boolean char booléen Caractère UNICODE entier signé entier signé entier signé entier signé nombre flottant simple précision 1 bit (en principe) 16 bits byte short int long float Exemples de valeurs littérales 8 bits 16 bits 32 bits 64 bits 32 bits true false 'a' '\n' '\t' '\'' -128 128 011 (préfixe 0 en base octale) 0xF (préfixe 0x en base hexa) 0.3 2. .5 2E2 (2 x 102) 2E-3 (2 x 10-3) double nombre flottant 64 bits double précision par défaut, une valeur littérale est de type double 0.3f --> de type float Attention 'a' est une valeur de type caractère (type simple char) alors que "a" est une chaîne de caractères (type classe String) Déclaration et initialisation de variable Une variable est toujours typée : soit par un type simple, soit par un type construit (objet ou tableau). Dans le deuxième cas, la variable est appelée référence (référence sur un objet ou sur un tableau). int i,j; // déclaration de 2 variables int i = 0; // déclaration et initialisation d'une variable boolean ok = false; final int max = 10; // déclaration d'une constante // l'initialisation est alors obligatoire Bidule b = null; // Bidule est un nom de classe /* déclaration d'une variable de type classe, donc destinée à désigner un objet (on l'appelle une "référence"); initialisation à "ne repère aucun objet" */ Java Dossier 1 page 1 Instructions Les instructions de Java sont calquées sur celles de C/C++ Instruction vide ; Affectation emplacement = expression ; • L'affectation retourne une valeur (la valeur de l'expression) Attention, égal s'écrit == Bloc d'instructions { séquence d'instructions } • Si le bloc est composé d'une seule instruction, les {} ne sont pas nécessaires Instructions conditionnelles if (expression) bloc if (expression) bloc else bloc • Il existe aussi une instruction switch équivalent au case du Pascal : switch (expression) { case valeur_constante ... case valeur_constante default } : bloc : bloc : bloc // clause facultative • Lorsqu'un case est satisfait, le bloc correspondant est exécuté, et si ce bloc ne se termine pas par une instruction break; le bloc suivant est lui aussi exécuté (etc...) Instructions itératives while (expression) bloc équivalent au while du Pascal do bloc while (expression) équivalent au repeat du Pascal (mais test d'arrêt inversé) for (expression-1; expression-test ; expression-2) bloc équivalent à expression-1; while(expression-test) { bloc expression-2; } ... donc aussi puissant qu'un while Instructions de "sortie" : break; termine le plus petit while, do, for , switch qui le contient continue; termine l'itération courante de la boucle la plus interne qui le contient Java Dossier 1 page 2 Opérateurs Un opérateur retourne une valeur d'un certain type. L'affectation est à la fois une instruction (elle effectue une action) et un opérateur (elle retourne une valeur). Opérateurs arithmétiques + - * / % L'opérateur / effectue une division entière lorsque les deux opérandes sont des entiers. Opérateurs d'incrémentation / décrémentation ++ Opérateurs d'affectation non simples += --= *= /= a++ ; // incrémentation de a de 1 a+=2; // équivalent à a = a + 2; Opérateurs à résultat de type booléen > >= < <= ! non == égal && et != différent || ou Les opérateurs logiques && et || effectuent une évaluation "incomplète" de l'expression logique (si l'évaluation du premier opérande suffit à déterminer la valeur de l'expression, le deuxième opérande n'est pas évalué : on les appelle aussi des "ET-ALORS" et "OUSINON"). Premières applications • Hello World /* Fichier Exemple.java Un fichier source java comporte (au plus) une classe publique qui donne son nom au fichier. */ Attention à public class Exemple la casse ! { public static void main (String args[]) // args est un tableau d'objets de la classe String { System.out.println("Hello, world!"); } } Exécuter une application consiste à exécuter la méthode main d'une classe (cette exécution impliquant généralement la création d'objets et l'appel de méthodes d'autres classes). La signature de la méthode main est forcément celle ci-dessus. Une méthode statique (comme la méthode main ci-dessus) est une méthode qui n'est pas invoquée à partir d'un objet. Les méthodes statiques sont plutôt des fonctions au sens des langages de programmation non objets, elles n'auraient pas leur place dans un langage complètement basé sur des objets. Java Dossier 1 page 3 • Passage d'arguments à la méthode main via le tableau args... public class ExempleArgs { public static void main (String args[]) { if (args.length == 0) System.out.println("Hello inconnu!"); else System.out.println("Hello" + args[0]); // l'indice du premier élément d'un tableau est 0 } } L'instruction System.out.println(...) ne prend qu'un seul argument. Pour afficher plusieurs chaînes de caractères avec un seul appel, on peut concaténer ces chaînes en une seule grâce à l'opérateur +. Syntaxe des méthodes (fonctions) <spécificateurs> <type de retour> <nom de la méthode> (<liste des paramètres formels>) { <corps de la méthode> } Exemple 1 : public class Util { public static void ecrit (String a, String b) { System.out.println(a + " : " + b); } } Exemple de code qui utilise la méthode écrit : // La classe Scanner appartient au package java.util Scanner sc = new Scanner(System.in); System.out.println("Entrez une première chaine"); String s1 = sc.nextLine(); System.out.println("Entrez une seconde chaine"); String s2 = sc.nextLine(); Util.ecrit(s1,s2); Si le type de retour n'est pas void, la méthode doit retourner une valeur de ce type, et ceci dans tous les cas. Elle le fait par l'instruction return : return expression; // ceci retourne la valeur de l'expression et termine la méthode Exemple 2 : public static int carre (int a) { return a * a;} Lorsque le type de retour est void, return peut être utilisé pour terminer prématurément la méthode. Exemple 3 : public static void main (String args[]) { if (args.length == 0) { System.out.println("Presente-toi!"); return; // fin main } else System.out.println("Hello" + args[0]); // etc.... suite de la méthode main } Java Dossier 1 page 4 Exercice 1 : Problème de syntaxe (a) Considérons les lignes suivantes extraites d'un programme : boolean ok = false; int x; // .... du code susceptible de modifier la valeur de la variable ok; if (ok = true) x = 1; else x = 0; System.out.println(x); Le programme affiche toujours 1. Pourquoi? (b) Combien de tours de boucle sont effectués à l'exécution du bloc suivant? while (ok = true) { .......... } (c) Même question while (ok = false) { .......... } Exercice 2 : boucle for Remplacer la boucle ci-dessous par une boucle for équivalente. int k = 0; int i = 1; while (i <10) { k = k + i; i++; } //valeur de k ici? // s'écrit aussi k += i; Exercice 3 : parcours totaux / partiels On considère une variable T de type tableau d'entiers. On suppose que le tableau est rempli de valeurs significatives. Vous n'avez donc pas à vous préoccuper de la création et de l'initialisation de T. A propos de tableaux : 1. les indices commencent à 0 2. la taille d'un tableau désigné par T s'obtient grace à son attribut length T. length retourne le nombre d'éléments ("cases") de T 3. les indices d'un tableau vont donc de 0 à (T.length - 1) 4. T[i] désigne l'élément (la case) d'indice i , si i est un indice valide 1. Ecrire une suite d'instructions qui fait la somme des valeurs contenues dans T. On stockera le résultat dans une variable. 2. Ecrire une suite d'instructions qui répond à la question "T contient-il la valeur 0 ?"On stockera le résultat dans une variable (de type booléen donc). Java Dossier 1 page 5 Exercice 4 : méthodes (a) Le compilateur n'accepte pas cette méthode, pourquoi? public static int max (int a, int b) { if (a>b) return a; } (b) Que dire de cette méthode? public static int max (int a, int b) { if (a>b) return a; else return b; System.out.println("je suis passé par max"); } Exercice 5 : parcours totaux/partiels (suite) (TP) Cet exercice fait suite à l'exercice 3. 1. Écrire une classe Exo5, qui comporte une méthode main effectuant les actions suivantes : a. Création et initialisation d'un tableau T contenant 5 entiers. //voici une façon de créer un tableau // un certain nombre de valeurs connues initialisé avec int [] T = {10,20,0,4,-1} // int [] est le type "tableau d'entiers" b. Affichage de la somme des valeurs contenues dans T c. Affichage de la réponse à la question "T contient-il la valeur 0?" 2. Ajouter à la classe Exo5 les deux méthodes somme et contient0 spécifiées cidessous. Remplacer une partie des instructions de votre méthode main par des appels à ces méthodes. public static int somme (int [] tab) // retourne la somme des valeurs contenues dans tab public static boolean contient0 (int [] tab) // retourne vrai si tab contient la valeur 0, et faux sinon Java Dossier 1 page 6 Exercice 6 : passer des paramètres à main (TP) Dans cet exercice, on n'effectue aucune saisie utilisateur. Les données sont passées au programme lors du lancement de son exécution, sous la forme de chaînes de caractères rangées dans le tableau args (pour passer des arguments à la méthode main avec Eclipse : utiliser l'onglet "arguments" de l'entrée de menu "Run…"). Écrire une classe Bonjour, pour qu'un appel avec les arguments Pim Pam Poum provoque l'affichage suivant : Bonjour, Pim! Bonjour, Pam! Bonjour, Poum! Le nombre de paramètres fournis à l'appel peut être quelconque : en particulier, le cas où aucun argument n'est fourni ne doit pas provoquer d'erreur d'exécution. • Entraînement à la syntaxe java : écrire une version utilisant la boucle while, puis une version utilisant la boucle for. Exercice 7 : parcours de matrices : le carré magique (TP) Un carré magique est une matrice de taille n par n, dont les cases sont remplies de valeurs de 1 à n2, suivant les règles suivantes: o Toutes les cases prennent des valeurs distinctes o Les nombres sont disposés de manière à ce que leurs sommes sur chaque rangée ainsi que sur chaque colonne soient égales. Ecrire une méthode static boolean isValidMagicSquare(int[][] grille) qui indique si la matrice passée en paramètre est un carré magique valide. Java Dossier 1 page 7