Почему мои результаты отличаются от того, что я хочу?

#java

Вопрос:

Сначала я попрошу пользователя ввести пароль, затем мой код измерит силу этого пароля в соответствии со следующими правилами:

  • Длина:
    • От 8 до 12, 1 балл.
    • > 12, 2 балла.
  • Содержит по крайней мере одну заглавную букву: 1 балл
  • Содержит по крайней мере одну строчную букву: 1 балл
  • Содержит по крайней мере одну цифру: 1 балл
  • Содержит не буквенно-цифровые символы (символы): 1 балл

Я уже закончил код, но когда я наберу пароль «Helllllo@123», результат будет равен 7 вместо 5. Я знаю, что моя ошибка произойдет, когда пароль будет содержать цифровые и не_аплатно-цифровые символы, но я не знаю, как это исправить.

     public class passwordDemo
    {
        String password;
        int point;

        //getter and setter
        public int getPoint()
        {
            return point;
        }

        public void setPoint(int point)
        {
            this.point = point;
        }

        public String getPassword()
        {
            return password;
        }

        public void setPassword(String password)
        {
            this.password = password;
        }

        public passwordDemo(String password)
        {
            this.password = password;
        }

        public passwordDemo()
        {
        }

        //main method

        public int point()
        {
            point = 0;
            //length
            if (password.length() >= 8)
            {
                point  = 1;
            }
        //upper and lower
            String pass_upper = password.toUpperCase();
            String pass_lower = password.toLowerCase();

            for (int i = 0; i < password.length(); i  ) {
                if (password.charAt(i) == pass_upper.charAt(i))
                {
                    point  = 1;
                    break;
                }
            }
            for (int k = 0; k < password.length(); k  ) {
                if (password.charAt(k) == pass_lower.charAt(k))
                {
                    point  = 1;
                    break;
                }
            }
        //digit
            String digit = "0123456789";
            for (int i = 0; i < password.length(); i  ) {
                for (int k = 0; k < digit.length(); k  ) {
                    if (password.charAt(i) == digit.charAt(k))
                    {
                        point  = 1;
                        break;
                    }
                }
            }

            //non-alphabetic
            char[]non_alphabetic = {
                '!', '@', '#', '

 import java.util.Scanner;

public class Strength_password
{
    public static void main(String[]args)
    {
        Scanner sc = new Scanner(System.in);
        passwordDemo password = new passwordDemo();
        System.out.println("Type your password");
        password.setPassword(sc.nextLine());
        System.out.println(password.point());
    }
}
 

Комментарии:

1. Вы пропускаете a break при проверке на наличие цифры(цифр).

2. Но когда я добавляю "перерыв" при проверке на наличие цифры, результат все равно равен 7 вместо 5

3. Ваши перерывы только вырываются из внутреннего цикла. Чтобы вырваться из внешнего цикла, вам нужно добавить метку во внешний цикл (например digitCheck: ), а затем использовать помеченный разрыв break digitCheck ). Помеченные разрывы-редко используемая функция в Java. В основном потому, что чаще всего вы можете сделать код лучше структурированным и более читаемым, вместо этого извлекая материал в методы.

4. Я также не вижу вашей проверки на "длина больше 12", которая добавляет еще один пункт. Код выглядит так, как будто вы все еще учитесь, и в этом случае циклы и разрывы хорошо изучать, но вы могли бы сделать его намного проще (для программиста: -)), сопоставив регулярное выражение для каждого из ваших условий "содержит". Среди прочих упрощений.

5. малумайстер и Йоахимзауэр правы: вы прерываетесь только один раз при проверке цифр, что означает, что вы продолжаете зацикливаться в цикле обертывания для. Кроме того, вам, возможно, потребуется проверить стиль, так как классы Java обычно называются с первой буквы в верхнем регистре. Чтобы завершить комментарий frIT, вы можете предпочесть свериться с регулярным выражением, как это сделано здесь: javacodeexamples.com/check-password-strength-in-java-example/...

Ответ №1:

Сначала код. Пояснения появляются после кода.

 import java.util.Scanner;

public class PasswordDemo {
    String password;
    int point;

    // getter and setter
    public int getPoint() {
        return point;
    }

    public void setPoint(int point) {
        this.point = point;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        if (password != null  amp;amp;  !password.isEmpty()) {
            this.password = password;
        }
        else {
            throw new IllegalArgumentException("Null or empty password.");
        }
    }

    public PasswordDemo(String password) {
        setPassword(password);
    }

    // main method
    public int point() {
        point = 0;
        // length
        int len = password.length();
        if (len >= 8  amp;amp;  len <= 12) {
            point  ;
        }
        else if (len > 12) {
            point  = 2;
        }
        // uppercase
        if (password.matches("^.*[A-Z].*$")) {
            point  ;
        }
        // lowercase
        if (password.matches("^.*[a-z].*$")) {
            point  ;
        }
        // digit
        if (password.matches("^.*[0-9].*$")) {
            point  ;
        }
        // non-alphabetic
        char[] non_alphabetic = {'!', '@', '#', '

  • Я изменил имя класса, чтобы придерживаться соглашений об именовании java.
  • Я не думаю , что вам нужен конструктор без аргументов , потому что член password класса PasswordDemo не должен быть пустым или пустым, так как не имеет смысла иметь пустой или пустой пароль. Помните, что вы всегда должны писать код, который обрабатывает неожиданные данные. Следовательно, метод setPassword выдает непроверенное исключение, если аргумент метода равен нулю или пустой строке.
  • Метод point
    • Обратите внимание, что point это то же point = point 1 самое, что и . Аналогично, point = 2 это то же самое, что point = point 2 .
    • Если длина пароля составляет от 8 до 12, то к нему добавляется еще один point . Если длина пароля не находится между 8 и 12, но длина больше 12, то добавляется 2 point .
    • Я использую регулярные выражения, чтобы проверить, содержит ли пароль хотя бы одну заглавную букву. Я также использую регулярные выражения, чтобы проверить, содержит ли пароль строчную букву и содержит ли он цифру. Регулярное выражение для проверки заглавных букв выглядит следующим образом.
      1. ^ означает начало ввода пароля
      2. . означает любой символ и * означает ноль или более раз, поэтому .* означает ноль или более символов.
      3. [A-Z] означает одну заглавную букву английского алфавита.
      4. $ означает конец пароля.
Следовательно, регулярное выражение ищет заглавную букву в пароле. Я предполагаю, что теперь вы можете понять два других регулярных выражения. ^.*[a-z].*$ выполняет поиск строчной буквы и ^.*[0-9].*$ ищет цифру. Наконец, тест для неалфавитно-цифрового символа использует ваш код, который повторяет символы пароля, и для каждого символа он повторяет список неалфавитно-цифровых символов. Как упоминалось в комментариях к вашему вопросу, a break выходит только из цикла, в котором он находится. Поскольку break он находится во вложенном цикле, он выходит только из внутреннего цикла. Я использую логическую переменную, чтобы проверить, нужно ли мне break это во внешнем цикле. Это не единственный способ, но я предпочитаю именно такой. Другой способ (как указано в комментариях к вашему вопросу) - использовать ярлык. Обратите внимание, что "лучшего" способа не существует. Решите, какой способ вы предпочитаете, и используйте его. Просто помните, что, как профессиональному программисту, другим программистам может потребоваться внести изменения в ваш код. Следовательно, важно, чтобы код был написан таким образом, чтобы другие программисты могли легко прочитать и понять. В соответствии с правилами (как я их понимаю и как я реализовал их в приведенном выше коде), если пароль
 Hellllllo@123
 

тогда его значение точки равно 6.

  • Длина больше 12, так что две точки.
  • Он содержит заглавную букву, так что еще один пункт.
  • Он содержит строчную букву, так что еще один пункт.
  • Он содержит цифру, так что еще одна точка.
  • Он содержит не буквенно-цифровой символ, поэтому еще один пункт.

Таким образом, значение

 2   1   1   1   1
 

Так что, если я не понял правил, вы ошибаетесь, если думаете, что значение точки Helllllo@123 равно 5.


, '%', '^', 'amp;', '*', '(', ')', '-',
' '};
for (int i = 0; i < password.length(); i ) {
for (int k = 0; k < non_alphabetic.length; k ) {
if (password.charAt(i) == non_alphabetic[k])
{
point = 1;
break;
}
}
}

return point;
}
}


Комментарии:

1. Вы пропускаете a break при проверке на наличие цифры(цифр).

2. Но когда я добавляю "перерыв" при проверке на наличие цифры, результат все равно равен 7 вместо 5

3. Ваши перерывы только вырываются из внутреннего цикла. Чтобы вырваться из внешнего цикла, вам нужно добавить метку во внешний цикл (например digitCheck: ), а затем использовать помеченный разрыв break digitCheck ). Помеченные разрывы-редко используемая функция в Java. В основном потому, что чаще всего вы можете сделать код лучше структурированным и более читаемым, вместо этого извлекая материал в методы.

4. Я также не вижу вашей проверки на "длина больше 12", которая добавляет еще один пункт. Код выглядит так, как будто вы все еще учитесь, и в этом случае циклы и разрывы хорошо изучать, но вы могли бы сделать его намного проще (для программиста: -)), сопоставив регулярное выражение для каждого из ваших условий "содержит". Среди прочих упрощений.

5. малумайстер и Йоахимзауэр правы: вы прерываетесь только один раз при проверке цифр, что означает, что вы продолжаете зацикливаться в цикле обертывания для. Кроме того, вам, возможно, потребуется проверить стиль, так как классы Java обычно называются с первой буквы в верхнем регистре. Чтобы завершить комментарий frIT, вы можете предпочесть свериться с регулярным выражением, как это сделано здесь: javacodeexamples.com/check-password-strength-in-java-example/...

Ответ №1:

Сначала код. Пояснения появляются после кода.


  • Я изменил имя класса, чтобы придерживаться соглашений об именовании java.
  • Я не думаю , что вам нужен конструктор без аргументов , потому что член password класса PasswordDemo не должен быть пустым или пустым, так как не имеет смысла иметь пустой или пустой пароль. Помните, что вы всегда должны писать код, который обрабатывает неожиданные данные. Следовательно, метод setPassword выдает непроверенное исключение, если аргумент метода равен нулю или пустой строке.
  • Метод point
    • Обратите внимание, что point это то же point = point 1 самое, что и . Аналогично, point = 2 это то же самое, что point = point 2 .
    • Если длина пароля составляет от 8 до 12, то к нему добавляется еще один point . Если длина пароля не находится между 8 и 12, но длина больше 12, то добавляется 2 point .
    • Я использую регулярные выражения, чтобы проверить, содержит ли пароль хотя бы одну заглавную букву. Я также использую регулярные выражения, чтобы проверить, содержит ли пароль строчную букву и содержит ли он цифру. Регулярное выражение для проверки заглавных букв выглядит следующим образом.
      1. ^ означает начало ввода пароля
      2. . означает любой символ и * означает ноль или более раз, поэтому .* означает ноль или более символов.
      3. [A-Z] означает одну заглавную букву английского алфавита.
      4. $ означает конец пароля.

Следовательно, регулярное выражение ищет заглавную букву в пароле. Я предполагаю, что теперь вы можете понять два других регулярных выражения. ^.*[a-z].*$ выполняет поиск строчной буквы и ^.*[0-9].*$ ищет цифру.

Наконец, тест для неалфавитно-цифрового символа использует ваш код, который повторяет символы пароля, и для каждого символа он повторяет список неалфавитно-цифровых символов. Как упоминалось в комментариях к вашему вопросу, a break выходит только из цикла, в котором он находится. Поскольку break он находится во вложенном цикле, он выходит только из внутреннего цикла. Я использую логическую переменную, чтобы проверить, нужно ли мне break это во внешнем цикле. Это не единственный способ, но я предпочитаю именно такой. Другой способ (как указано в комментариях к вашему вопросу) - использовать ярлык. Обратите внимание, что "лучшего" способа не существует. Решите, какой способ вы предпочитаете, и используйте его. Просто помните, что, как профессиональному программисту, другим программистам может потребоваться внести изменения в ваш код. Следовательно, важно, чтобы код был написан таким образом, чтобы другие программисты могли легко прочитать и понять.

В соответствии с правилами (как я их понимаю и как я реализовал их в приведенном выше коде), если пароль


тогда его значение точки равно 6.

  • Длина больше 12, так что две точки.
  • Он содержит заглавную букву, так что еще один пункт.
  • Он содержит строчную букву, так что еще один пункт.
  • Он содержит цифру, так что еще одна точка.
  • Он содержит не буквенно-цифровой символ, поэтому еще один пункт.

Таким образом, значение


Так что, если я не понял правил, вы ошибаетесь, если думаете, что значение точки Helllllo@123 равно 5.

, '%', '^', 'amp;', '*', '(', ')', '-', ' '};
for (int i = 0; i < password.length(); i ) {
boolean found = false;
for (int k = 0; k < non_alphabetic.length; k ) {
if (password.charAt(i) == non_alphabetic[k]) {
point ;
found = true;
break;
}
}
if (found) {
break;
}
}
return point;
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Type your password");
PasswordDemo password = new PasswordDemo(sc.nextLine());
System.out.println(password.point());
}
}

  • Я изменил имя класса, чтобы придерживаться соглашений об именовании java.
  • Я не думаю , что вам нужен конструктор без аргументов , потому что член password класса PasswordDemo не должен быть пустым или пустым, так как не имеет смысла иметь пустой или пустой пароль. Помните, что вы всегда должны писать код, который обрабатывает неожиданные данные. Следовательно, метод setPassword выдает непроверенное исключение, если аргумент метода равен нулю или пустой строке.
  • Метод point
    • Обратите внимание, что point это то же point = point 1 самое, что и . Аналогично, point = 2 это то же самое, что point = point 2 .
    • Если длина пароля составляет от 8 до 12, то к нему добавляется еще один point . Если длина пароля не находится между 8 и 12, но длина больше 12, то добавляется 2 point .
    • Я использую регулярные выражения, чтобы проверить, содержит ли пароль хотя бы одну заглавную букву. Я также использую регулярные выражения, чтобы проверить, содержит ли пароль строчную букву и содержит ли он цифру. Регулярное выражение для проверки заглавных букв выглядит следующим образом.
      1. ^ означает начало ввода пароля
      2. . означает любой символ и * означает ноль или более раз, поэтому .* означает ноль или более символов.
      3. [A-Z] означает одну заглавную букву английского алфавита.
      4. $ означает конец пароля.

Следовательно, регулярное выражение ищет заглавную букву в пароле. Я предполагаю, что теперь вы можете понять два других регулярных выражения. ^.*[a-z].*$ выполняет поиск строчной буквы и ^.*[0-9].*$ ищет цифру.

Наконец, тест для неалфавитно-цифрового символа использует ваш код, который повторяет символы пароля, и для каждого символа он повторяет список неалфавитно-цифровых символов. Как упоминалось в комментариях к вашему вопросу, a break выходит только из цикла, в котором он находится. Поскольку break он находится во вложенном цикле, он выходит только из внутреннего цикла. Я использую логическую переменную, чтобы проверить, нужно ли мне break это во внешнем цикле. Это не единственный способ, но я предпочитаю именно такой. Другой способ (как указано в комментариях к вашему вопросу) — использовать ярлык. Обратите внимание, что «лучшего» способа не существует. Решите, какой способ вы предпочитаете, и используйте его. Просто помните, что, как профессиональному программисту, другим программистам может потребоваться внести изменения в ваш код. Следовательно, важно, чтобы код был написан таким образом, чтобы другие программисты могли легко прочитать и понять.

В соответствии с правилами (как я их понимаю и как я реализовал их в приведенном выше коде), если пароль


тогда его значение точки равно 6.

  • Длина больше 12, так что две точки.
  • Он содержит заглавную букву, так что еще один пункт.
  • Он содержит строчную букву, так что еще один пункт.
  • Он содержит цифру, так что еще одна точка.
  • Он содержит не буквенно-цифровой символ, поэтому еще один пункт.

Таким образом, значение


Так что, если я не понял правил, вы ошибаетесь, если думаете, что значение точки Helllllo@123 равно 5.

, ‘%’, ‘^’, ‘amp;’, ‘*’, ‘(‘, ‘)’, ‘-‘,
‘ ‘};
for (int i = 0; i < password.length(); i ) {
for (int k = 0; k < non_alphabetic.length; k ) {
if (password.charAt(i) == non_alphabetic[k])
{
point = 1;
break;
}
}
}

return point;
}
}


Комментарии:

1. Вы пропускаете a break при проверке на наличие цифры(цифр).

2. Но когда я добавляю «перерыв» при проверке на наличие цифры, результат все равно равен 7 вместо 5

3. Ваши перерывы только вырываются из внутреннего цикла. Чтобы вырваться из внешнего цикла, вам нужно добавить метку во внешний цикл (например digitCheck: ), а затем использовать помеченный разрыв break digitCheck ). Помеченные разрывы-редко используемая функция в Java. В основном потому, что чаще всего вы можете сделать код лучше структурированным и более читаемым, вместо этого извлекая материал в методы.

4. Я также не вижу вашей проверки на «длина больше 12», которая добавляет еще один пункт. Код выглядит так, как будто вы все еще учитесь, и в этом случае циклы и разрывы хорошо изучать, но вы могли бы сделать его намного проще (для программиста: -)), сопоставив регулярное выражение для каждого из ваших условий «содержит». Среди прочих упрощений.

5. малумайстер и Йоахимзауэр правы: вы прерываетесь только один раз при проверке цифр, что означает, что вы продолжаете зацикливаться в цикле обертывания для. Кроме того, вам, возможно, потребуется проверить стиль, так как классы Java обычно называются с первой буквы в верхнем регистре. Чтобы завершить комментарий frIT, вы можете предпочесть свериться с регулярным выражением, как это сделано здесь: javacodeexamples.com/check-password-strength-in-java-example/…

Ответ №1:

Сначала код. Пояснения появляются после кода.


  • Я изменил имя класса, чтобы придерживаться соглашений об именовании java.
  • Я не думаю , что вам нужен конструктор без аргументов , потому что член password класса PasswordDemo не должен быть пустым или пустым, так как не имеет смысла иметь пустой или пустой пароль. Помните, что вы всегда должны писать код, который обрабатывает неожиданные данные. Следовательно, метод setPassword выдает непроверенное исключение, если аргумент метода равен нулю или пустой строке.
  • Метод point
    • Обратите внимание, что point это то же point = point 1 самое, что и . Аналогично, point = 2 это то же самое, что point = point 2 .
    • Если длина пароля составляет от 8 до 12, то к нему добавляется еще один point . Если длина пароля не находится между 8 и 12, но длина больше 12, то добавляется 2 point .
    • Я использую регулярные выражения, чтобы проверить, содержит ли пароль хотя бы одну заглавную букву. Я также использую регулярные выражения, чтобы проверить, содержит ли пароль строчную букву и содержит ли он цифру. Регулярное выражение для проверки заглавных букв выглядит следующим образом.
      1. ^ означает начало ввода пароля
      2. . означает любой символ и * означает ноль или более раз, поэтому .* означает ноль или более символов.
      3. [A-Z] означает одну заглавную букву английского алфавита.
      4. $ означает конец пароля.

Следовательно, регулярное выражение ищет заглавную букву в пароле. Я предполагаю, что теперь вы можете понять два других регулярных выражения. ^.*[a-z].*$ выполняет поиск строчной буквы и ^.*[0-9].*$ ищет цифру.

Наконец, тест для неалфавитно-цифрового символа использует ваш код, который повторяет символы пароля, и для каждого символа он повторяет список неалфавитно-цифровых символов. Как упоминалось в комментариях к вашему вопросу, a break выходит только из цикла, в котором он находится. Поскольку break он находится во вложенном цикле, он выходит только из внутреннего цикла. Я использую логическую переменную, чтобы проверить, нужно ли мне break это во внешнем цикле. Это не единственный способ, но я предпочитаю именно такой. Другой способ (как указано в комментариях к вашему вопросу) — использовать ярлык. Обратите внимание, что «лучшего» способа не существует. Решите, какой способ вы предпочитаете, и используйте его. Просто помните, что, как профессиональному программисту, другим программистам может потребоваться внести изменения в ваш код. Следовательно, важно, чтобы код был написан таким образом, чтобы другие программисты могли легко прочитать и понять.

В соответствии с правилами (как я их понимаю и как я реализовал их в приведенном выше коде), если пароль


тогда его значение точки равно 6.

  • Длина больше 12, так что две точки.
  • Он содержит заглавную букву, так что еще один пункт.
  • Он содержит строчную букву, так что еще один пункт.
  • Он содержит цифру, так что еще одна точка.
  • Он содержит не буквенно-цифровой символ, поэтому еще один пункт.

Таким образом, значение


Так что, если я не понял правил, вы ошибаетесь, если думаете, что значение точки Helllllo@123 равно 5.