вызов по значению — C ++, программа выводит неверный ввод, но продолжает цикл

Я пытаюсь написать программу, которая рассчитывает стоимость звонка на основе времени звонка, дня недели и продолжительности звонка. Это должны быть все функции вызова по значению и вывод опции для повторения программы.

Моя проблема заключается в том, что, когда я ввожу неверный ввод для времени, такой как: 37, он выводит недопустимый ввод, но переходит к вводу дня вместо возврата к вводу времени. Я новый программист и перепробовал все, что мог придумать, чтобы это исправить, но он либо застрял в бесконечном цикле выхода из всей программы.

Заранее благодарю за любую помощь!

#include <iostream>
using namespace std;

bool validateUserInputTime(int,char,int);
bool validateUserInputDay(string);
bool validateUserInputCallLength(int);
double calculateTotalCost(int,int,string,int);

string days[]={"Mo" , "Tu" , "We" , "Th" , "Fr" , "Sa" , "Su"};
float cost,fcost;

int main()
{
int hour;
int min;
int time;
char colon;
char answer = 'y';
string day;
string s;
bool result;

while(answer =='y')
{
cout<<"Enter the time the call starts in 24-hour rotation: "<<endl;
cin>>hour>>colon>>min;result=validateUserInputTime(hour,colon,min);
if(cin.fail())
{
cout << "Invalid time input."<<endl;
cout<<"Please try again."<<endl<<endl<<endl;
cin.clear();

}

day=validateUserInputDay(s);
if(cin.good())
{
cout<<"Enter the first two letters of the day of the week:";
cin>>day;
}cout<<"Enter the length of the call in minutes:"<<endl;
cin>>time;

result=validateUserInputCallLength(time);

if(result==0)
{
cout<<"Invalid minute Input."<<endl;
cout<<"Please try again."<<endl<<endl<<endl;

continue;
}

fcost= calculateTotalCost(hour,min,day,time);

cout<<"Cost of the call: $" << fcost<<endl;
cout<<"Do you want to repeat the program?";

cin>>answer;}

return 0;

}
bool validateUserInputTime(int hour1,char ch,int min1)
{
if (cin.fail())
{
cout << "Invalid time input."<<endl;
cout<<"Please try again."<<endl<<endl<<endl;
cin.clear();
}
if(hour1 < 0)
{
return false;
}

if(min1 < 0)
{
return false;
}
if(ch!=':')
{
return false;
}
else
return true;

}
bool validateUserInputDay(string s)
{
int next=0;

for(int i = 0; i < 7; i++)
{
if(days[i] == s){

next=1;
}
if(cin.fail())
{
cout<<"Invalid day inpuT."<<endl;

cin.clear();
}

}

if(next==1)
{
return true;
}
else
{
return false;
}
}

bool validateUserInputCallLength(int time2)
{

if(time2<0)
{
return false;
}
else
{
return true;
}

}
double calculateTotalCost(int hour3,int min3,string d,int time3)
{

if((d=="Sa")||(d=="Su"))

{

cost=0.15*time3;

}

else

{

if((hour3>=8)&&(min3<18))

{

cost=0.40*time3;

}

else

cost=0.25*time3;

}

return cost;

}

0

Решение

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

result = false;
while (!result)
{
cout<<"Enter the time the call starts in 24-hour rotation: "<<endl;
cin>>hour>>colin>>min;
result=validateUserInputTime(hour,colin,min);
}

Вы также забыли поместить ложное выражение возврата в validateUserInputTime. Ввод нецифровых символов также может привести к сбою программы, и cin.ignore случайно это исправил.

if (cin.fail())
{
cout << "Invalid time input."<<endl;
cout<<"Please try again."<<endl<<endl<<endl;
cin.clear();
cin.ignore();
return false;
}
0

Другие решения

Если вы хотите разобрать, что пользователь ввел, сделайте что-то подобное

std::string time;
std::getline(std::cin, time);

Теперь проверьте, есть ли «:» auto pos = time.find(':'); if (pos != -1) {}
затем возьмите часть часа time.substr(0,pos)
тогда минутная часть time.substr(pos+1)
затем проверьте, являются ли они действительными часами и минутами, например, используя stoi(),

также лучше do {} while () вместо while (answer == 'y') {...}

0