1. java-hell.de
  2. Thèmes
  3. Exercices pratiques
Thème 11 sur 11

Exercices Java – Défis de programmation

Fini les textes à trous : dans les défis, tu combines tout ce que tu as appris en petits programmes, de la fiche personnelle à la mini calculatrice jusqu'au grand classique des entretiens, FizzBuzz.

Les exercices

Ce que tu vas apprendre dans ce thème

  1. ⚔️ Défi : carte de profil
  2. ⚔️ Défi : suite de nombres
  3. ⚔️ Défi : Mini-calculatrice
  4. ⚔️ Défi : Bulletin de notes
  5. ArrayList
  6. Try-Catch
  7. FizzBuzz
Exercice 1 sur 7

⚔️ Défi : carte de profil

C'est l'heure de tester ce que tu sais ! Utilise tout ce que tu as appris jusqu'ici.

Crée des variables pour une carte de profil et affiche-les comme ceci :

Nom : Java-Dev
Âge : 20
Langage : Java

Les variables sont déjà là. Tu n'as qu'à ajouter les trois lignes println.

Code de départ
void main() {
    String nom = "Java-Dev";
    int age = 20;
    String langage = "Java";

    // Affiche ces trois lignes :
    // Nom : Java-Dev
    // Âge : 20
    // Langage : Java
}
Contexte
Pourquoi des défis ?

On n'apprend pas à programmer en lisant, on apprend en résolvant activement des problèmes. Les défis combinent plusieurs notions, exactement comme de vraies tâches de programmation.

Dans la vraie vie, tu ne vas jamais créer juste une variable isolée. Tu vas combiner des variables avec de l'affichage, des calculs et des conditions. Ces défis te préparent à ça.

Exercice 2 sur 7

⚔️ Défi : suite de nombres

Combine les boucles et les conditions !

Affiche les nombres de 1 à 20, mais saute tous les nombres divisibles par 3.

Sortie attendue :
1 2 4 5 7 8 10 11 13 14 16 17 19 20

Astuce : utilise continue;, qui saute le reste du tour de boucle en cours.

Code de départ
void main() {
    for (int i = 1; i <= 20; i++) {
        // Saute les nombres divisibles par 3


        IO.print(i + " ");
    }
}
Contexte
break et continue

break; quitte toute la boucle. continue; saute seulement le tour en cours et passe directement au suivant.

Dans des boucles imbriquées, les deux n'agissent que sur la boucle la plus intérieure. Avec des étiquettes (labels), tu peux aussi viser les boucles extérieures : exterieure: for (...) { ... break exterieure; }

Exercice 3 sur 7

⚔️ Défi : Mini-calculatrice

Écris une méthode calculer qui reçoit deux nombres et un opérateur, et qui renvoie le résultat.

Opérateurs pris en charge : +, -, *

Sortie attendue :

15
3
54
Code de départ
int calculer(int a, int b, char op) {
    // Renvoie a+b, a-b ou a*b
    // selon op ('+', '-' ou '*')
    return 0;
}

void main() {
    IO.println(calculer(10, 5, '+'));
    IO.println(calculer(10, 7, '-'));
    IO.println(calculer(6, 9, '*'));
}
Contexte
char — le type caractère

char stocke un seul caractère sur 2 octets (pour être précis, une unité de code UTF-16 — certains caractères comme les emojis en ont besoin de deux). Les chars s'écrivent entre apostrophes simples : 'A'. Les chaînes de caractères s'écrivent entre guillemets doubles : "A".

Comme char est un type primitif, tu peux bel et bien utiliser == pour comparer ici. Ça ne marche pas avec les chaînes !

Exercice 4 sur 7

⚔️ Défi : Bulletin de notes

Crée une classe Eleve avec :

  • un attribut nom (String)
  • un attribut note (int, à l'allemande : 1 = la meilleure, 6 = la pire — pas sur 20 !)
  • un constructeur qui définit les deux
  • une méthode resultat() qui renvoie "admis" si la note est ≤ 4, sinon "recalé"

Sortie attendue :

Emma: admis
Hugo: recalé
Code de départ
void main() {
    Eleve a = new Eleve("Emma", 2);
    Eleve b = new Eleve("Hugo", 5);
    IO.println(a.nom + ": " + a.resultat());
    IO.println(b.nom + ": " + b.resultat());
}

class Eleve {
    String nom;
    int note;

    // Constructeur
    // Méthode resultat() -> "admis" ou "recalé"
}
Contexte
Encapsulation

Dans du vrai code Java, les attributs seraient private et accessibles uniquement via des getters/setters. Ça s'appelle l'encapsulation — c'est toi qui contrôles comment le monde extérieur accède à tes données.

Exemple : un setter pour note pourrait vérifier que la valeur est entre 1 et 6. Sans encapsulation, n'importe qui pourrait écrire e.note = -5;.

Exercice 5 sur 7

ArrayList

Les tableaux ont une taille fixe. Une ArrayList, elle, peut grandir :

ArrayList<String> liste = new ArrayList<>();
liste.add("Bonjour");
liste.add("le monde");
liste.size(); // 2

Ajoute le nombre 30 à la liste pour que sa taille passe à 3.

Code de départ
import java.util.ArrayList;

void main() {
    ArrayList<Integer> nombres = new ArrayList<>();
    nombres.add(10);
    nombres.add(20);
    // Ajoute 30
    IO.println(nombres.size());
}
Contexte
Génériques et classes enveloppes

ArrayList<Integer> : le <Integer> est un générique. Il fixe le type que la liste contient. Les génériques t'empêchent d'y glisser par erreur le mauvais type.

Pourquoi Integer et pas int ? Les génériques ne marchent qu'avec des types objet. Integer est la classe enveloppe (wrapper) de int. Java convertit automatiquement entre les deux (autoboxing/unboxing).

Exercice 6 sur 7

Try-Catch

Parfois, ça part en vrille, par exemple quand tu essaies de transformer "abc" en nombre.

Avec try-catch, tu attrapes l'erreur au lieu de laisser ton programme planter :

try {
    // Code qui peut échouer
} catch (Exception e) {
    // Ce qu'on fait si ça échoue
}

Entoure la ligne qui plante d'un try-catch et affiche Erreur ! si quelque chose tourne mal.

Code de départ
void main() {
    String texte = "abc";

    // Entoure la ligne suivante d'un try-catch
    // En cas d'erreur : affiche "Erreur !"
    int nombre = Integer.parseInt(texte);
    IO.println(nombre);
}
Contexte
Exceptions vérifiées et non vérifiées

Java en a deux sortes : les exceptions vérifiées (checked, par ex. IOException) doivent être explicitement attrapées ou déclarées. Les exceptions non vérifiées (unchecked, par ex. NumberFormatException, NullPointerException) non.

En pratique, beaucoup de frameworks n'utilisent que des exceptions non vérifiées. La règle des checked exceptions de Java est controversée : d'autres langages (Kotlin, C#) ne l'ont tout simplement pas.

Exercice 7 sur 7

FizzBuzz

L'exercice d'entretien d'embauche le plus célèbre de tous les temps.

Affiche les nombres de 1 à 15, mais :

  • Divisible par 3 → Fizz
  • Divisible par 5 → Buzz
  • Divisible par 3 et par 5 → FizzBuzz
  • Sinon → le nombre

Astuce : vérifie d'abord le cas FizzBuzz (divisible par 15) !

Astuce 2 : % te donne le reste. 15 % 3 == 0 veut dire « 15 est divisible par 3 ».

Code de départ
void main() {
    for (int i = 1; i <= 15; i++) {
        // Ta chaîne de if-else va ici

        IO.println(i);
    }
}
Contexte
FizzBuzz : plus qu'un exercice

FizzBuzz est célèbre parce qu'en entretien d'embauche, il montre si quelqu'un maîtrise les bases de la programmation. La solution demande des boucles, des conditions et le modulo, et surtout le bon ordre des vérifications.

Anecdote : il existe des centaines de solutions créatives, avec des streams, du pattern matching, ou même sans if/else. Cherche « FizzBuzz Enterprise Edition » pour la version délirante et sur-architecturée.

Assez lu. À toi de jouer.

Dans le tutoriel, tu écris le code toi-même, tu cliques sur Exécuter et tu vois tout de suite si ton programme marche. Sans JDK, sans IDE, sans prise de tête.

S'entraîner sur Exercices pratiques dans le navigateur