Correction 2:
Première programmation en Java


Exercice 1: IntelliJ Tutorial 2: Hello, World! (IntelliJ, Niveau 0)

Cet exercice ne nécessite pas de corrigé

Exercice 2: Tutorial IntelliJ 3: Insertion de fichiers utilitaires (IntelliJ, Niveau 0)

Cet exercice ne nécessite pas de corrigé

Exercice 3: Tutorial IntelliJ 4: Correction d'erreurs (IntelliJ, Niveau 0)

Pas de salut pour les erreurs (Niveau 1)

  1. Accolade ouvrante oubliée.

  2. Point-virgule oublié.

  3. String doit commencer par une majuscule.

  4. Commentaire pas fermé.

  5. class doit commencer par une minuscule.

  6. La méthode main doit avoir un bloc (des accolades { }) autour de ses instructions.

  7. main doit commencer par une minuscule

  8. La ligne qui indique l'en-tête de la méthode main ne doit pas être en commentaire.

Encore des erreurs (Niveau 2)

  1. Les identificateurs 200, 15LouisDor commencent par un chiffre.

  2. Un identificateur ne peut pas contenir de #,@,-.

Cette fois c'est à l'exécution... (Niveau 2)

  1. Au moment de la division a vaut 0. Un int est compris entre [-2147483648, +2147483647].

Exercice 4: MOOC (cours en ligne) (MOOC, Niveau 1)

Cet exercice ne nécessite pas de corrigé

Exercice 5: Eclipse Tutorial 3 (inutile si vous travaillez avec IntelliJ): Hello, World! (Eclipse, Niveau 0)

Cet exercice ne nécessite pas de corrigé

Exercice 6: Tutorial Eclipse 4 (inutile si vous travaillez avec IntelliJ): Insertion de fichiers utilitaires (Eclipse, Niveau 0)

Cet exercice ne nécessite pas de corrigé

Exercice 7: Tutorial Eclipse 5 (inutile si vous travaillez avec IntelliJ): Correction d'erreurs (Eclipse, Niveau 0)

Pas de salut pour les erreurs (Niveau 1)

  1. Accolade ouvrante oubliée.

  2. Point-virgule oublié.

  3. String doit commencer par une majuscule.

  4. Commentaire pas fermé.

  5. class doit commencer par une minuscule.

  6. La méthode main doit avoir un bloc (des accolades { }) autour de ses instructions.

  7. main doit commencer par une minuscule

  8. La ligne qui indique l'en-tête de la méthode main ne doit pas être en commentaire.

Encore des erreurs (Niveau 2)

  1. Les identificateurs 200, 15LouisDor commencent par un chiffre.

  2. Un identificateur ne peut pas contenir de #,@,-.

Cette fois c'est à l'exécution... (Niveau 2)

  1. Au moment de la division a vaut 0. Un int est compris entre [-2147483648, +2147483647].

Exercice 8: Indice de masse corporelle (Entrées-sorties de base, expressions, Niveau 0)

Cet exercice ne nécessite pas de corrigé.


Exercice 9: Année de naissance (Opérateurs et expressions, Niveau 1)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Les directives import se placent en début de fichier
import java.util.Scanner;

class Age {

    public static void main(String[] args) {
        // on fera mieux plus tard !
        final int ANNEE_COURANTE = 2023;

        System.out.println("Donnez votre age : ");

        Scanner input = new Scanner(System.in);

        int age = input.nextInt();

        int annee = ANNEE_COURANTE - age;

        // A partir de la semaine prochaine on pourra
        // tester si l'utilisateur ne nous dit pas de bêtise sur son âge !

        System.out.println("Votre annee de naissance est : " + annee);
    }
}

Cette solution utilise le bagage actuel : celui avec lequel vous ne savez mettre des instructions que dans le corps de la méthode main. L'objet input de type Scanner qui permet de lire des données introduites depuis le terminal est déclaré et initialisé dans la méthode main.

Note: si vous procédez de cette manière, et que vous travaillez sous Eclipse, un message de mise en garde sera généré pour vous indiquer que input n'a pas été fermé. Les causes de ce message dépassent les notions vues dans le cadre de ce cours d'introduction et ce message n'aura aucune incidence sur l'exécution de votre programme. Pour l'éviter il suffira d'ajouter l'instruction input.close(); avant la dernière accolade de main; c'est à dire juste après le dernier System.out.println(...) dans le code précédent.

Notez à ce propos, qu'il est possible de déclarer-initialiser cet objet en dehors de main, comme ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class AgeBis {
    // l'objet input est déclaré ici et plus dans le corps de main
    private static Scanner input = new Scanner(System.in);

    public static void main(String[] args)
        {
            final int ANNEE_COURANTE = 2023; // on fera mieux plus tard !

            System.out.println("Donnez votre age : ");

            int age = input.nextInt();
            
            int annee = ANNEE_COURANTE - age;

            // a partir de la semaine prochaine on pourra
            // tester si l'utilisateur ne nous dit pas de betise sur son age !
            
            System.out.println("Votre annee de naissance est : " + annee);
        }
}

C'est sous cette forme que vous le trouverez donc parfois dans certains corrigés à venir.

Cela peut avoir du sens à partir du moment où nous utiliserons la notion de fonctions/méthodes (un peu plus tard dans le cours).

Pour le moment les mots clés static et private ne vous disent rien. Cela deviendra plus clair dès que les fondamentaux de la POO seront abordés.


Exercice 10: Fondue fribourgeoise (Entrées-sorties de base, expressions, Niveau 1)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.Scanner;

public class Fondue {
   
   public static void main(String[] args) {
      final int BASE = 4;     // nombre de personnes pour la recette de base
      
      // Pour faire une fondue fribourgeoise pour 4 personnes il faut : 
      
      double fromage = 800;    // 800gr de Vacherin fribourgeois
      double eau = 2;         // 2dl d'eau
      double ail = 2;         // 2 gousses d'ail
      double pain = 400;        // 400 gr de pain
      
      /* On supposera pour cet exercice que l'utilisateur ne saisit que des
       * valeurs strictement positives, mais nous pourrons faire mieux dès
       * la semaine prochaine
       */
      System.out.print("Entrez le nombre de personne(s) conviée(s) à la fondue : ");
      Scanner clavier = new Scanner(System.in);
      
      int nbConvives = clavier.nextInt();
      
      // Mise à jour des quantités en fonction du nombre de convives :
      double ratio = nbConvives;  // .. Notez le 'double' indispensable
                                  // pour éviter la division entière
      ratio /= BASE;
      fromage *= ratio;
      eau    *= ratio;
      ail    *= ratio;
      pain    *= ratio;

      System.out.println();
      System.out.print("Pour faire une fondue fribourgeoise pour " + nbConvives + " personne(s), ");
      System.out.println("il vous faut : ");
      System.out.println(" - " + fromage + " gr de Vacherin fribourgeois");
      System.out.println(" - " + eau + " dl d'eau");
      System.out.println(" - " + ail + " gousse(s) d'ail");
      System.out.println(" - " + pain + " gr de pain");
      System.out.println(" - du poivre à volonté");

      clavier.close();
   }
   
}


Exercice 11: Expression polynômiale (Opérateurs et expressions, Niveau 1)

Le but est d'écrire un petit programme permettant d'évaluer un polynôme du 3ème degré de la forme:

((a+b)/2)x
3 + (a+b)2x2 + a + b + c

On commence par lire les coefficients du polynôme:

import java.util.Scanner;
class Degre3 {
    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.print("Entrez le coefficient a (int): ");
        int a = scanner.nextInt();
        System.out.print("Entrez le coefficient b (int) ");
        int b = scanner.nextInt();
        System.out.print("Entrez le coefficient c (int) ");
        int c = scanner.nextInt();
    }
}

on fait pareil pour la variable, mais cette fois c'est un double:

import java.util.Scanner;
class Degre3 {
    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        System.out.print("Entrez le coefficient a (int): ");
        int a = scanner.nextInt();
        System.out.print("Entrez le coefficient b (int) ");
        int b = scanner.nextInt();
        System.out.print("Entrez le coefficient c (int) ");
        int c = scanner.nextInt();
        
        System.out.print("Entrez la valeur de la variable x (double) ");
        double x = scanner.nextDouble();
    }
}

Ensuite il faut coder la formule. On peut remarquer alors que a+b et x*x interviennent plusieurs fois dans le calcul. Pour éviter d'avoir à les recalculer deux fois, on peut les stocker dans des variables intermédiaires. On fait ensuite le calcul et on affiche le résultat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Scanner;

class Degre3 {

    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("Entrez le coefficient a (int) : ");
        int a = scanner.nextInt();
        System.out.print("Entrez le coefficient b (int) : ");
        int b = scanner.nextInt();
        System.out.print("Entrez le coefficient c (int) : ");
        int c = scanner.nextInt();

        System.out.print("Entrez la valeur de la variable x (double) : ");
        double x = scanner.nextDouble();

        double xx = x * x;
        double aux = a + b;
        double valeur = aux/2 * x * xx + aux * aux * xx + aux +c;
        System.out.println("La valeur de l'expression est: " + valeur);

        scanner.close();
    }
}

Attention! Pour que le calcul de (a+b)/2 se fasse correctement (sans troncature due à la division entière), il est indispensable que la variable intermédiaire aux soit déclarée comme double.


Exercice 12: Opérateurs d'incrémentation/décrémentation (Opérateurs et expressions, Niveau 1)

Dans le premier cas l'incrémentation se fait après l'évaluation de l'expression et dans l'autre avant.


Exercice 13: Types (Types de base, Niveau 1)

n1 vaut 2
r1 vaut 2.7

n2 vaut (affectation impossible)
r2 vaut 5.0

n3 vaut 5
r3 vaut 5.6

n4 vaut 9
r4 vaut 9.0
r5 vaut 9.0

n5 vaut 4
n6 vaut (affectation impossible)
r6 vaut 5.0
n7 vaut 0
r7 vaut 3.8

r8 vaut 3.0
r9 vaut 4.0
r10 vaut 4.0
r11 vaut 4.75

Exercice 14: Variable, affectation (Opérateurs et expressions, Niveau 2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Scanner;

class Permutation {

    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("Entrez x: ");
        int x = scanner.nextInt();

        System.out.print("Entrez y: ");
        int y = scanner.nextInt();

        System.out.println("Avant permutation: ");
        System.out.println("x : " + x);
        System.out.println("y : " + y);

        int tmp = x;
        x = y;
        y = tmp;

        System.out.println("Après permutation: ");
        System.out.println("x : " + x);
        System.out.println("y : " + y);

        scanner.close();
    }
}


Exercice 15: Un peu de tout, division d'entiers (Opérateurs et expressions, Niveau 2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Scanner;

class RosesBlanches {

    public static void main(String args[]) {
        
        Scanner scanner = new Scanner(System.in);
        
        // Entrée de données
        System.out.print("Combien avez-vous reçu d'argent (Frs):) ");
        int budget = scanner.nextInt();

        // Calcul du budget livres & fournitures
        int budgetLivres = budget * 3 / 4;
        int resteBudget = budget - budgetLivres;

        // Calcul du budget pour les trois autres rubriques
        int autre = resteBudget / 3;

        // Calcul du nombre de cafés
        int nbcafes = autre / 2;

        // Calcul du nombre de numéros du Flash
        int nbFlash = autre / 4;

        // Calcul du nombre de billets de TSOL
        int nbBillets = autre / 3;

        // Calcul de l'argent restant
        int reste = autre % 2 + autre % 4 + autre % 3 + resteBudget % 3;

        // Affichage des résultats
        System.out.println("Livres et Fournitures: " + budgetLivres + " Frs.");
        System.out.println("Vous pouvez ensuite acheter:");
        System.out.println(" " + nbcafes + " cafés à Sat");
        System.out.println(" " + nbFlash + " numéros du Flash");
        System.out.println(" " + nbBillets + " billets de métro");
        System.out.println("et il vous restera " + reste + " Frs pour les roses blanches.");

        scanner.close();
    }
}


Dernière mise à jour: 06/10/2023  (Revision: 1.2)