Member 13689794 Ответов: 2

Как использовать && в выражениях "do" и "while"?


Мой код должен имитировать создателя учетной записи и выдавать пользователю ошибки при неправильном пароле (в конечном итоге я доберусь до требований к имени пользователя). Я хочу зациклить какой-то код, если пользователь вводит неправильный пароль, но я не могу его снять. Любое предложение будет оценено по достоинству.

Что я уже пробовал:

using System;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            string Username;
            string Password;
            int Zero;
            int CapCharacters;
            int LowCharacters;
            int Digits;
            int Symbols;
            int PassLength;

            Console.WriteLine("Hello user, please follow these instructions to create your new account.\n");
            Console.Write($"Please enter a username to go by: ");
            Username = Console.ReadLine();

            do
            {
                Zero = 0;
                CapCharacters = 0;
                LowCharacters = 0;
                Digits = 0;
                Symbols = 0;

                Console.Write($"\nAlright {Username}, now please enter a password: ");
                Password = Console.ReadLine(); // Password rules: 6-12 chara, 1 cap, 1 low, 1 num, 1 sym.
                PassLength = Password.Length;
                Console.WriteLine("");

                while (Zero < PassLength)
                {
                    if (Password[Zero] >= 'a' && Password[Zero] <= 'z')
                    {
                        LowCharacters++;
                    }

                    else if (Password[Zero] >= 'A' && Password[Zero] <= 'Z')
                    {
                        CapCharacters++;
                    }

                    else if (Password[Zero] >= '0' && Password[Zero] <= '9')
                    {
                        Digits++;
                    }
                    else
                    {
                        Symbols++;
                    }

                    Zero++;
                }


                if (Password.Length < 6)
                {
                    Console.WriteLine("Error: Your Password is too short.");
                }

                if (Password.Length > 12)
                {
                    Console.WriteLine("Error: Your Password is too long.");
                }

                if (CapCharacters < 1)
                {
                    Console.WriteLine("Error: Your Password needs to contain a capital letter.");
                }

                if (LowCharacters < 1)
                {
                    Console.WriteLine("Error: Your Password needs to contain a lowercase letter.");
                }

                if (Digits < 1)
                {
                    Console.WriteLine("Error: Your Password needs to contain a digit.");
                }

                if (Symbols < 1)
                {
                    Console.WriteLine("Error: Your Password needs to contain a symbol.");
                }
            }

            while (Password.Length < 6 && Password.Length > 12 &&
                   CapCharacters < 1 && LowCharacters < 1 &&
                   Digits < 1 && Symbols < 1);

            Console.WriteLine("");
            Console.WriteLine("Congradulations, your account is now set up!");
            Console.WriteLine("");
        }
    }
}

j snooze

Вам нужно описать проблему/ошибку, которую вы получаете из текущего кода. Прямо сейчас я бы сказал, что ваша самая большая проблема-это while(пароль.длина < 6 & & amp; пароль.длина > 12...)он не может быть одновременно короче 6 и длиннее 12. Нужно пересмотреть свою логику на этот счет.

F. Xaver

почему, черт возьми, ограничить паролем, чтобы максимум 12 символов .. так что мой ubarsecurity 30char pw не будет работать с вашим приложением..

Member 13689794

Это только гипотетически, успокойся человек. И да, ваш 30char pw не будет работать с моим приложением. :)

2 Ответов

Рейтинг:
17

phil.o

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

while (Password.Length < 6 || Password.Length > 12 ||
       CapCharacters < 1 || LowCharacters < 1 ||
       Digits < 1 || Symbols < 1);

Надеюсь, это поможет.


CPallini

Мой 5.

Рейтинг:
12

CPallini

Заменять

Цитата:
в то время как (пароль.Длина < 6 & & amp; пароль.Длина > 12 &&
CapCharacters &ЛТ; 1 &амп;&амп; LowCharacters &ЛТ; 1 &усилитель;&
Цифры < 1 && символы < 1);

с
while (Password.Length < 6 || Password.Length > 12 ||
                   CapCharacters || 1 || LowCharacters < 1 ||
                   Digits < 1 || Symbols < 1);


&& оператор логического AND- ты же знаешь. Сейчас, Password.Length не может быть одновременно меньше 6 И больше 12.


phil.o

5 б :)

Member 13689794

Есть ли в любом случае перефразировать условие while, чтобы иметь возможность использовать && вместо ||? например:
в то время как (пароль.Длина >= 6 && пароль.Длина <= 12 &&
CapCharacters и GT; 1 &&усилителя; LowCharacters &ГТ; 1 &усилитель;&
Цифры > 1 && символы > 1);

phil.o

Да, вы можете изменить логику.
В булевой арифметике у вас есть:

!(A || B) == !A && !B
!(A && B) == !A || !B