Когда пользователь вводит неправильный пароль, код должен быть перезапущен, когда он попробовал два раза, код останавливается, но в моем коде, когда пользователь вводит неверную информацию и передает password_attempts, он продолжает идти, все остальное работает нормально
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myusername;
string mypassword;
bool Access_granted;
int password_attempts;
cout << "Enter your username: ";
cin >> myusername;
cout << "Enter your password: ";
cin >> mypassword;
if (myusername == "veasy62" && mypassword == "a65908") {
Access_granted = true;
cout << "Access granted veasy62\n";
}
else if (myusername == "tveasy62" || mypassword == "a1065908") {
Access_granted = true;
cout << "Access granted tveasy62\n";
}
else {
Access_granted = false;
cout << password_attempts;
cout << "Access Denied, Sorry try again\n";
if (Access_granted == false) {
if (password_attempts = 2) {
password_attempts = password_attempts + 1;
return main();
}
else {
cout << "Sorry you have ran out of attempts\n";
}
}
}
}
Ваш код получил ошибку.
Вместо && ты использовал ||
также == 2 вы присвоили = 2 для password_attempts в условии if
Ненужный, если (ложное условие проверки)
Я удалил все это и вот код для задачи, которую вы хотите достичь
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myusername;
string mypassword;
bool Access_granted;
int password_attempts=0;
HERE : cout << "Enter your username: ";
cin >> myusername;
cout << "Enter your password: ";
cin >> mypassword;
if (myusername == "veasy62" && mypassword == "a65908") {
Access_granted = true;
cout << "Access granted veasy62\n";
break;
}
else if (myusername == "tveasy62" && mypassword == "a1065908") {
Access_granted = true;
cout << "Access granted tveasy62\n";
break;
}
else {
password_attempts = password_attempts + 1;
Access_granted = false;
cout << password_attempts;
cout << "Access Denied, Sorry try again\n";
if (password_attempts == 2) {
cout << "Sorry you have ran out of attempts\n";
return 0;
//to exit main().can also use exit(0) using additional libraries
}
else{
goto HERE;
}
}
}
Вместо возврата вы можете использовать goto, если вы не хотите использовать loop. Вы можете использовать «endl» вместо «\ n». Вы можете попробовать это:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myusername;
string mypassword;
bool Access_granted;
int password_attempts=0;
restart:
cout << "Enter your username: ";
cin >> myusername;
cout << "Enter your password: ";
cin >> mypassword;
if(myusername == "veasy62" && mypassword == "12")
{
Access_granted = true;
cout<<"Access granted veasy62" << endl;
}
else if (myusername == "tveasy62" || mypassword == "a1065908" )
{
Access_granted = true;
cout<<"Access granted tveasy62" << endl;
}
else
{
Access_granted = false;if(Access_granted == false)
{
if(password_attempts < 2 )
{
cout << "Access Denied, Sorry try again" << endl;
password_attempts = password_attempts + 1;
cout << "you have remaining " << 2-password_attempts << " time chances after this attempt" << endl;
goto restart;
}
else
{
cout << "Sorry you have ran out of attempts\n";
}
}
}
return 0;
}
Итак, вы говорите, что не можете использовать петли. Ну, вот решение, которое использует рекурсивный шаблон. Здесь нет «gotos», и его легко настроить, изменив параметр шаблона на большее число.
#include <string>
#include <iostream>
template <int attempts>
struct password_entry
{
static bool get_entry(std::string& myusername, std::string& mypassword)
{
std::cout << "Enter your username: ";
std::cin >> myusername;
std::cout << "Enter your password: ";
std::cin >> mypassword;
if (myusername == "veasy62" && mypassword == "12")
{
std::cout << "Access granted veasy62" << std::endl;
return true;
}
if ( attempts > 1 )
std::cout << "Access denied. You have " << attempts - 1 << " attempts remaining\n";
return password_entry<attempts - 1>::get_entry(myusername, mypassword);
}
};
template <>
struct password_entry<0>
{
static bool get_entry(const std::string&, const std::string&)
{
std::cout << "Sorry you have ran out of attempts\n";
return false;
}
};int main()
{
std::string mypass, myuser;
// max 2 attempts
bool access_granted = password_entry<2>::get_entry(myuser, mypass);
if ( access_granted )
std::cout << "Welcome current user";
else
std::cout << "Please call 555-5555 to reset your password";
}
Чтобы настроить количество попыток, нужно только изменить параметр вызова шаблона password_entry.
Редактировать: скорректированный код, чтобы не использовать конструктор.
Итак, что я понимаю из вашего вопроса, вы хотите, чтобы пользователь вводил свой пароль два раза, и если оба были неправильными, завершите программу правильно?
тогда вы можете написать так
Отредактировано 🙂
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myusername;
string mypassword;
bool Access_granted;
int password_attempts=0;cout << "Enter your username: ";
cin >> myusername;
cout << "Enter your password: ";
cin >> mypassword;
if (myusername == "veasy62" && mypassword == "a65908") {
Access_granted = true;
cout << "Access granted veasy62\n";
}
else if (myusername == "tveasy62" || mypassword == "a1065908") {
Access_granted = true;
cout << "Access granted tveasy62\n";
system("pause");
return 0;
}
else {
Access_granted = false;
cout << "Access Denied, Sorry try again\n";
cout << "Enter your username: ";
cin >> myusername;
cout << "Enter your password: ";
cin >> mypassword;
if (myusername == "veasy62" && mypassword == "a65908") {
Access_granted = true;
cout << "Access granted veasy62\n";
}
else if (myusername == "tveasy62" || mypassword == "a1065908") {
Access_granted = true;
cout << "Access granted tveasy62\n";
system("pause");
return 0;
}
else
{cout << "Sorry you have ran out of attempts\n";
cout << "Access Denied";
system("pause");
return -1;
}
}return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myusername;
string mypassword;
bool Access_granted;
int password_attempts=0;
cout << "Enter your username: ";
cin >> myusername;
cout << "Enter your password: ";
cin >> mypassword;
if (myusername == "veasy62" && mypassword == "a65908") {
Access_granted = true;
cout << "Access granted veasy62\n";
}
else if (myusername == "tveasy62" || mypassword == "a1065908") {
Access_granted = true;
cout << "Access granted tveasy62\n";
}
else {
Access_granted = false;
cout << password_attempts;
cout << "Access Denied, Sorry try again\n";
if (Access_granted == false) {
if (password_attempts <=2) {
password_attempts = password_attempts + 1;
return main();
}
else {
cout << "Sorry you have ran out of attempts\n";
}
}
}
}
Используйте goto
Или, если вам нравятся модули, попробуйте рекурсивную функцию. Она будет работать так, как вы пытаетесь.
public int accessAllowed(int notrys=0)
{
if(notrys<2)
return 0;
string username,password;
//take username password
If(//condition 1)
return 1;
else if(//condition 2)
return 1;
else
return accessAllowed(notrys+1);
}
хотя goto будет эффективным.
Также есть много ошибок в вашем коде