Corriges Classes 1

download Corriges Classes 1

of 8

Transcript of Corriges Classes 1

  • 7/24/2019 Corriges Classes 1

    1/8

    Corrigs des premiers exercices sur les

    classes

    Exercice 2.1.1utilisation dune classe

    Voici le texte dune classe reprsentant de faon sommaire un compte bancaire et les oprations

    bancaires courantes.

    classCompte{

    intsolde = 0;

    voiddepot(intmontant){

    solde = solde + montant;

    }

    voidretrait(intmontant){

    solde = solde -montant;

    }

    voidvirement(intmontant, Compte autre){

    autre.retrait(montant);this.depot(montant);

    }

    voidafficher(){

    Terminal.ecrireString("solde: "+ solde);

    }

    }

    Question 1

    Comment fonctionne la mthode virement ? Combien de comptes fait-elle intervenir ?

    Rponse : la mthode virement fait intervenir deux objets de typeCompte

    : this, lobjet surlequel la mthode est apple et autre, le paramtre de la mthode. Le virement seffectue du

    paramtre versthis. Largent est retir dun compte et dpos sur lautre.

    Question 2

    Crez deux comptes que vous affecterez deux variables. Ecrivez le code correspondant aux

    oprations suivantes :

    dpot de 500 euros sur le premier compte.

    dpot de 1000 euros sur le second compte.

    retrait de 10 euros sur le second compte.

    virement de 75 euros du premier compte vers le second.

    1

  • 7/24/2019 Corriges Classes 1

    2/8

    affichage des soldes des deux comptes.

    Vous mettrez le code java correspondant cette question dans la mthode maindune nouvelle

    classe appeleTesteCompte. Vous compilerez et testerez ce programme.

    Question 3

    Crez un tableau de dix comptes. Pour cela, notez bien quil faut dabord crer le tableau puis

    crer successivement les dix comptes mettre dans les dix cases de ce tableau.

    Dans chaque case, faites un dpot de 200 euros plus une somme gale 100 fois lindice du

    compte dans le tableau.

    Ensuite, vous ferez un virement de 20 euros de chaque compte vers chacun des comptes qui le

    suivent dans le tableau (par exemple, du compte dindice 5, il faut faire des virements vers les comptes

    dindice 6, 7, 8 et 9).

    Enfin, vous afficherez les soldes de tous les comptes.

    Ici encore, vous testerez et compilerez le code propos.

    classCompte{

    intsolde = 0;

    voiddepot(intmontant){

    solde = solde + montant;

    }

    voidretrait(intmontant){

    solde = solde -montant;

    }

    voidvirement(intmontant, Compte autre){

    autre.retrait(montant);

    this.depot(montant);

    }voidafficher(){

    Terminal.ecrireString("solde: "+ solde);

    }

    }

    classTesteCompte{

    public static voidmain(String[] argv){

    Compte martin, jean;

    Compte[] table =newCompte[10];

    martin =newCompte();

    jean = newCompte();

    martin.depot(500);

    jean.depot(1000);jean.retrait(10);

    jean.virement(75,martin);

    Terminal.ecrireString("Compte de jean, ");

    jean.afficher();

    Terminal.sautDeLigne();

    Terminal.ecrireString("Compte de martin, ");

    martin.afficher();

    Terminal.sautDeLigne();

    for(inti=0; i

  • 7/24/2019 Corriges Classes 1

    3/8

    for(inti=0; i

  • 7/24/2019 Corriges Classes 1

    4/8

    unCompte.depot(700);

    unCompte.afficher();

    Terminal.sautDeLigne();

    }}

    Question 3

    Faut-il prvoir des mthodes permettant de changer le nom du titulaire du compte ?

    Rponse : ce nest pas facile dire. Est-ce quun compte peut changer de titulaire ? Est-ce

    quune personne peut changer de nom ? En tout tat de cause, il peut tre utile de prvoir un

    moyen de corriger une ventuelle faute de frappe la saisie.

    Exercice 2.1.3mthodes statiques ou nonParmi les mthodes de la classe suivante, lesquelles peuvent tre statiques et lesquelles ne peuvent

    en aucun cas tre statiques ?

    classExo13_3{

    intx, y;

    String nom;

    voidafficher(){

    Terminal.ecrireString(nom + " " + x + " " + y);

    }

    voidajouter(Exo13_3 obj){

    x = x + obj.x;

    y = y + obj.y;nom = nom + obj.nom;

    }

    Exo13_3 nouveau(intn){

    Exo13_3 res =newExo13_3();

    res.x = n;

    res.y = n*2;

    res.nom = "Auto_"+n;

    returnres;

    }

    booleanplusGrand(Exo13_3 obj){

    if(obj.x == x){

    returny>obj.y;}else{

    returnx>obj.x;

    }

    }

    booleancompare(Exo13_3 obj1, Exo13_3 obj2){

    if(obj1.x == obj2.x){

    returnobj1.y>obj2.y;

    }else{

    returnobj1.x>obj2.x;

    }

    }

    }

    4 NFA032 cCNAM 2012

  • 7/24/2019 Corriges Classes 1

    5/8

    Les mthodes statiques sont des mthodes qui existent indpendamment de tout objet. Elles ne

    peuvent pas utiliser les variables dinstances ni this. Ici, il y a trois variables dinstance, x, y et nom.

    Les mthodes afficher, ajouter, plusGrandutilisent des variables dinstance et/ou

    this. Elle ne peuvent en aucun cas tre statiques.

    Les deux autres mthodes,nouveauet comparepeuvent tre dclares static.

    Exercice 2.1.4galit dobjets

    classCompteur{

    intx;

    Compteur(intn){

    x=n;

    }

    Compteur incremente(){x++;

    return this;

    }

    intvalue(){

    returnx;

    }

    }

    classExo13_4{

    public static voidmain(String[] argv){

    Compteur c1, c2, c3;

    c1 = newCompteur(0);

    c1.incremente();

    c2 = newCompteur(1);

    c3 = c1;

    if(c1 == c3){

    Terminal.ecrireStringln("c1 et c3 sont egaux");

    }else{

    Terminal.ecrireStringln("c1 et c3 ne sont pas egaux");

    }

    if(c1.value() == c2.value()){

    Terminal.ecrireStringln("c1 et c2 ont meme valeur");

    }else{

    Terminal.ecrireStringln("c1 et c2 nont pas la meme valeur");

    }

    if(c1 == c2){Terminal.ecrireStringln("c1 et c2 sont egaux");

    }else{

    Terminal.ecrireStringln("c1 et c2 ne sont pas egaux");

    }

    if(c1.value() == c1.incremente().value()){

    Terminal.ecrireStringln("c1 et c1 incremente ont meme valeur");

    }else{

    Terminal.ecrireStringln("c1 et c1 incremente nont pas la meme valeur");

    }

    if(c1 == c1.incremente()){

    Terminal.ecrireStringln("c1 et c1 incremente sont egaux");

    }else{

    NFA032 cCNAM 2012 5

  • 7/24/2019 Corriges Classes 1

    6/8

    Terminal.ecrireStringln("c1 et c1 incremente ne sont pas egaux");

    }

    }

    }

    Essayez de prdire le rsultat de lexcution de ce programme. Testez le programme. Que peut-on

    en dduire sur la notion dgalit dobjets en java ?

    Dans ce corrig, nous allons constater le rsultat affich et essayer de comprendre ce que cela

    signifie.

    > java Exo13_4

    c1 et c3 sont gaux

    c1 et c2 ont mme valeur

    c1 et c2 ne sont pas gauxc1 et c1 incremente nont pas la mme valeur

    c1 et c1 incremente sont gaux

    On voit que le comparateur == teste lidentit plutt que lgalit en terme de valeur. Par exemple,

    c1 et c3 sont considrs comme gaux parce quil sagit dun mme objet, cr par un seul et unique

    new. En revanche, c1 et c2 qui sont crs par deux new diffrents ne peuvent en aucun cas tre

    reconnus gaux, mme si ils ont le mme tat (cest le cas ici, puisque ltat consiste dans la valeur de

    lunique variable dinstance x.

    A contrario, si on compare deux fois le mme objet en ayant chang sa valeur entre temps, il sera

    bien reconnu comme gal. Le test porte donc sur lidentit de lobjet et non pas sur les valeurs de ses

    variables dinstance.

    Il est bien vident que ce test ne correspond pas toujours lgalit dont on a besoin, cest pourquoi

    dans beaucoup de classes, il existe un autre type de test utilisant la mthode equals. Nous avons dj

    vu cela pour lesString. Lorsquon crit une classe, il est parfois utile et ncessaire de dfinir cette

    mthode equals.

    Exercice 2.1.5conception

    Cet exercice a pour but de rflchir sur la conception dun programme, sa structuration en classes.

    Il ne sagit pas pour le moment de raliser ce programme, mais juste de concevoir son architecture.On fait des cocktails avec diffrents liquides (alcools, sodas, jus de fruits). On a un bar avec

    des bouteilles qui peuvent tre pleines ou moiti vides. On a des shakers qui ont une contenance

    donne. Il y a des recettes de cocktails qui indiquent seulement les proportions. Ces recettes peuvent

    sappliquer des quantits plus ou moins grandes selon les besoins du moment.

    Les cocktails se font en dversant une partie du contenu des bouteilles dans des shakers. Aprs, il

    faut secouer. Les shakers sont ensuite vids (dans les verres, mais on ne tiendra pas compte des verres

    dans cette application). Il faut les laver aprs usage.

    Question : quelles classes faut-il crer ? Quelles informations faut-il dans chaque classe ? Quelles

    mthodes faut-il crire, et dans quelle classe les mettre ?

    Voyons dabord une premire approche :

    6 NFA032 cCNAM 2012

  • 7/24/2019 Corriges Classes 1

    7/8

    classe variables mthodes

    Bouteille nom du produit verser une certaine quantit

    quantit restante

    Bar liste de bouteilles ajouter une bouteille

    jeter une bouteille

    rechercher une bouteille dun produit

    Shaker contenance ajouter un ingrdient

    liste des ingrdients avec nom et quantit vider le shaker

    laver le shaker

    Recette liste des ingredients avec nom et proportion vrifier si un shaker

    respecte la recette

    Des questions se posent quant aux types des variables. Par exemple, pour les quantits, allons-nous

    choisir des entiers ou des nombres virgule ? Pour les ingrdients, allons-nous crer des enregistre-

    ments, donc une nouvelle classe, avec un nom dingrdient et une quantit ? Ce sont ces questions

    quil faut rpondre. Il ny a pas forcment une solution unique, mais un ensemble de solutions pos-

    sibles, parmi lesquelles il faut choisir.

    Reprenons maintenant classe par classe pour prciser les types.

    Classe Ingredient:

    nomProduit:typeString

    quantite:typeint

    Classe Bouteille:

    contenu:typeIngredient

    verser:

    paramtre : quantit verser, type int

    valeur retourne : aucune, type void

    Classe Bar

    reserve: type Bouteille[]

    ajouter:

    paramtre : une bouteille, typeBouteille

    valeur retourne : aucune, type void

    jeter :

    paramtre : une bouteille, typeBouteille

    valeur retourne : aucune, type void

    chercher :

    paramtre : un nom dingrdient, type String

    valeur retourne : une bouteille, typeBouteille

    Classe Shaker

    contenance: type int

    contenu: type Ingredient[]

    propre: type boolean

    ajouter:

    paramtre :Ingredient

    valeur retourne : aucune, type void

    vider:

    paramtre : aucun

    valeur retourne : aucune, type void

    laver:

    NFA032 cCNAM 2012 7

  • 7/24/2019 Corriges Classes 1

    8/8

    paramtre : aucun

    valeur retourne : aucune, type void

    Classe Recette

    ingredients: typeIngredient[]

    verifie:

    paramtre : un shaker, typeShaker

    rsultat : typeboolean

    8 NFA032 cCNAM 2012