2013-09-19 5 views
-1

То, что я пытаюсь сделать, это получить пароль от пользователя, затем проверить его на 4 условия. Если это правильно. Затем просто распечатайте «pass word is correct». Если это не так, покажите пользователю, что не так, и вернитесь в меню. Проблема в том, что я не могу вернуться в меню. ЕСЛИ я делаю цикл while в строке //User interface //suppose to put a while loop here, but..... System.out.println(); System.out.println("Please create a password and a legal one". Он возвращается, но некоторые из операторов «if» не запускаются. Может ли кто-нибудь увидеть, где я застрял? Спасибо.«while» вопросы цикла для Java

import java.util.Scanner; 

public class Text_processing 
{ 

    public static void main(String[] args) 
    { 
     Scanner kb = new Scanner(System.in);  //user input   
     String user_input;  // To hold input 
     char[] array;   //Array for user_input 
     int letters = 0;  // Number of letters 
     int digits = 0;   // Number of digits 
     boolean nu = true;  // 
     boolean nl = true; 
     boolean nd = true; 
     boolean n7 = true; 


     //User interface 
     //suppose to put a while loop here, but..... 
     System.out.println(); 
     System.out.println("Please create a password and a legal one" 
          + " should contain the following elements:"); 
     System.out.println("\tAt least 7 characters in length."); 
     System.out.println("\tAt least 1 upper case letter."); 
     System.out.println("\tAt least 1 lower case letter."); 
     System.out.println("\tAt least 1 number."); 

     //Get a string from the user 
     user_input = kb.nextLine(); 

     //Convert it to a char array 
     array = user_input.toCharArray(); 

     for(int i = 0; i < array.length; i++) 
     { 
      if(!nu && !nl && !nd && !n7) 
      {    
       break; 
      } 

      if (array.length >= 7)  //not < 7 cos breaks 
      {   
       n7 = false;   
      } 

      if(Character.isUpperCase(array[i])) 
      { 
       nu = false;    
      } 

      if (Character.isLowerCase(array[i])) 
      { 
       nl = false; 
      } 

      if (Character.isDigit(array[i])) 
      { 
       nd = false;  
      } 

     } 

     if(n7) 
     { 
      System.out.println("Password does not contain 7 or more letters."); 
     } 
     if(nu) 
     { 
      System.out.println("Password does not contain an upper case letter."); 
     } 
     if(nl) 
     { 
      System.out.println("Password does not contain an lower case letter."); 
     } 
     if(nd) 
     { 
      System.out.println("Password does not contain a number."); 
     } 

      System.out.println("Password is correct."); 


    } 
} 
+0

Инициализация булевы ложь и делать 'в то время как (! N7 ||! Ню ||! П ||! Й)' не работает? Каким был цикл while? –

+0

Учтите, что если вы зацикливаете назад переменные, такие как «nu», остаются там, где они были в предыдущем цикле. Либо «перезагрузите» их внутри цикла, либо переместите начало цикла снаружи, где они инициализированы. –

+0

Вам нужно повторно инициализировать 'n7',' nu', 'nl' и' nd'. – johnchen902

ответ

2

В текущем коде, вам нужно будет убедиться, что nu, nl, nd, n7 сбрасываются на каждой итерации основного контура.

boolean badPassword = false; 
do { 
    boolean nu = true; 
    boolean nl = true; 
    boolean nd = true; 
    boolean n7 = true; 
    /* 
    * Add everything from your code that appears below `boolean n7 = true;` 
    * and above System.out.println("Password is correct."); here... 
    */ 

    badPassword = (n7 || nu || nl || nd); 
} while (badPassword); 
System.out.println("Password is correct."); 
+0

Спасибо! Но я должен указать, почему пароль неправильный. –

+0

Да, это нормально, поэтому поместите все в свой код, который появляется ниже 'boolean n7 = true;' и выше 'System.out.println (« Пароль правильный. »);' Внутри цикла ... Это будет просто цикл пока пароль не будет действителен ... – MadProgrammer

+0

Это работает! Огромное спасибо!!! –

0

Что плохого в начало цикла а с:

String user_input;  // To hold input 

и заканчиваться до:

 System.out.println("Password is correct."); 
0

Зачем вам следует по этой причине уже вы отображали содержимое Как пароль должен быть.

просто напечатать «пароль не соответствует указанным выше критериям, пожалуйста, попробуйте еще раз»

Я думаю, что его достаточно

+0

Спасибо! Но я должен указать, почему пароль неправильный. –

0

Стандартный шаблон для этой ситуации:

Scanner sc = new Scanner(System.in); 
String userInput = null; 
while (true) { 
    System.out.println("please enter something:"); 
    userInput = sc.next(); 
    if (<input fails some test>) { 
     System.out.println("some reason"); 
     continue; // try again 
    } 
    // repeat other tests similarly 
    break; // will only get to here if input was OK 
} 

петля может» t до ввода действительного ввода, после чего userInput будет удерживать это значение.

Обратите внимание также, как, поместив подсказку внутри цикла, вы можете избежать дублирования кода при недопустимом вводе.

+0

oh .... есть новое выражение вроде Я не знаю, что это значит ..... Спасибо, в любом случае. Я попытаюсь найти его значение. –

+0

Это просто место для реального кода. Поместите там какой-нибудь код, необходимый для проверки того, что вы хотите проверить. – Bohemian

0

Напишите простой способ проверки пароля следующим образом.

private static boolean isValid(char[] array) { 
    if(array.length<7){ 
     return false; 
    } 
    else{ 
     boolean isUpper=false, isLower=false, isDigit=false; 
     for (int i = 0; i < array.length; i++) { 
      char c = array[i]; 
      if(Character.isUpperCase(c)){ 
       isUpper=true; 
      } 
      if(Character.isLowerCase(c)){ 
       isLower=true; 
      } 
      if(Character.isDigit(c)){ 
       isDigit=true; 
      } 
     } 
     return isUpper && isLower && isDigit; 
    } 
} 
0

Я лично считаю, что код, который вы написали, слишком длинный для такой простой проверки.

Но проблема заключается в том, что рука может быть исправлена ​​только в том случае, если вы можете поместить цикл while, который проверяет, является ли действительный флаг истинным, а также считывает входной сигнал клавиатуры в конце.

Что-то вроде кода ниже:

boolean valid = false; 
while (!valid) { 

     for (int i = 0; i < array.length; i++) { 
      valid = true; 
      if (!nu && !nl && !nd && !n7) { 
       break; 
      } 

      if (array.length >= 7) // not < 7 cos breaks 
      { 
       n7 = false; 
      } 

      if (Character.isUpperCase(array[i])) { 
       nu = false; 
      } 

      if (Character.isLowerCase(array[i])) { 
       nl = false; 
      } 

      if (Character.isDigit(array[i])) { 
       nd = false; 
      } 

     } 

     if (n7) { 
      valid = false; 
      System.out 
        .println("Password does not contain 7 or more letters."); 
     } 
     if (nu) { 
      valid = false; 
      System.out 
        .println("Password does not contain an upper case letter."); 
     } 
     if (nl) { 
      valid = false; 
      System.out 
        .println("Password does not contain an lower case letter."); 
     } 
     if (nd) { 
      valid = false; 
      System.out.println("Password does not contain a number."); 
     } 
     if (!valid) { 
      user_input = kb.nextLine(); 
      array = user_input.toCharArray(); 
     } 
    } 
+0

Да, расскажи мне об этом. Я считаю, что это слишком сложно. Но я всего лишь новичок, и я пытаюсь упростить свою логику. Спасибо за ответ, хотя. Очень ценю, что вы делаете это с моей грязной логикой. –

0

Вместо того, даже есть цикл, вы могли бы просто проверить всю строку, используя String.matches(). Это позволит существенно упростить вашу логику

Подобно

//For uppercase 
user_input.matches(".*[A-Z].*"); // true if contians 

//For lowercase 
user_input.matches(".*[a-z].*"); // true if contians 

//For digit 
user_input.matches(".*\\d.*"); // true if contians 
Смежные вопросы