Ошибка с паролем, с использованием функции void

Ошибка с паролем, с использованием функции void

Вообщем проблема. Ошибку я написал в виде комментария

#include <iostream>
#include <Windows.h>
#include <istream>
#include <locale>
#include <conio.h>
#include <string>


using namespace std;

void welcome()
{
    cout << "Приятного использования программы.\n";
    cout << "Для продолжения нажмите на клавишу." << endl;
    _getch();
}


void Password_true()
{
    system("cls");
        cout << "Пароль введен верно" << endl;
}

void Password_false()
{
    int error, errors = 5, passpord = int(passpord);
    do{
        system("cls");
        cout << "Повторите попытку" << endl;
        cout << "Passpord: ";
        error == errors + 1;
    } while (passpord != 7875); // Ошибка. Использована неинициализированная локальная переменная "passpord"
    _getch();
}

int main()
{
    setlocale(0, "");
    int passpord;
    int error, errors = 5;
    welcome();
    cout << "Passpord: ";
    cin >> passpord;
    if (passpord == 7875)
    {
        Password_true();
    } else {
        Password_false();
    }
    _getch();
    return 0;
}

Будь внимательным!

int error, errors = 5, passpord = int(passpord);

Ошибка не в

int error, errors = 5, passpord = int(passpord);

А в

} while (passpord != 7875); // Ошибка. Использована неинициализированная локальная переменная "passpord"

Ошибка в

int error, errors = 5, passpord = int(passpord);

а в

} while (passpord != 7875); // Ошибка. Использована неинициализированная локальная переменная "passpord"

её следствие.

Ты посмотри внимательно как ты описал переменную passpord. Я вообще удивляюсь, как компилятор пропустил эту строку. MSVS — ругается именно на первую строку (которую я указал), а не на вторую. А Dev-C++ откомпилил вообще без ошибок. Ты какой компилятор используешь?

У тебя, кстати, есть ещё одна явная ляпа:

error == errors + 1;

Программу в целом критиковать не буду — считаем, что это черновой набросок эскиза программы.

Я не пойму почему здесь все так сложно?
Куча заголовочных файлов... куча объявлений.
Вот этот момент очень интересный:

void Password_false()
{
    int error, errors = 5, passpord = int(passpord);
    do{
        system("cls");
        cout << "Повторите попытку" << endl;
        cout << "Passpord: ";
        error == errors + 1;
    } while (passpord != 7875); // Ошибка. Использована неинициализированная локальная переменная "passpord"
    _getch();
}

у тебя же переменная int passpord; объявлена в функции maine(); поэтому она находится вне области видимости для функции void Password_false() отсюда и неинициализированная локальная переменная. И для чего ее при присваивании преобразовывать к типу int???
Я думаю, все можно сделать проще, допустим так:

#include <iostream>
#include <string>

const std::string PASSWORD = "1234";
const int ERRORS = 4;

void passw_true(void);  // прототип для функции если пароль верный
std::string passw_false(std::string passw, int errors); // прототип функции если пароль не верный
int main(void)
{
    std::cout << "Enter the password (you have 5 attempts): ";
    std::string passw;
    getline(std::cin, passw);   // ввод пароля
    int errors; 
// цикл проверки пароля
    for (errors = ERRORS; errors > 0; --errors)
    {
        if (PASSWORD == passw)
        {
            passw_true();
            break;
        }
        else
        {
            passw = passw_false(passw, errors);
        }
    }
    if (0 == errors)
        {
            std::cout << "\nYou have no any attempts. By :(\n";
            return 0;
        }
    return 0;
}
void passw_true(void)
{
    std::cout << "\nYour password is right." << std::endl;
    std::cout << "Welcome to the programm!" << std::endl;
}
std::string passw_false(std::string passw, int errors)
{
    std::cout << "\nEntered password is wrong!!!\n"
        << "You still have " << errors << " attempts.\n"
        << "Try again\n"
        << "Enter the password: ";
    getline(std::cin, passw);
    return passw;
}

Прошу прощения, допущена ошибка. После ввода четырех неправильных значений и пятого правильного, программа выводит std::cout << "\nYou have no any attempts. By :(\n"; Ошибка здесь :(

 if (0 == errors)
        {
            std::cout << "\nYou have no any attempts. By :(\n";
            return 0;
        }

Исправляюсь, этот код рабочий :)

#include <iostream>
#include <string>

const std::string PASSWORD = "12345";
const int ERRORS = 4;

void passw_true(void);  // прототип функции если пароль верный
std::string passw_false(std::string passw, int errors); // прототип функции если пароль не верный
int main(void)
{
    std::cout << "Enter the password (you have 5 attempts): ";
    std::string passw;
    getline(std::cin, passw);   // ввод пароля
    int errors; 
// цикл проверки пароля
    for (errors = ERRORS; 0 < errors; errors--) {
        if (PASSWORD == passw){
            break;
        }
        else    {
            passw = passw_false(passw, errors);
        }
    }
    if (PASSWORD == passw)
        passw_true();
    else {
        std::cout << "\nYou have no any attempts. Bye :(((\n";
        return 0;
    }

    return 0;
}

void passw_true(void){
    std::cout << "\nYour password is right." << std::endl;
    std::cout << "Welcome to the programm!" << std::endl;
}
std::string passw_false(std::string passw, int errors){
    std::cout << "\nEntered password is wrong!!!\n"
        << "Try again\n"
        << "You still have " << errors << " attempts.\n"
        << "Enter the password: ";
    getline(std::cin, passw);
    return passw;
}

В данном случае функции вообще не нужны.

Точнее говоря, если смотреть шире, то должна быть одна функция проверки пароля, которая возвращает вызывающему коду некое значение, показывающее правильно или неправильно был введён пароль. Например:


bool check_passw();

int main() {

  if (check_passw()) {
    cout << "Access granted. Welcome to system!" << endl;
  }
  else {
    cout << "Access denied." << endl;
  }
  return 0;
}

bool check_passw() {
  // тело функции проверки пароля
}

Не надо делать функции ради функций. Разбиение кода на функции должно быть (1) осмысленным и (2) логичным.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.