Corrigé des exercices sur les références



Documents pareils
Corrigés des premiers exercices sur les classes

Premiers Pas en Programmation Objet : les Classes et les Objets

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Java Licence Professionnelle CISII,

Programme Compte bancaire (code)

Utilisation d objets : String et ArrayList

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Programmer en JAVA. par Tama

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

TP1 : Initiation à Java et Eclipse

Remote Method Invocation (RMI)

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Plan du cours. Historique du langage Nouveautés de Java 7

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Chapitre 10. Les interfaces Comparable et Comparator 1

Package Java.util Classe générique

Synchro et Threads Java TM

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Tp 1 correction. Structures de données (IF2)

Projet de programmation (IK3) : TP n 1 Correction

TD3: tableaux avancées, première classe et chaînes

Programmation par les Objets en Java

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Auto-évaluation Programmation en Java

TD/TP PAC - Programmation n 3

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

TD/TP PAC - Programmation n 3

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Threads. Threads. USTL routier 1

ACTIVITÉ DE PROGRAMMATION

Cours 1: Java et les objets

Introduction : les processus. Introduction : les threads. Plan

Langage Java. Classe de première SI

INF 321 : mémento de la syntaxe de Java

Corrigé des exercices avancés sur les structures récursives

Objets et Programmation. origine des langages orientés-objet

Derrière toi Une machine virtuelle!

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Programmation avec des objets : Cours 7. Menu du jour

Un ordonnanceur stupide

TD2 Programmation concurrentielle

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation Par Objets

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Programmation en Java IUT GEII (MC-II1) 1

Utiliser Java sans BlueJ

Java 1.5 : principales nouveautés

Remote Method Invocation Les classes implémentant Serializable

Dis papa, c est quoi un bus logiciel réparti?

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Exercices sur les interfaces

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Java Licence Professionnelle CISII,

PROGRAMMATION PAR OBJETS

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Introduction au langage Java

Langage à objets : JAVA (1)

as Architecture des Systèmes d Information

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Conventions d écriture et outils de mise au point

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Calcul Parallèle. Cours 5 - JAVA RMI

Applet pour visualiser les variables «automate» notifiées

Une introduction à Java

OpenPaaS Le réseau social d'entreprise

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Programmation Objet I

TP, première séquence d exercices.

Solutions du chapitre 4

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Environnements de développement (intégrés)

Généralités sur le Langage Java et éléments syntaxiques.

Programmation Orientée Objet Java

RMI le langage Java XII-1 JMF

Desktop Intégration. Rémi Forax

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

TP1. Outils Java Eléments de correction

TP1 : Initiation à Java et Eclipse

INITIATION AU LANGAGE JAVA

7 Développement d une application de MapReduce

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Lier Erlang avec d autres langages de programmation

Notion de thread (1/2)

Eclipse atelier Java

Gestion distribuée (par sockets) de banque en Java

Programmation Objet Java Correction

1. Langage de programmation Java

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Programmation Internet en Java

Transcription:

Corrigé des exercices sur les références Exercice 3.1.1 dessin Pour cet exercice, vous allez dessiner des structures de données au moyen de petits schémas analogues à ceux du cours, comportant la pile et le tas. Les références pourront être représentées par des flèches ou des adresses. Dans ce corrigé, on représentera les références par des flèches. Question 1 tableaux Dessinez l état de la mémoire à la fin de l exécution de ce programme. class Exo_16_1_1{ public static void main(string[] args){ int[] t1, t2, t3, t4, t5; t2 = new int[4]; t3 = new int[4]; t4 = new int[4]; for (int i=0; i<t3.length; i++){ t3[i] = 10+i; t4[i] = 10+i; t5 = t4; 1

Pile Tas int[] 0 0 1 0 2 0 3 0 int[] 0 10 1 11 2 12 3 13 int[] 0 10 1 11 2 12 3 13 contexte de main args t1 0 t2 t3 t4 t5 Question 2 objets Même question pour les variables du programme suivant (var1, var2, var3, cou1, cou2, cou3, cou4, cou5, cou6. class Exo_16_1_2{ public static void main(string[] args){ var1, var2, var3; C2 cou1, cou2, cou3, cou4, cou5, cou6; var1 = new (0); var2 = new (1); cou2 = new C2(); cou3 = new C2(); cou4 = new C2(); cou6 = new C2(); cou3.premier = var1; cou3.second = var2; cou4.premier = var1; cou4.second = var1; 2 NFA032 c CNAM 2012

cou5 = cou3; cou6.premier = var1; cou6.second = new (2); class { int x; (int i){ x=i; class C2{ premier, second; NFA032 c CNAM 2012 3

Pile Tas x 0 x 1 C2 premier second C2 premier second C2 premier second C2 premier second contexte de main args var1 var2 var3 cou1 cou2 cou3 cou4 cou5 cou6 x 2 Question 3 tableaux d objets class Exo_16_1_3{ 4 NFA032 c CNAM 2012

public static void main(string[] args){ [] t1, t2, t3; var = new (0); t1=new [3]; t2=new [3]; t3=new [3]; for (int i=0; i<t1.length; i++){ t1[i] = var; t2[i] = new (0); t1[1].x = 1; t2[1].x = 1; t3 = t2; NFA032 c CNAM 2012 5

Pile Tas x 1 [] 0 1 2 [] 0 1 2 [] 0 1 2 x 0 x 1 contexte de main args var t1 t2 t3 x 0 Note : le tableau contenant des valeurs est celui qui est créé par la lignet3=new [3]; Ce tableau n est plus accessible depuis la pile (car il y a eu une nouvelle affactation àt3) et ne sert plus à rien. Il peut être supprimé à tout moment par le gestionnaire de mémoire de l interpréteur Java (Runtime). Question 4 objets contenant des tableaux class Exo_16_1_4{ public static void main(string[] args){ C3 pl1, pl2, pl3; 6 NFA032 c CNAM 2012

cl1; cl1 = new (0); pl1 = new C3(); pl2 = new C3(); pl2.tab = new [3]; pl3 = new C3(); pl3.tab = new [3]; pl3.tab[1] = cl1; pl3.tab[2] = cl1; class C3{ [] tab; Pile Tas x 0 C3 tab C3 tab [] 0 1 2 C3 tab [] 0 1 2 contexte de main args cl1 pl1 pl2 pl3 NFA032 c CNAM 2012 7

Exercice 3.1.2 comptes bancaires On va représenter des comptes bancaires et des titulaires de comptes. Un même compte peut avoir plusieurs titulaires (c est le cas par exemple des comptes joints pour un couple). Dans ce cas, le même objet sera partagé entre les titulaires. Un titutlaire peut avoir plusieurs comptes. On vous propose le squelette de classe suivant pour implémenter les comptes et les titulaires. class TableauCompte{ Compte[] tab; int longueur; TableauCompte(int n){ tab = new Compte[n]; void ajouter(compte c) throws NonInitialise{ if (c == ){ throw new NonInitialise(); if (longueur < tab.length){ tab[longueur]=c; longueur++; class Banque{ String nom; TableauCompte tous = new TableauCompte(50); Banque(String n){ nom = n; class Titulaire{ String nom; Titulaire(String n){ nom = n; TableauCompte mescomptes = new TableauCompte(10); class Compte{ int numero; int solde; void depot(int n){ solde = solde + n; void retrait(int n){ solde = solde -n; void afficher(){ Terminal.ecrireString("solde du compte numero " + numero + ": "); Terminal.ecrireInt(solde); class NonInitialise extends Exception{ 8 NFA032 c CNAM 2012

Question 1 création de comptes Ajouter à ce squelette de classes des méthodes. Seule la banque peut créer des nouveaux comptes. Quand elle crée un nouveau compte, elle l ajoute à la liste des comptes de chacun des titulaires de ce compte et elle l ajoute aussi à sa propre liste de comptes. Par exemple, si une banque b crée un compte c pour les titulaires t1 et t2, le même objet c sera ajouté à trois tableaux : b.tous, t1.mescomptes et t2.mescomptes. Dans chacun de ces trois tableaux, il y aura la même adresse, celle de l objetc. Pour réaliser cette création de comptes, il faut une méthode dans Banque qui crée un compte avec en paramètre la liste des titulaires (par exemple sous forme de tableau). Il peut également être utile d écrire une méthode permettant d ajouter un nouveau compte chez un titulaire. Question 2 variables Ecrivez une méthode main qui réalise une situation où trois titulaires, Paul, Pierre et Fatima ont des comptes dans une banque BNP. Paul et Fatima ont un compte joint. Fatima a en plus un compte personnel, de même que Pierre. Dessinez la situation en faisant apparaître sur un schéma tous les objets et tableaux. Question 3 virements On désire écrire une méthode qui permette de faire un virement depuis un compte dont on est titulaire vers un compte dont on ne connaît que le numéro (et dont on n est pas forcément titulaire) et la banque (autrement dit, on ne connaît pas son adresse). Dans quelle classe faut-il ajouter cette méthode? Ecrivez cette méthode. Cette méthode de virement ne peut être qu une méthode de la classe banque puisque c est elle seulement qui peut retrouver un compte à partir de son numéro. Plus précisément, comme c est dans la variabletous de la classebanque que l on doit chercher le compte dont le numéro est donné, il est logique de mettre cette méthode de virement dans la même classe. class TableauCompte{ Compte[] tab; int longueur; TableauCompte(int n){ tab = new Compte[n]; void ajouter(compte c) throws NonInitialise{ if (c == ){ throw new NonInitialise(); if (longueur < tab.length){ tab[longueur]=c; longueur++; void affiche(){ for (int i = 0; i<longueur; i++){ tab[i].affiche(); NFA032 c CNAM 2012 9

class Banque{ String nom; int prochainnumero = 40156; TableauCompte tous = new TableauCompte(50); Banque(String n){ nom = n; void creercompte(titulaire[] tab){ Compte c = new Compte(prochainNumero); prochainnumero++; tous.ajouter(c); for (int i=0; i<tab.length; i++){ tab[i].ajoutercompte(c); void affiche(){ Terminal.ecrireStringln("Comptes de la banque " + nom); tous.affiche(); void virement(compte from, int numeroto, int montant){ int i = 0; while(true){ if (i == tous.longueur){ break; if (tous.tab[i].numero == numeroto){ break; i++; ; if (i<tous.longueur){ from.retrait(montant); tous.tab[i].depot(montant); class Titulaire{ String nom; Titulaire(String n){ nom = n; TableauCompte mescomptes = new TableauCompte(10); void ajoutercompte(compte c){ mescomptes.ajouter(c); void affiche(){ Terminal.ecrireStringln("Comptes de " + nom); mescomptes.affiche(); class Compte{ int numero; int solde; 10 NFA032 c CNAM 2012

Compte(int n){ numero = n; solde = 0; void depot(int n){ solde = solde + n; void retrait(int n){ solde = solde -n; void affiche(){ Terminal.ecrireString("solde du compte numero " + numero + ": "); Terminal.ecrireIntln(solde); class NonInitialise extends Error{ class Exo16_2{ public static void main(string[] args){ Banque bnp = new Banque("BNP"); Titulaire paul = new Titulaire("Paul"); Titulaire pierre = new Titulaire("Pierre"); Titulaire fatima = new Titulaire("Fatima"); Titulaire[] tab1 = {paul, fatima; Titulaire[] tab2 = {fatima; Titulaire[] tab3 = {pierre; bnp.creercompte(tab1); bnp.creercompte(tab2); bnp.creercompte(tab3); bnp.affiche(); paul.affiche(); pierre.affiche(); fatima.affiche(); NFA032 c CNAM 2012 11

Pile Titulaire nom mescomptes Titulaire nom mescomptes Titulaire nom mescomptes 0 1 2 3 4 5 9 String "paul" 0 1 2 3 4 5 String "fatima" 9 String "pierre" Tas Compte numero 40156 solde 0 Compte numero 40157 solde 0 Compte numero 40158 solde 0 contexte de main args paul pierre fatima 0 1 2 3 4 5 9 Exercice 3.1.3 Procurations class TableauCompte{ Compte[] tab; int longueur; TableauCompte(int n){ tab = new Compte[n]; void ajouter(compte c) throws NonInitialise{ if (c == ){ throw new NonInitialise(); if (longueur < tab.length){ tab[longueur]=c; longueur++; 12 NFA032 c CNAM 2012

void affiche(){ for (int i = 0; i<longueur; i++){ tab[i].affiche(); boolean appartient(compte c){ for (int i =0; i< longueur; i++){ if (c == tab[i]){ return true; return false; Compte acceder(int i) throws NExistePas{ if (i<longueur){ return tab[i]; else{ throw new NExistePas(); class Banque{ String nom; int prochainnumero = 40156; TableauCompte tous = new TableauCompte(50); Banque(String n){ nom = n; void creercompte(titulaire[] tab){ Compte c = new Compte(prochainNumero); prochainnumero++; tous.ajouter(c); for (int i=0; i<tab.length; i++){ tab[i].ajoutercompte(c); void affiche(){ Terminal.ecrireStringln("Comptes de la banque " + nom); tous.affiche(); void virement(compte from, int numeroto, int montant){ int i = 0; while(true){ if (i == tous.longueur){ break; if (tous.tab[i].numero == numeroto){ break; i++; ; if (i<tous.longueur){ from.retrait(montant); NFA032 c CNAM 2012 13

tous.tab[i].depot(montant); class Titulaire{ String nom; Titulaire(String n){ nom = n; TableauCompte mescomptes = new TableauCompte(10); TableauCompte procurations = new TableauCompte(10); void ajoutercompte(compte c){ mescomptes.ajouter(c); void affiche(){ Terminal.ecrireStringln("Comptes de " + nom); mescomptes.affiche(); Terminal.ecrireStringln("Procurations de " + nom); procurations.affiche(); void recevoirprocurationde(titulaire t, Compte c) throws PasTitulaire{ if (t.mescomptes.appartient(c)){ procurations.ajouter(c); else{ throw new PasTitulaire(); class Compte{ int numero; int solde; Compte(int n){ numero = n; solde = 0; void depot(int n){ solde = solde + n; void retrait(int n){ solde = solde -n; void affiche(){ Terminal.ecrireString("solde du compte numero " + numero + ": "); Terminal.ecrireIntln(solde); class NonInitialise extends Error{ class PasTitulaire extends Exception{ class NExistePas extends Exception{ public class Exo_17_1{ public static void main(string[] args){ Banque bnp = new Banque("BNP"); 14 NFA032 c CNAM 2012

Titulaire paul = new Titulaire("Paul"); Titulaire pierre = new Titulaire("Pierre"); Titulaire fatima = new Titulaire("Fatima"); Titulaire[] tab1 = {paul, fatima; Titulaire[] tab2 = {fatima; Titulaire[] tab3 = {pierre; bnp.creercompte(tab1); bnp.creercompte(tab2); bnp.creercompte(tab3); bnp.affiche(); paul.affiche(); pierre.affiche(); fatima.affiche(); try{ pierre.recevoirprocurationde(fatima,fatima.mescomptes.acceder(0)); pierre.affiche(); paul.recevoirprocurationde(pierre,fatima.mescomptes.acceder(0)); catch(pastitulaire e){ Terminal.ecrireStringln("Exception PasTitulaire"); catch(nexistepas e){ Terminal.ecrireStringln("Exception NExistePas"); Commentaire : le sujet proposé commence à devenir complexe. Le programme donné ici n est pas très satisfaisant en terme de protection des comptes bancaires. L idée de base est que seul le titulaire connaît les comptes dont il est titulaire. Mais en fait, on a facilement accès aux comptes d une personne grâce à la variable mescomptes et à la méthode acceder. Pour aller plus loin, il faut protéger la variable et/ou la méthode avec un mode d accèsprivate ouprotected. Ce sujet sera abordé avec la notion de paquetage. NFA032 c CNAM 2012 15