Java débutant: problèmes avec les boucles

Résolu/Fermé
Moody - 14 nov. 2011 à 23:28
 Moody - 15 nov. 2011 à 19:29
Bonjour,

J'ai un exercice qui consiste à créer un programme qui lit un entier n, puis qui lit n lignes, et qui affiche la ligne la
plus longue. Par exemple :

$ java LigneLaPlusLongue
Combien de lignes ? 5
Ligne 1 ? Ceci
Ligne 2 ? est
Ligne 3 ? un
Ligne 4 ? essai
Ligne 5 ? ...
Ligne la plus longue : essai

Le problème c'est que avec ce que j'ai fait, le programme passe directement de "Ligne 1?" à "Ligne 2?" sans me laisser taper.

Voilà mon programme:
import java.util.Scanner;

class ligne{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    int n; double a; double m; String lm; String l;
    System.out.println("Combien de lignes ?");
    n = sc.nextInt();
    while (n <= 0){
      System.out.println("Entrez un entier positif");
      n = sc.nextInt();
    }
    System.out.println("Ligne 1 ?");
    lm = sc.nextLine();
    m = lm.length();
    for (int i = 2; i<=n; i++){
      System.out.println("Ligne " + i + " ?");
      l = sc.nextLine();
      a = l.length();
      if (a >= m){
	m = a;
	lm = l;
      }else{
	m = m;
	lm = lm;
      }
    }
    System.out.println("Ligne la plus longue: " + lm);
  }
}


Voilà ce que ça donne à l'execution:
Combien de lignes ?
5
Ligne 1 ?
Ligne 2 ?
est
Ligne 3 ?
un
Ligne 4 ?
essai
Ligne 5 ?
...
Ligne la plus longue: essai


Et si j'indique 1 ligne il me met directement
Combien de lignes ?
1
Ligne 1 ?
Ligne la plus longue:


Que faut il changer pour qu'il me laisse entrer la 1ère ligne?


Merci.


A voir également:

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 14/11/2011 à 23:41
C'est le nextInt qui pose problème...
À chaque fois que tu tapes un entier au clavier, tu termines la saisie en appuyant sur la touche entrée, cela a pour effet de rajouter un \n à la fin de la chaîne de caractères.
Lorsque tu fais un nextInt, tu récupères les chiffres mais pas le \n, il reste "en attente" et il n'est récupéré qu'avec un nextLine. C'est pour ça que tes nextLine ne marchent pas, c'est parce qu'ils sont décalés, chacun récupérant les \n des nextInt précédents.
Il faut donc penser à rajouter un nextLine "pour du beurre" après chaque nextInt.
Il en va de même pour nextLong, nextFloat, nextDouble etc...

Je n'ai pas vraiment regardé ton code, il y a peut-être d'autres erreurs. Mais corrige déjà ça pour voir si ça te permet d'avancer dans la réalisation de ton programme ;-)
La confiance n'exclut pas le contrôle
0
Merci de ta réponse.
Je n'ai pas compris pourquoi mais juste en rajoutant un second lm = sc.nextLine(); sous le premier, ça a fonctionné. Sais tu pourquoi?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
15 nov. 2011 à 00:10
Si tu doubles le nextLine, le premier va prendre le \n comme je l'ai expliqué, et le deuxième prendre la bonne valeur. Par contre ça ne marchera plus si tu donnes n négatif, car tu rentres dans ta boucle while, et tu fais un deuxième nextInt qu'il te faudra également compenser....
0
C'est bon j'ai compris.
Merci de m'avoir aidé.
0