TP 3 : Méthodes

14 octobre 2005 Enseignant : Dmitri Lebedev lebedev AT lix.polytechnique.fr

L'objectif de ce TP est d'apprendre à se servir des méthodes (parfois aussi nommées "fonctions").

Petit rappel : syntaxe

  1. Pour définir une méthode :
    static <type>  <nom de la méthode>
         (<type du paramètre> <nom du paramètre>){
             Instruction;
    	 Instruction;
    }
    

    Exemple:
    static double carré (double x) {
         return x*x;
    }
    
  2. Pour faire appel à une méthode :
    <nom de la méthode> (<une valeur correspondante>);
    

    Exemple:
    carré(5);
    Deug.length(str);
    ...
    
    Les deux programmes suivants sont équivalents :
    import fr.jussieu.script.Deug;
       class Carré {
          static double carré (double x) {
             return x*x;
          }
              
          public static void main (String[] args) {
             Deug.print("Donnez un nombre réel : ");
             double y = Deug.readDouble();
             Deug.println("Son carré est égal à "+ carré(y));
          }
    }
    
    import fr.jussieu.script.Deug;
       class Carré {
          public static void main (String[] args) {
             Deug.print("Donnez un nombre réel : ");
             double y = Deug.readDouble();
    	 double x = y;
    	 double resultat = x*x;
             Deug.println("Son carré est égal à "+ resultat);
          }
    }
    
  3. Attention !! Une méthode peut
    1. prendre plusieurs paramètres
      1. de meme type : double max (double x, double y)
      2. de types differents : Deug.subString (String s, int début, int fin)
    2. ne pas prendre de paramètres : Deug.readInt()
    3. retourner une valeur : tous les exemples ci-dessus
    4. ne pas retourner de valeur :
      static void afficherEnGros (String str){
         Deug.println("************************");
         Deug.println("*  " + str + "  *");
         Deug.println("************************");
      }
      

    Lecture d'un programme

  1. Que pensez vous du bout de code suivant:
    static double produit(double x,double y){
       double x = Deug.readDouble();
       double y = Deug.readDouble();
       double prod = x * y;
       return prod;
    }
    
  2. Que pensez vous du code suivant:
    class Test{
       static double produit(double x,double y){
          double prod = x * y;
          return prod;
       }
       public static void main(String[] args){
          double x = Deug.readDouble();
          double z = Deug.readDouble();
          double y = produit(x,z);
          Deug.println(y);
       }
    }
    
  3. Qu'affiche le programme suivant:
    class Essai{
      static int h(int z){
        z = z+5;
        return z;       
      }
      public static void main(String[] args){
        int z = 0, w;
        w = h(z);
        TC.print("w=");
        TC.print(w);
        TC.print(" z=");
        TC.println(z);
        return;
      }
    }
    
  4. Exercices de base

    1. Écrire une méthode max2 qui calcule le maximum de deux nombres entiers.
    2. Écrire une méthode max3 qui calcule le maximum de trois nombres entiers (sans se servir de if).
    3. Combiner ces deux dernières méthodes afin de calculer le maximum de deux ou trois nombres.
    1. Écrire une méthode --- qu'on appellera delta() --- qui, à partir des trois coefficients d'un trinome du second degré à coefficients réels, calcule le discriminant de l'équation.
    2. En se servant de la méthode delta(), écrire une méthode déterminant le nombre et les solutions d'une équation de second degré. Pour cela on utilisera la fonction Math.sqrt() qui calcule la racine carré d'un nombre de type double.
  5. Il est possible de comparer les caractères. Les caractères sont ordonnés. Les majuscules sont classées par ordre alphabétique. Il en est de même pour les minuscules. Ainsi, l'expression 'a'<'b' est évalué à true alors que l'expression 'R'<='E' est évalué à false. A l'aide des éléments ci-dessus, écrire des méthodes qui renvoient
    1. true si un caractère donné c est une lettre (miniscule ou majuscule).
    2. true si la lettre transmise en paramètre est une majuscule et false
    3. si c'est une miniscule (on supposera que la méthode est toujours appelée correctement)
  6. Les jours de la semaine

  7. Écrire une méthode jourSemaine() qui prend comme paramètre un nombre de 0 à 6 et qui renvoie le jour de la semaine correspondant sous forme d'une chaine de caractères. Tester à l'aide du programme suivant :
        import fr.jussieu.script.Deug;
        class JourDeLaSemaine{
           static String jourSemaine (int jour){
            ...
           }
           public static void main (String[] args){
              Deug.print ("Donnez le numéro du jour (0-6) : ");
              int j = Deug.readInt();
              Deug.println ("C'est un " + jourSemaine(j));
           }
         }
    
  8. Rajouter une méthode nbJour() qui prendrait comme paramètre une date en 2003 sous forme de deux entiers --- jour et mois --- et renverrait le nombre de jours passés depuis le début de l'année.
  9. Modifier le programme pour qu'il lise en entrée une date en 2003 (ex 14~07) et affiche le jour de la semaine correspondant. (Sachez que 31/12/2002 était un mardi).
  10. Ecrire une méthode nbBissextileDepuis1600() qui à partir d'une année après 1600, retourne le nombre d'années bissextiles entre l'année 1600 et cette année exclues. On se restreint ici aux dates après 1600 puisque ce n'est qu'à cette époque qu'on était introduites les années bissextiles. Rappel: pour qu'une année a soit bissextile il est nécessaire que tienne une des deux conditions :
     
    a mod 4 = 0 et a mod 100 <= 0
    ou bien a mod 400 = 0
    
  11. Rajouter une méthode nbBissextileEntre() prenant comme paramètres deux années arbitraires après 1600 qui renvoie le nombre d'années bissextiles entre les deux.
  12. Ecrire une méthode estBissextile() qui teste si une année est bissextile. A l'aide de celle-ci et de la méthode nbJour proposer une méthode jourDepuisDate qui donne le nombre de jour modulo 7 écoulés depuis le 1er janvier 2003.
  13. En utilisant les méthodes ci-dessus écrire un programme qui prend en entrée n'importe quelle date après 01/01/2003 et qui affiche le jour de la semaine correspondant. Fera-t-on un pont pour le jour de l'Armistice cette année ? Le Noel 2006 sera quel jour de la semaine ? Et votre 26ème anniversaire ?
  14. Modifier le programme afin de pouvoir traiter n'importe quel jour après 1600. Quel était le jour de la semaine quand vous etes né ?
  15. Dans de nombreux exercices nous demandons à l'utilisateur de saisir une date. Pour cela on lui demande d'entrer le jour puis le mois et enfin l'année. Pour simplifier cela, on souhaite demander à ce dernier de rentrer une date sous la forme: jj/mm/aaaa. A l'aide de la fonction Deug.stringToInt, écrire des méthodes jourDeDate(), moisDeDate() et anneeDeDate() permettant de récupérer le jour, le mois et l'année à partir d'une date au format jj/mm/aaaa. L'inclure dans le programme de l'exercice précédent.
  16. Fonctions Recursives

    Ce sont les fonctions qui font un appel aux eux-memes. Par exemple,
    static int factorial(int n){
       if(n<0){
          Deug.println("N'existe pas");
       }
       if(n<=1){
          return 1;
       }
       return n*factorial(n-1);
    }
    
    (question sur le sujet de if..else: pourquoi je ne utilise pas les elses dans ce code et ca marche?)
  17. Pour chacune des fonctions suivantes, l'exécuter à la main sur un exemple, justifier si elle termine ou non en général, et si oui dire ce qu'elle fait ou calcule. Tester ensuite sur machine.
      // f est appelée avec n >= 0
      static int f(int n){
        if(n == 0) return 1;
        else return f(n+1);
      }
    
      // sommeBis est appelée avec n < 0
      static int sommeBis(int n){
        if(n == 0)
          return 0;
        else {
          int result = sommeBis(n-1);
          result += n;
          return result;
        }
      }
    
      // g est appelée avec n >= 0
      static int g(int n){
        if(n <= 1) return 1;
        else return 1 + g(n-2);
      }
    
  18. On désire écrire un programme qui calcule et affiche le résultat de ab (a à la puissance b), a et b étant deux entiers et b >= 0. Écrire une fonction puiss() qui accepte en argument les entiers a et b et qui retourne l'entier correspondant à ab (calculé par accumulation de b multiplications). Écrire la fonction main() du programme de sorte qu'elle affiche le résultat de l'appel à puiss() avec comme arguments des entiers entrés au clavier. Exemple:
    unix% java Puissance
    Donnez a -> 2
    Donnez b -> 10
    2^10=1024