L oop всегда выполняется дважды - PullRequest
0 голосов
/ 05 февраля 2020

В настоящее время я делаю школьный проект, и в этом проекте я должен спросить пользователя его / ее пол и затем показать ошибку, которая работает. Но по какой-то причине l oop всегда выполняется дважды, прежде чем снова разрешить ввод данных пользователем. пример:

Veuillez entrer le sex de l'individu f/F ou h/H: e

Erreur veuillez entrer des valeurs valides
Veuillez entrer le sex de l'individu f/F ou h/H: 

Erreur veuillez entrer des valeurs valides
Veuillez entrer le sex de l'individu f/F ou h/H: 

и вот код

 System.out.println ("Veuillez entrer le sex de l'individu f/F ou h/H: "); //first time asking for user input
 sex = Clavier.lireChar();

 while ((sex != ('f') || sex != ('F')) || (sex != ('h') || sex != ('H'))){ 
       System.out.println ("Erreur veuillez entrer des valeurs valides");  //error message
       System.out.println ("Veuillez entrer le sex de l'individu f/F ou h/H: "); //asking for user inoput again
       sex = Clavier.lireChar();
 }
 if (sex == ('f') || sex == ('F')) {
       nbFemmes = nbFemmes + 1;
 } else if (sex == ('h') || sex == ('H')) {
       nbHommes = nbHommes +1;
 }                        

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

Проблема с вашим логином условия while c. Попробуйте следующее и убедитесь, что вы понимаете это. Дайте мне знать, если вы не понимаете условную логику c. Удачного кодирования!

while ((sex != ('f') && sex != ('F')) && (sex != ('h') && sex != ('H'))){ 
   System.out.println ("Erreur veuillez entrer des valeurs valides");  //error message
   System.out.println ("Veuillez entrer le sex de l'individu f/F ou h/H: "); //asking for user inoput again
   sex = Clavier.lireChar();
}
1 голос
/ 05 февраля 2020

Проблема в том, что когда вы нажимаете f, а затем Enter, вы нажимаете две клавиши и, следовательно, получаете две char s, одну строчную букву f ('f') и один символ перевода строки / новой строки ('\n') ).

Аналогичным образом вы можете ввести abc и нажать клавишу ввода, и вы увидите, что цикл повторяется 4 раза вместо 1.

Это можно исправить одним из двух способов. Возможно, проще всего прочитать char, прочитав всю строку, а затем используя только первую букву. Я не знаю, что это за класс Clavier, но если он похож на этот класс , вы можете использовать что-то вроде:

sex = Clavier.lireChaine().charAt(0);

В качестве альтернативы, вы можете продолжать читать отдельные символы до вы получаете что-то, что не является переводом строки:

while ((sex = Clavier.lireChar()) == '\n');

Теперь оно больше не будет l oop дважды за каждую попытку, но из-за проблемы, упомянутой Тушаром , оно будет продолжайте спрашивать вечно и никогда не принимайте никаких входных данных, потому что если вы введете f, тогда sex != 'h' будет истиной, а если вы введете h, тогда sex != 'f' будет истиной, и любое условие заставит l oop повториться.

0 голосов
/ 05 февраля 2020

Возможно, опоздал на вечеринку, вот другое решение.

Как упомянули несколько человек, проблема, похоже, связана с вашим состоянием, пока l oop.

Я немного обеспокоен тем, что ваш учитель не позволяет использовать сканера, правда!

Scanner in = new Scanner(System.in);
System.out.println ("Veuillez entrer le sex de l'individu f/F ou h/H: ");

char sex = in.next().charAt(0); 

while (sex != 'f' && sex != 'F' && sex != 'h' && sex != 'H' ){ 
System.out.println ("Erreur veuillez entrer des valeurs valides");  //error message
System.out.println ("Veuillez entrer le sex de l'individu f/F ou h/H: "); //asking for user input again
sex = in.next().charAt(0); 
}

// If we reached here, this means we have good input.

if (sex == ('f') || sex == ('F')) {
 // Do something
} else if (sex == ('h') || sex == ('H')) {
 // Do something
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...