Помогите с экспериментом

Помогите с экспериментом

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

#include <iostream>
using namespace std;

int main()
{
setlocale(0, "");

int answ;
char login, pass;
cout<< "Добро пожаловать в наш банкомат!\n"
    << "Чтобы открыть виртуальный счёт, необходимо зарегистрироваться\n"
    << "Если вы желаете пройти регистрацию нажмите 1, в противном случае 0\n";
xy: cout<< "Ваш ответ: "; cin>> answ;
if(answ == 1)
{
    cout<< "Вы решили зарегистрироваться!\n"
        << "Придумайте себе логин и пароль\n"
        << "Login: "; cin>>login;
    cout<< "Password: "; cin>>pass;
    cout<< "А теперь запишите ваши данные: \n"
        << "Login: " <<login;
    cout<< "\nPassword: " << pass << endl;
}
else if(answ == 0)
    cout<< "Вы отказались от регистрации, видимо вами двигал обычный интерес :)\nВидимо вами двигал обычный интерес."<< endl;
else
{
int i = 1;
    cout<< "Вы ввели значение которое ни к чему не ведёт.";
    i++;
    while(i==5){
        goto xy; cout<< "Попробуйте снова"<<endl;}
}
return 0;
}

Диагноз:
(1) Использование goto без крайней необходимости не приветствуется.
(2) Автор запутался в собственной логике.
(3) Односимвольные login/password — нонсенс.

Комментарий:
В последнем else к оператору while переменная i всегда будет иметь значение 2, поскольку при входе в блок переменная i инициализируется значением 1, инкрементируется, а затем, при выходе из блока — уничтожается. Кроме того, я бы ещё мог понять if (i <= 5) { cout << ...; goto xy; }, но почему написан while — я не понимаю.

Почему-то очень многие не любят использовать оператор switch. Согласен, что в С++ этот оператор существует в несколько кастрированном виде. И тем не менее, лучше использовать его, чем сложную конструкцию из if'ов.

Лечение:
(1-2) Выправляем логику, убираем goto и используем оператор switch вместо if'ов.
(3) Используем строки и соответствующую функцию ввода.

#include <iostream>
#include <string>
using namespace std;

int main()
{
setlocale(0, "");

int answ;
string login, pass;

cout<< "Добро пожаловать в наш банкомат!\n"
    << "Чтобы открыть виртуальный счёт, необходимо зарегистрироваться\n"
    << "Если вы желаете пройти регистрацию нажмите 1, в противном случае 0\n";

int counter = 0;  // счётчик попыток
bool ok = false;  // флаг правильного выбора
do {
    cout<< "Ваш ответ: "; 
    cin >> answ;
    cin.ignore(1000, '\n'); // очистка буфера ввода
    switch (answ) {
        case 1:
            cout<< "Вы решили зарегистрироваться!\n"
                << "Придумайте себе логин и пароль\n"
                << "Login: ";
            getline(cin, login);
            cout<< "Password: ";
            getline(cin, pass);
            cout<< "А теперь запишите ваши данные: \n"
                << "Login: " <<login;
            cout<< "\nPassword: " << pass << endl;
            ok = true;
            break;

        case 0:
            cout<< "Вы отказались от регистрации, видимо вами двигал обычный интерес :)\nВидимо вами двигал обычный интерес."<< endl;
            ok = true;
            break;

        default:
            cout << "Вы ввели значение которое ни к чему не ведёт.";
            counter++;
            if (counter < 5)
                cout << " Попробуйте снова..." << endl;
            else
                cout << " Сгоните кошку с клавиатуры!" << endl;
    }
} while (!ok && counter < 5);

return 0;
}

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

Ответить

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

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

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

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

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

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