Enseignements 1ère année

Java

Gilles Gesquière

IUT de Provence - Site d'Arles
Tel.: 04 90 52 24 10
gilles.gesquiere@up.univ-mrs.fr

 

Programmation Java- Cours (2004-2005)

Chapitre 1 : Introduction
Chapitre 2 : Stocker une information
Chapitre 3 : Communiquer une information
Chapitre 4 : Faire des choix
Chapitre 5 : Faire des répétitions
Chapitre 6 : Les sous-Programmes
Chapitre 7 : Les sous-Programmes; Notions avancées
Chapitre 8 : Les classes et les objets
Chapitre 9 : Les principes du concept objet
Chapitre 10 : Collectionner un nombre fixe d'objets
Chapitre 11 : Collectionner un nombre indéterminé d'objets
Chapitre 12 : Archivage des données
Chapitre 13 : Les paquetages
Chapitre 14 : Notions objets avancées
Chapitre 15 : Les exceptions
Chapitre 16 : Interface graphique

 

 

Programmation Java- tp (06-07)

Tp N° 1

Exercice 1 : Création, compilation et exécution d'un programme Java

  • Tapez le programme suivant avec l'éditeur de texte Crimson . Sauver le programme sous le nom « Hello.java » ( Toujours utiliser le nom du programme suivi de l'extension « .java ») :

public class Hello

{

public static void main (String [] arg)

{

System.out.print("Java marche !");

}

}

•  Compilez ce programme en tapant la commande : javac Hello.java. Vous obtenez le fichier « Hello.class »

•  Exécutez ce programme en tapant la commande  : java Hello

 

Exercice 2 : Somme des n entiers

Ecrire un algorithme, puis un programme qui permet de calculer la somme des n entiers, n étant entré au clavier. Testez différentes solutions (for, while, do while) (Correction 1, Correction 2, Correction 3).

Remarque 1  : Pour utiliser les fonctions de saisie au clavier, copiez dans votre répertoire le fichier « Lire.java » se trouvant sur ma page. Il faut ensuite compiler ce fichier afin de pouvoir l'utiliser.

Remarque 2 : Vous avez une solution, votre voisin en a une autre. Nous vous en proposons encore une troisième. Il est important de prendre du temps à lire les corrections avec les commentaires et de les tester.

Exercice 3 : Suite de Fibonacci

La suite de Fibonacci est une suite de termes entiers Fi donnée par : Fi = Fi-2 + Fi-1 pour tout i supérieur ou égal à 2, avec F0 = 1 et F1 = 1. Ainsi : F0 = 1, F1 = 1, F2 = 2, F3 = 3, F4 = 5, F5 = 8, F6 = 13, F7 = 21, ...

Ecrire le programme qui permet de calculer Fn, pour n saisi au clavier (Correction)

Exercice 4 : Installer Java chez vous. Nous vous conseillons d'installer d'abord Java, puis JCreator (afin de ne pas avoir de problème de liens). Les téléchargements ci-dessus sont pour windows. Vous trouverez une version de java pour Linux sur le site de sun

Tp N° 2

Exercice 1 : Nombre premier
Ecrire un algorithme, puis un programme en Java qui demande à l'utilisateur d'entrer un entier positif et qui détermine si ce nombre est premier ou non. On dit qu'un nombre est premier si il a pour seuls diviseurs 1 et lui-même.

Par ex : 2, 3, 5, 7, 11 sont premiers.

Pour déterminer si un entier a est divisible par un entier b , il faut que le reste (modulo) de la division de a par b soit nul, ce qui s'écrit en java : a%b = = 0 . (Correction)

Exercice 2 : Recherche des nombres premiers compris entre 1 et 1000
Déterminer et afficher tous les nombres premiers compris entre 1 et 100 (Correction)

Exercice 3 : Division entière
Ecrire un programme permettant d'effectuer la division entière de deux nombres entiers.

Par exemple 4 Div 3 = 1; 5 Div 2 = 2. (Correction)

Tp N° 3

Exercie 1 : Nombre premier
Ecrire une programme qui permet d'afficher les nombres premiers compris entre 1 et un nombre saisi préalablement au clavier. Vous devez modifier l'exercice 2 du TP N°2.

  • Version 1 : on essaie les divisions par 2, 3, …, n-1
  • Version 2 : On s'arrête au premier diviseur
  • Version 3 : On s'arrête au premier diviseur ou à v n
  • Version 4 : On pense à ne pas essayer 4, 6, 8, …

Exercice 2 : Ecrire un programme qui permet de vérifier qu'un nombre est parfait. Un nombre n est parfait s'il est égal à la somme de ses diviseurs, sauf lui-même. Par exemple : 6 est égal à la somme de ses diviseurs (1, 2, 3)

Exercice 3  : Fonction sans paramètre

Ecrire un algorithme, puis un programme en Java, qui fait appel à une fonction affiche_bienvenue() que vous écrirez. Cette fonction ne reçoit aucun paramètre et se contente d'afficher « Bienvenue ».

 

Exercice 4  : Fonction à un paramètre

Ecrire un algorithme, puis un programme en Java, demandant dans la fonction main() à l'utilisateur d'entrer un réel. Ce réel est passé en paramètre à une fonction doubler() que vous écrirez, qui multiplie ce réel par 2 et le retourne. Dans la fonction main() , on affichera la valeur retournée par la fonction.

 

Exercice 4  : Fonction à plusieurs paramètres

Ecrire un algorithme, puis un programme en Java, demandant à l'utilisateur d'entrer deux réels. Ces réels sont passés en paramètre à une fonction minimum() qui retourne la plus petite des deux. On affichera la valeur retournée par la fonction.

 

Exercice 5  : Fonction appelant une autre fonction

5.1 Calcul de factorielle

Ecrire un algorithme, puis un programme en Java, demandant à l'utilisateur d'entrer un entier. Cet entier est passé en paramètre à une fonction factorielle() que vous écrirez, qui calcule puis retourne la factorielle de cet entier. On affichera la valeur retournée par la fonction.

 

5.2 Calcul d'arrangement

On souhaite maintenant utiliser cette fonction factorielle() pour écrire une autre fonction, arrangement() . Cette fonction reçoit en paramètre deux entiers n et p . Elle calcule et retourne le nombre d'arrangements de p éléments parmi n différents selon la formule :

5.3 Calcul de combinaison

On souhaite utiliser la fonction arrangement() et la fonction factorielle() pour écrire une autre fonction, combinaison() .Cette fonction reçoit en paramètre deux entiers n et p . Elle calcule et retourne le nombre de combinaisons de p éléments parmi n différents selon la formule :

 

Notes :

Soit E un ensemble non vide de n éléments (n est supérieur ou égal à 1).
Exemple : soit E = {A, B, C}, donc avec n = 3

•  Un arrangement de p éléments de E est une suite ordonnée de p éléments distincts de E (p est supérieur ou égal à 1 et inférieur ou égal à n).

Exemple : si p = 2, on a {A, B}, {B, A}, {A, C}, {C, A}, {B, C} et {C, B}

Le nombre d'arrangements de p éléments de E est

•  Une combinaison de p éléments de E est une suite de p éléments distincts de E (p est supérieur ou égal à 0 et inférieur ou égal à n).

Exemple : si p = 2, on a {A, B}, {A, C} et {B, C}

Le nombre de combinaisons de p éléments de E est

TP n°4

Exercice 1 : Ecrire un algorithme, puis un programme en Java qui permette de réaliser certaines opérations sur une fonction mathématique :

  1. Ecrire une fonction retournant la valeur de f pour un x (réel) donné. On utilisera les fonctions Math.exp() et Math.sin() .
  2. Ecrire une fonction minimum qui retourne la plus petite valeur de f sur un intervalle [ borne_inf , borne_sup ], avec un pas de progression delta donné.

Exercice 2 : La conjecture de Goldbach veut que tout nombre pair strictement supérieur à 2 soit la somme de deux nombres premiers. Ecrire un programme qui demande un entier à l'utilisateur, vérifie qu'il soit pair (écrire une fonction) et > 2. Cet entier sera passé en paramètre à une fonction qui calculera et affichera les deux nombres premiers dont la somme produit cet entier.

Exercice 3 : On souhaite écrire un programme vérifiant si un code de carte bleue est valide. Cet algorithme fait un premier contrôle de validité, en aucun cas il ne dit si la carte est encore valable.

Un code de carte bleue est composé de 16 chiffres. Il faut multiplier chaque chiffre de position impaire par 2, puis si le résultat est supérieur à 9 retirer 9, et ajouter cette valeur à un total. Ajouter à ce total les numéros de position paire. Ce résultat doit être un multiple de 10.

Ecrire une fonction recevant en paramètre un code à 16 chiffres et retournant une valeur booléenne indiquant si le code est valide ou non. Vous utiliserez une chaine de caractère (String) afin de stocker le numéro de carte bleue.

Exercice 4 : Le numéro de sécurité sociale (NIR : Numéro d'Inscription au Répertoire) est un numéro de 13 chiffres suivit d'un code de contrôle de 2 chiffres.

Ex : 2 83 09 75 073 015 89

2 83 09 75 073 015 89

Sexe :
1 : homme
2 : femme

Année de naissance Mois de naissance (septembre) Département de naissance Commune de naissance (N° INSEE) N° Ordre Code de Contrôle

Le code de contrôle sert à vérifier la validité du numéro à 13 chiffres. Il se calcule de la manière suivante :

Code = 97 - (numéro_13_chiffres modulo 97)

Ex : 89 = 97 – (2830975073015 % 97)

4.1 : Ecrire une fonction recevant le numéro à 13 chiffres ainsi que le code de contrôle, et qui retourne une valeur booléenne indiquant si le code est valide ou non.

4.2 : Ecrire une fonction recevant le numéro à 13 chiffres, qui calcule et retourne le code de contrôle.

4.3 : Ecrire une fonction recevant le numéro à 13 chiffres et affichant si il s'agit d'un homme ou d'une femme, l'année de naissance, le mois de naissance (sous forme littérale), le département et la commune de naissance (chiffres), le numéro d'ordre.

TP n°5

Exercice 1: Tableau à une dimension

On écrit un programme permettant de suivre l'évolution de la température pour chaque mois de l'année en utilisant un tableau de 12 réels.

  1. Créer dans la fonction main un tableau de 12 réels.
  2. Ecrire une fonction recevant le tableau en paramètre, et qui le remplit en demandant les valeurs à l'utilisateur.
  3. Ecrire une fonction recevant en paramètre un tableau de températures. Cette fonction retournera le nombre de mois où la température est négative.
  4. Ecrire une fonction recevant en paramètres un tableau de températures et une valeur de température. Cette fonction retournera le nombre de mois ayant eu cette température.

Exercice 2 : Tableau à deux dimensions

On veut maintenant suivre l'évolution de la température sur plusieurs années. On utilise un tableau à deux dimensions, la première dimension correspondant aux années et la seconde correspondant aux mois.

  1. Afin de créer le tableau ( new ), demander à l'utilisateur dans la fonction main le nombre d'années sur lequel il veut étudier la température.
  2. Ecrire une fonction recevant en paramètre un tableau de températures. Cette fonction remplira le tableau avec des valeurs aléatoires ( Math.random() ) comprises entre -20 et 40.
  3. Ecrire une fonction recevant en paramètre un tableau de températures qui affiche son contenu.
  4. Ecrire une fonction recevant en paramètre un tableau de températures et un numéro de mois et qui affiche les températures de ce mois pour chaque année.
  5. Ecrire une fonction recevant en paramètre un tableau de températures et un numéro de mois et qui retourne la température la plus élevée de ce mois au cours des ans.

Exercice 3 : Vector

On veut manipuler une liste de noms au moyen de la classe Vector .

  1. Ecrire une fonction Remplissage remplissant un objet de type Vector passé en paramètre en demandant les valeurs (chaînes de caractères) à l'utilisateur.
  2. Ecrire une fonction Remplissage_trié similaire à celle de la question précédente, mais insérant les nouveaux noms dans le vecteur selon l'ordre alphabétique.
  3. Ecrire une fonction recevant en paramètre un objet de type Vector qui retourne le nombre de doublons qu'il contient.
  4. Ecrire une fonction recevant en paramètre un objet de type Vector qui en supprime les doublons.

TP n°6

Exercice 1 – Ligne de commande

Ecrire un programme permettant d'afficher tous les paramètres de la ligne de commande (contenus dans le tableau String[] args , paramètre de la fonction main ).

Ex : si pour exécuter le programme on tape : java programme val1 123 val2

Alors le tableau args contiendra les 3 chaînes de caractères «val1 », « 123 » et « val2 ».  (Solution)

 

Exercice 2 – Classes et objets (éléments de solutions dans le répertoire TP06)

  1. Fichier Ville.java
    1. Ecrire une classe Ville permettant de représenter une ville, en la caractérisant par son nom et son nombre d'habitants.
    2. Ecrire un constructeur de cette classe dans lequel on demande à l'utilisateur d'entrer le nom de la ville et son nombre d'habitants.
    3. Ecrire une méthode affiche() affichant les caractéristiques de la ville.
  2. Fichier Pays.java
    1. Ecrire une classe Pays permettant de représenter un pays, en le caractérisant par son nom, son nombre d'habitants, sa superficie et sa capitale (de classe Ville ).
    2. Ecrire un constructeur de cette classe dans lequel on demande à l'utilisateur d'entrer le nom du pays, son nombre d'habitants et sa superficie, et dans lequel on fait appel au constructeur de la capitale.
    3. Ecrire une méthode affiche() affichant les caractéristiques du pays.
  3. Fichier principal.java
    1. Déclarer dans la fonction main() une liste de pays en utilisant la classe Vector .
    2. Ecrire une fonction permettant de remplir une liste de pays reçue en paramètre en demandant les informations à l'utilisateur.
    3. Ecrire une fonction affichant les caractéristiques de tous les pays contenus dans une liste reçue en paramètre.
    4. Ecrire une fonction recevant en paramètre une liste de pays et qui retourne le pays ayant la capitale la plus peuplée.
    5. Ecrire une fonction recevant en paramètre une liste de pays et qui la trie selon l'ordre croissant de leurs noms.

TP n°7

Exercice : Classes et objets

On veut écrire un logiciel destiné à gérer un ensemble de taxis appartenant à une société.

  1. Classe Taxi (fichier Taxi.java)
    1. Ecrire une classe Taxi permettant de représenter un taxi, en le caractérisant par son matricule (un entier), le nom de son chauffeur et son kilométrage. Toutes ces données seront déclarées comme privées .
    2. Ecrire un constructeur de cette classe dans lequel on demande à l'utilisateur d'entrer le matricule du taxi, le nom de son chauffeur et son kilométrage.
    3. Ecrire une méthode affiche() affichant les caractéristiques du taxi.
    4. Déclarer une constante KILOMETRAGE_MAX en lui donnant pour valeur 100000.
    5. Ecrire une méthode déplacement() ajoutant au kilométrage du taxi une valeur passée en paramètre correspondant à une nouvelle course.
    6. Ecrire une méthode est_dépassé() renvoyant une valeur booléenne selon que le kilométrage du taxi a dépassé ou non KILOMETRAGE_MAX .
  2. Classe Principal (fichier Principal.java)
    1. Déclarer dans la fonction main() une liste de taxis en utilisant la classe Vector .
    2. Afficher un menu proposant à l'utilisateur :
      1. D'ajouter un nouveau taxi à la liste (écrire une fonction).
      2. D'afficher les caractéristiques de tous les taxis de la liste (écrire une fonction).
      3. D'ajouter une nouvelle valeur de déplacement à un taxi de la liste désigné par son matricule (écrire une fonction).
      4. D'afficher les caractéristiques de tous les taxis de la liste dont les kilométrages excèdent KILOMETRAGE_MAX (écrire une fonction).
      5. De quitter le programme

Voici des éléments de corrections

TP n°8

Des informations sur l'héritage peuvent être trouvées sur les transparents du chapitre 09 ci-dessus.

Exercice : On veut écrire un programme de gestion de médiathèque. Dans cette médiathèque, on pourra trouver deux types de médias : des livres et des DVD.

  1. Concevoir une classe CMedia , destinée à être une classe de base des classes suivantes ( CLivre et CDvd ) :
    • un média est caractérisé par un numéro d'identification (entier) et par un booléen indiquant si le média est emprunté ou pas. Le numéro a un statut privé et le booléen un statut protégé (les classes dérivées pourront donc y accéder),
    • la classe possède un constructeur à un paramètre (on pourra supposer qu'au moment de sa création, un média n'est pas emprunté !)
    • et une méthode d'affichage des caractéristiques d'un média.
  2. Concevoir une classe CLivre héritant de la classe CMedia
    • un livre est caractérisé par son titre et par le nom de son auteur (statut privé),
    • la classe possède un constructeur à trois paramètres,
    • et une méthode d'affichage des caractéristiques d'un livre (ainsi que celles héritées de sa classe de base).
  3. Concevoir une classe CDvd héritant de la classe CMedia :
    • un DVD est caractérisé par son titre et par la durée du film qu'il contient,
    • la classe possède un constructeur à trois paramètres,
    • et une méthode d'affichage des caractéristiques d'un DVD (ainsi que celles héritées de sa classe de base).
  4. Concevoir une classe CMediatheque :
    • la donnée membre de cette classe est un objet de type Vector dont les éléments peuvent être soit des CLivre , soit des CDvd ,
    • écrire une méthode permettant d'ajouter un nouveau média (il convient de demander à l'utilisateur s'il s'agit d'un livre ou d'un DVD)
    • une méthode permettant d'affiche le contenu de la bibliothèque (médiathèque),
  5. Concevoir une application avec un menu permettant d'ajouter un média à une médiathèque, d'afficher tous les médias de la médiathèque.
  6. Quand les parties I à V sont terminées et testées, réfléchir à l'ajout de la fonctionnalité suivante : emprunt d'un média (modifie le booléen de CMedia ), modifier la fonction d'affichage de la médiathèque pour qu'elle n'affiche que les ouvrages disponibles. Ajouter ensuite une fonctionnalité permettant d'obtenir la liste des médias empruntés.

Voici des éléments de corrections

 

TP N°9 (en option)

? Le but de ce TP est de programmer le jeu du morpion . Ce jeu se joue sur un damier 3x3 de 9 cases. Chaque joueur pose successivement ses pions, X ou O, sur les cases du damiers. Le premier joueur qui aligne trois pions, horizontalement, verticalement ou en diagonale, a gagné.

Pour arriver à écrire ce programme assez complexe, il faut décomposer le problème en de nombreuses fonctions :

•  Affichage du damier

•  Les cases du damier seront représentées par les 9 variables de classe : c1 , c2 , …, c9 , de type char . Ces cases seront numérotées de la même façon que les touches du « pavé numérique », à droite du clavier. On utilisera aussi ce pavé numérique lorsque l'on demandera au joueur sur quelle case il désire poser son pion. Voici donc la numérotation choisie :

7 8 9

4 5 6

1 2 3

•  Chacune des variables précédentes pourra contenir le caractère 'X' pour le joueur X, 'O' pour le joueur O et '-' lorsqu'elle est vide. (On pourra utiliser trois «  constantes de classes »  : X , O et V , pour contenir ces symboles. Ces constantes de classe sont déclarées et initialisées par :

public final static char X = 'X'; etc.)

•  Ecrire une fonction void Initialiser() qui initialise chaque case du damier à la valeur « vide ».

•  Ecrire une fonction void Afficher() qui affiche le damier à l'écran, chaque case étant représentée par 'X' , 'O' ou '-'

•  Tester ces deux fonctions en écrivant une fonction main succincte et adéquate.

•  Pose d'un pion

•  Ecrire une fonction boolean BonnePosition(int p) qui prend comme argument un numéro de case, entre 1 et 9. La fonction teste si la case numéro p est libre. Elle renvoie true dans ce cas, et false sinon.

•  Ecrire une fonction int EntrerPosition(char j) qui prend comme argument le joueur qui doit choisir sa position, X ou O . La fonction affiche par exemple le message : « Joueur X, votre choix : », et lit un entier. Attention  : L'entier doit être compris entre 1 et 9 (c'est une case !). De plus, il faut vérifier que la case est libre, grâce la fonction BonnePosition . Finalement, la fonction renvoie la position choisie.

•  Ecrire une fonction void PoserPion(int p, char j) qui prend comme argument une position p (libre) sur le damier et un joueur j . Cette fonction remplit tout simplement la variable correspondant à la case p par le symbole du joueur j .

•  Ecrire une fonction char ChangerJoueur(char j) qui prend comme argument un joueur j , et qui renvoie le symbole correspondant à l'autre joueur.

Tester toutes les fonctions précédentes en écrivant une fonction main adéquate, du type :

continuer = true; coup = 0; joueur = 'X';

Initialiser();

while(continuer)

{

Afficher();

position = EntrerPosition(joueur);

PoserPion(position, joueur);

coup ++;

if (coup == 9)

{

continuer = false;

}

joueur = ChangerJoueur(joueur);

}

•  Gagnant

•  Ecrire une fonction boolean Gagne(char j) qui prend comme argument un joueur j . La fonction teste si le joueur j a gagné, c'est-à-dire s'il a aligné 3 pions, et elle renvoie true ou false .

•  Ecrire une fonction char AleatoireXouO() qui tire au hasard un joueur, et qui renvoie le symbole correspondant, X ou O . Cette fonction servira à savoir qui commence la partie.

•  Améliorer la fonction main précédente en utilisant ces 2 nouvelles fonctions. Dans l'algorithme, après que le joueur ait posé son pion, on pourra utiliser un test du type :

if (Gagne(joueur))

{

gagnant = joueur;

continuer = false;

}

où gagnant est une variable de type char , qui aura été initialisée par exemple à ‘-‘ , signifiant « match nul ».

? Penser à la présentation du jeu  : Afficher un titre (par exemple « JEU DU MORPION ») au début du jeu. A la fin de la partie, indiquer quel joueur a gagné, ou bien « match nul ».

 

•  Match comportant plusieurs parties

? Pour ceux qui auront fini le jeu du morpion, on se propose d'améliorer le programme pour pouvoir jouer un match en plusieurs parties : On demandera tout d'abord en combien de parties on veut jouer le match. Puis, le premier joueur est tiré au hasard. Ensuite, pour les parties suivantes, on alterne le joueur qui commence. Le gagnant est celui qui a gagné le plus grand nombre de parties.

 

•  Copier/coller la fonction main précédente, et la renommer char PartieMorpion(char premier) . Cette fonction prend comme argument le joueur qui doit jouer en premier, et renvoie le joueur gagnant.

•  Ecrire une fonction char PartieAleatoire( char premier ) qui a les même entrées/sorties que la précédente, mais qui tire simplement le gagnant au hasard. Attention, il peut y avoir match nul, et le gagnant est donc 'X' , 'O' ou '-' .

•  Ecrire la fonction main qui permet de joueur un match en n parties. Pour tester l'algorithme du match, on pourra utiliser la fonction PartieAleatoire , ce qui est beaucoup plus rapide que de joueur une partie de morpion !

 

 

 

Derniére modification : mardi 19/12/06 8:38 Envoyez vos commentaires