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