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éthode | Ce qu'elle lit | Exemple |
|---|---|---|
nextLine() | Une ligne entière (String) | "Bonjour tout le monde" |
nextInt() | Un entier | 42 |
nextDouble() | Un décimal | 3.14 |
next() | Un mot (jusqu'à l'espace) | "Bonjour" |
nextBoolean() | Un booléen | true 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()
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();
}
}
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
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.
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.
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.
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.