Unité IN3S02 - TD1
Corrigé

2.1- Types primitifs et expressions

2.1.1- Types et expressions numériques

1 + 2 / 3         a pour valeur 1
47 % 2            a pour valeur 1
5.0 + 2 / 3       a pour valeur 5.0
10 + 2.0 / 3      a pour valeur 10.6666

2.1.2- Type booléen et expressions logiques

A- Faux. Si les variables ne sont pas toutes booléennes, le compilateur Java génère une erreur ; si les variables sont toutes booléennes, le résultat ne    correspond pas à l'assertion de l'énoncé.
B - Faux. Idem A.
C - Faux, car la division réalisée est une division entière.
D - Faux. Erreur de compilation (= n'est pas ==)
E - Faux. Problème pour d < 0

2.1.3- Type char

A - Faux, car ’a’, ’b’ et ’c’ sont des constantes littérales du type char
B - Faux, car a, b, c sont des identificateurs de variable
C - Faux, car  ’b’ est une constante littérale de type char
D - Vrai
E -  Faux, car ”c” est une chaîne de caractères et on un élément de type char

A - Faux, car il existe des caractères entre '9' et 'A' et  (int)'0'  ne vaut pas 0
B - Faux. Erreur de compilation sur les conditions
C - Faux. Erreur de compilation sur les conditions
D - Faux. Erreur de conversion dans le cas ['A' ... 'F']
E - Vrai

2.2- Instructions if

2.2.1- if-else imbriqués (1)

A - Faux, car le else se rattache au 2ème if
B - Vrai
C - Faux, car l'instruction  a=a+1;  est susceptible de modifier le résultat du test du 2ème if
D - Faux.
E - Vrai

2.2.2 - if-else imbriqués (2)

A - Vrai
B - Vrai
C - Faux, car le else se rattache au 3ème if
D - Vrai
E - Faux, car le else se rattache au 3ème if

2.3- Instructions de boucle

2.3.1- Boucle for

si x0 <= 1
    alors x = x0
    sinon si x est entier
                alors x = x0 puissance x0
                sinon x = x0 puissance (PartieEntière(x0)+1)

2.3.2- Boucle while

A - Vrai
B - Faux.
C - Vrai
D - Faux
E - Faux 

2.3.3- Boucles while vs do-while (1)

A-  Faux
B-  Vrai
C-  Vrai
D-  Faux
E-  Vrai

2.3.4- Boucles while vs do-while (2)

A - Vrai
B - Faux
C - Faux
D - Faux
E -  Faux

2.4- Exercices de synthèse

2.4.1- Conjecture Hongroise

/**
 * Test the hungarian conjecture in a given range
 * @param  the range [nmin, nmax], 0 < nmin <= nmax
 * @return true ssi the Hungarian conjecture is true in [nmin, nmax]
 */
public static boolean testHungarianConjecture(int nmin, int nmax) {
    for(int n = nmin; n <= nmax; n++ ) {
       int h = n ;
       while ( h != 4 ) {
          if ( h % 2 == 0 ) h = h / 2 ;
          else              h = 3*h + 1 ;
       }
    }
    return true ;
}

2.4.2- Suite "somme des cubes des chiffres du terme précédent"

/**
 * Calculate the convergent value of the series
 * "sum of cubes of digits of a natural integer multiple of 3"
 * @param   n is suppose positif and multiple of 3
 * @return  the convergent value of the n initial term series
 */
public static int cubeSumSerie(int n) {
    int nprevious;
    int digit;
    int sum;
    do {
       nprevious = n ;
       sum = 0 ;
       while ( n != 0 ) {
          digit = n % 10 ;
          sum += digit * digit * digit ;
          n = n / 10 ;
       }
       n = sum ;
    } while (n != nprevious );
    return n ;
}

2.4.3- Dernier dimanche du mois

/*
 * Calculate the last sunday of the month
 * @param   dayOfWeek in {'l', 'm', 'M', 'j', 'v', 's', 'd'}
 * @param   day in [0, 31]

 * @param   month in [0, 12]
 * @param   year in format AAAA
 * @return  day of the last sunday of this month
 */
public static int lastSunday(char dayOfWeek, int day, int month, int year) {
    int nextSunday ;
    int lastDayOfMonth ;
   
    // Calculate the last day of the month
    if ( month == 2 ) {
       if ( (year % 400 == 0) || (year % 100 != 0  &&  year % 4 == 0 ) )
          lastDayOfMonth = 29 ;
       else
          lastDayOfMonth = 28 ;
    } else if ( ( month <= 7  &&  month % 2 == 1 ) || ( month >= 8  &&  month % 2 == 0 ) {

          lastDayOfMonth = 31 ;
    } else {
          lastDayOfMonth = 30 ;
    }

    // calculate the next sunday
    switch ( dayOfWeek ) {
       case 'l'   :   nextSunday = day + 6 ; break ;
       case 'm'   :   nextsunday = day + 5 ; break ;
       case 'M'   :   nextSunday = day + 4 ; break ;
       case 'j'   :   nextSunday = day + 3 ; break ;
       case 'v'   :   nextSunday = day + 2 ; break ;
       case 's'   :   nextSunday = day + 1 ; break ;
       case 'd'   :   nextSunday = day + 0 ; break ;
    }
    if (nextSunday > lastDayOfMonth) nextSunday -= 7 ;

    // return the last sunday of the month
    return nextSunday + 7 * ((lastDayOfMonth - nextSunday) / 7) ;
}