do while循环工作不正常

do while loop not working properly

本文关键字:不正常 工作 循环 while do      更新时间:2023-10-16

我希望用户输入一个日期,该日期在2016年5月30日之前或等于2016年1月1日。如果输入无效,那么它应该返回并再次向用户提问。问题是do...while循环没有循环,它在输入无效后停止。这是代码:

#include<iostream>
using namespace std;
int main(){
    int month,day,year;
    char symbol;
    do{
        cout<<"Enter date: ";
        cin>>month>>symbol>>day>>symbol>>year;
        if(symbol=='/'&&month<=05&&day<=31&&year==2016){
            cout<<month<<symbol<<day<<symbol<<year;
            if(month==01){          // this code is for month of January
                if(day==3||day==10||day==17||day==24||day==31){
                    cout<<" is Sunday.";
                }
                else if(day==4||day==11||day==18||day==25){
                    cout<<" is Monday.";
                }
                else if(day==5||day==12||day==19||day==26){
                    cout<<" is Tuesday.";
                }
                else if(day==6||day==13||day==20||day==27){
                    cout<<" is Wednesday.";
                }
                else if(day==7||day==14||day==21||day==28){
                    cout<<" is Thursday.";
                }
                else if(day==1||day==8||day==15||day==22||day==29){
                    cout<<" is Friday.";
                }
                else if(day==2||day==9||day==16||day==23||day==30){
                    cout<<" is Saturday.";
                }
            }
            else if(month==02){     //this code is for month of February
                if(day==7||day==14||day==21||day==28){
                    cout<<" is Sunday.";
                }
                else if(day==1||day==8||day==15||day==22||day==29){
                    cout<<" is Monday.";
                }
                else if(day==2||day==9||day==16||day==23){
                    cout<<" is Tuesday.";
                }
                else if(day==3||day==10||day==17||day==24){
                    cout<<" is Wednesday.";
                }
                else if(day==4||day==11||day==18||day==25){
                    cout<<" is Thursday.";
                }
                else if(day==5||day==12||day==19||day==26){
                    cout<<" is Friday.";
                }
                else if(day==6||day==13||day==20||day==27){
                    cout<<" is Saturday.";
                }   
            }
            else if(month==03){         //this code is for month of March
                if(day==6||day==13||day==20||day==27){
                    cout<<" is Sunday.";
                }
                else if(day==7||day==14||day==21||day==28){
                    cout<<" is Monday.";
                }
                else if(day==1||day==18||day==15||day==22||day==29){
                    cout<<" is Tuesday.";
                }
                else if(day==2||day==9||day==16||day==23||day==30){
                    cout<<" is Wednesday.";
                }
                else if(day==3||day==10||day==17||day==24||day==31){
                    cout<<" is Thursday.";
                }
                else if(day==4||day==11||day==18||day==25){
                    cout<<" is Friday.";
                }
                else if(day==5||day==12||day==19||day==26){
                    cout<<" is Saturday.";
                }
            }
            else if(month==04){     //this code is for month of April
                if(day==3||day==10||day==17||day==24){
                    cout<<" is Sunday.";
                }
                else if(day==4||day==11||day==18||day==25){
                    cout<<" is Monday.";
                }
                else if(day==5||day==12||day==19||day==26){
                    cout<<" is Tuesday.";
                }
                else if(day==6||day==13||day==20||day==27){
                    cout<<" is Wednesday.";
                }
                else if(day==7||day==14||day==21||day==28){
                    cout<<" is Thursday.";
                }
                else if(day==1||day==8||day==15||day==22||day==29){
                    cout<<" is Friday.";
                }
                else if(day==2||day==9||day==16||day==23||day==30){
                    cout<<" is Saturday.";
                }
            }   
            else if(month==05){     //this code is for month of May
                if(day==1||day==8||day==15|day==22||day==29){
                    cout<<" is Sunday.";
                }
                else if(day==2||day==9||day==16||day==23||day==30){
                    cout<<" is Monday.";
                }
                else if(day==3||day==10||day==17||day==24||day==31){
                    cout<<" is Tuesday.";
                }
                else if(day==4||day==11||day==18||day==25){
                    cout<<" is Wednesday.";
                }
                else if(day==5||day==12||day==19||day==26){
                    cout<<" is Thursday.";
                }
                else if(day==6||day==13||day==20||day==27){
                    cout<<" is Friday.";
                }
                else if(day==7||day==14||day==21||day==28){
                    cout<<" is Saturday.";
                }
            }
            break;  
        }
        else{
            cout<<"You have entered an invalid input.n"<<endl;
        }
    }while(symbol!='/'&&!(month<=05)&&!(day<=31)&&year!=2016);
    return 0;
}
while(symbol!='/'&&!(month<=05)&&!(day<=31)&&year!=2016);

必须是

while(symbol!='/' || !(month<=05) || !(day<=31) || year!=2016);

或按照@Barmar 的建议

while(symbol!='/' || (month>05) || (day>31) || year!=2016);

由于&&,原始表达式要求所有4都为true。使用||的表达式只需要其中一个为true。

还请注意,您不需要该检查,因为您已经在里面有了if

所以你可以做:

while (true) {
    cout<<"Enter date: ";
    cin>>month>>symbol>>day>>symbol>>year;
    // clear cin
    cin.clear();
    cin.ignore(10000,'n');  // Or better:
                             // std::numeric_limits<std::streamsize>::max()
                             // instead of just 10000 
    if(symbol=='/' && month<=05 && day<=31 && year==2016){
        // code for handling valid date here
        // This will end the while loop
        break;  
    }
    else{
        cout<<"You have entered an invalid input.n"<<endl;
    }
};

无关:请注意这一行

cin>>month>>symbol>>day>>symbol>>year;
            ^^           ^^

在这里,您读取symbol两次,即第二个值将覆盖第一个值。相反,您需要

cin >> month >> symbol1 >> day >> symbol2 >> year;
                      ^                 ^

并且相应地改变代码的其余部分。

更新

代码可以在这里测试https://ideone.com/KvCy1e

使用输入

dem/dem/dem
1/1/2016

输出是

Enter date: You have entered an invalid input.
Enter date: 1/1/2016 is Friday.

更新2

正如@Barmar在评论中所注意到的,您应该在循环之前将变量初始化为某个无效日期。

int month = 13;
int day = 32;
int year = 0;
char symbol = 'x';

顺便说一句:既然你使用ints,你就应该检查负值。