Aller au contenu principal

Saisie console avec Scanner

Notions théoriques

La classe Scanner

Pour lire des données saisies par l'utilisateur dans la console, Java fournit la classe Scanner du package java.util. Il faut l'importer avant de l'utiliser.

import java.util.Scanner;

Créer un Scanner

Scanner scanner = new Scanner(System.in);

System.in représente l'entrée standard (le clavier). C'est l'équivalent de readline() en PHP.

Méthodes de lecture

MéthodeCe qu'elle litExemple
nextLine()Une ligne entière (String)"Bonjour tout le monde"
nextInt()Un entier42
nextDouble()Un décimal3.14
next()Un mot (jusqu'à l'espace)"Bonjour"
nextBoolean()Un booléentrue ou false

Exemple de base

import java.util.Scanner;

public class Saisie {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.print("Quel est votre prénom ? ");
String prenom = scanner.nextLine();
System.out.println("Bonjour, " + prenom + " !");

scanner.close(); // Fermer le scanner quand on n'en a plus besoin
}
}

Le problème du buffer après nextInt()

Piège classique : mélanger nextInt() et nextLine()

Quand vous lisez un entier avec nextInt(), Scanner consomme le chiffre mais laisse le \n (retour à la ligne) dans le buffer. Si vous appelez ensuite nextLine(), il lit ce \n résiduel et retourne immédiatement une String vide.

Solution : ajouter un scanner.nextLine() vide après chaque nextInt() ou nextDouble() pour vider le buffer.

System.out.print("Âge : ");
int age = scanner.nextInt();
scanner.nextLine(); // vide le \n résiduel

System.out.print("Prénom : ");
String prenom = scanner.nextLine(); // maintenant ça fonctionne

Fermer le Scanner

scanner.close();

Fermez toujours le Scanner quand vous n'en avez plus besoin. Cela libère la ressource système associée à l'entrée standard.

Générer un nombre aléatoire

Pour les jeux de devinette, on utilise Math.random() :

// Nombre aléatoire entre 1 et 100 (inclus)
int secret = (int) (Math.random() * 100) + 1;

Math.random() retourne un double entre 0.0 (inclus) et 1.0 (exclu). On le multiplie par 100 pour obtenir un double entre 0 et 99.999..., puis on le convertit en int (0 à 99) et on ajoute 1 (1 à 100).

Exemple pratique

import java.util.Scanner;

public class ProfilUtilisateur {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.println("=== Création de profil ===");

System.out.print("Prénom : ");
String prenom = scanner.nextLine();

System.out.print("Âge : ");
int age = scanner.nextInt();
scanner.nextLine(); // vide le buffer

System.out.print("Filière (SLAM/SISR) : ");
String filiere = scanner.nextLine();

System.out.print("Moyenne générale : ");
double moyenne = scanner.nextDouble();
scanner.nextLine(); // vide le buffer

// Affichage du profil
System.out.println("\n=== Profil créé ===");
System.out.printf("Nom : %s%n", prenom);
System.out.printf("Âge : %d ans%n", age);
System.out.printf("Filière: %s%n", filiere);
System.out.printf("Moyenne: %.2f%n", moyenne);

boolean admis = moyenne >= 10.0;
System.out.println("Admis : " + admis);

scanner.close();
}
}
astuce

System.out.print() (sans ln) n'ajoute pas de retour à la ligne, ce qui permet à l'utilisateur de taper sa réponse sur la même ligne que la question.

Test de mémorisation/compréhension


De quel package provient la classe Scanner ?


Quelle méthode de Scanner lit une ligne entière (y compris les espaces) ?


Pourquoi faut-il appeler scanner.nextLine() après scanner.nextInt() ?


Que retourne Math.random() ?


Comment crée-t-on un Scanner qui lit depuis le clavier ?


Quelle méthode Scanner lit uniquement le prochain mot (sans espaces) ?


TP pour réfléchir et résoudre des problèmes

Vous allez créer un mini-jeu de devinette : l'ordinateur choisit un nombre entre 1 et 100, et le joueur doit le trouver. Après chaque tentative, le programme indique si le nombre cherché est plus grand ou plus petit.

Étape 1 — Générer le nombre secret

Génère un nombre entier aléatoire entre 1 et 100 et affiche un message de démarrage.


Bonne pratique - Commenter la formule aléatoire

La formule (int)(Math.random() * N) + MIN n'est pas immédiatement évidente. Ajoute un commentaire pour expliquer la plage générée, ou utilise des variables bien nommées comme MIN = 1 et MAX = 100.

Étape 2 — Boucle de jeu avec Scanner

Crée une boucle qui demande une proposition à l'utilisateur jusqu'à ce qu'il trouve le nombre.


Bonne pratique - Initialiser avant la boucle while

Pour utiliser une variable dans la condition d'un while, elle doit être déclarée et initialisée avant la boucle. Ici proposition = 0 garantit que la condition proposition != secret est vraie au départ (sauf si le nombre secret est 0, ce qui n'est pas possible ici).

Étape 3 — Indications et message de victoire

Dans la boucle, affiche "Plus grand" ou "Plus petit" selon la proposition. Après la boucle, affiche le nombre de tentatives.


Bonne pratique - Feedback immédiat à l'utilisateur

Donne toujours un retour à l'utilisateur après chaque action. "Plus grand" / "Plus petit" guide le joueur et rend le programme interactif et agréable à utiliser. Un programme qui ne répond pas après une saisie perturbe l'utilisateur.

📌 Une solution