qq_51739476
浪里小白虫…
采纳率100%
2021-03-03 23:49

C++:请教一个关于输入EOF结束循环的问题。

已采纳

#include <iostream>
#define N 1000
using namespace std;
int daysOfMonth(int y,int m);
int daysOfYear(int y);
int tdays(int year,int month,int day);
bool isLeapYear(int n);
typedef struct Time{
    int year;
    int month;
    int day;    
    int total;
}Time;
int main()
{
    Time time[2];
    while(!cin.eof())
    {
        cin>>time[0].year>>time[0].month>>time[0].day;
        cin>>time[1].year>>time[1].month>>time[1].day;
        time[0].total=tdays(time[0].year,time[0].month,time[0].day);
        time[1].total=tdays(time[1].year,time[1].month,time[1].day);
        cout<<time[0].total-time[1].total<<endl; 
    }
}
int tdays(int year,int month,int day)
{
    int y,m,sum=0;
    for (y=N;y<year;y++)
        sum+=daysOfYear(y);
    for (m=1;m<month;m++)
        sum+=daysOfMonth(year,m);
    sum+=day-1;
    return sum;
}
int daysOfMonth(int y,int m)
{
    if (m==1||m==3||m==5||m==7||m==8||m==10||m==12)
        return 31;
    else if(m==4||m==6||m==9||m==11)
        return 30;
    else if(m==2)
    {
        if (isLeapYear(y))
            return 29;
        else
            return 28;
    }
}
int daysOfYear(int y)
{
    if (isLeapYear(y))
        return 366;
    else
        return 365;
}
bool isLeapYear(int n)
{
    if (n%400==0||n%4==0&&n%100!=0)
        return true;
    else
        return false;
}

 

以上是完整程序。

测试数据:1984 7 1 1980 9 10
1990 2 5 2016 1 28

输出结果:

为何在输入了Ctrl+Z之后仍然会有一行输出?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • weixin_41830716 规则边缘 1月前

    1. 简单点说,就是cin.eof()不会阻塞等你输入(可以理解为缓冲区中不是EOF就返回false),可以通过以下代码验证。

    //不等你输入Ctrl+z,直输出两行0
    int main()
    {
        cout<<cin.eof()<<endl;
        cout<<cin.eof()<<endl;
        system("pause");
        
    }

     2. 所以在cin.eof()之前,需要先调用一次读取操作。

    //输入Ctrl+z,输出两行1
    int main()
    {
        int year;
        cin>>year;
        cout<<cin.eof()<<endl;
        cout<<cin.eof()<<endl;
        system("pause");
    }

    3. 结合问题,可以先执行cin>>time[0].year,再进行cin.eof()判断,不过cin>>time[0].year表达式会返回读取的内容,如果是EOF,返回的就是false(-1),就不需要加cin.eof()判断了。

    while(cin>>time[0].year)
        {
            cin>>time[0].month>>time[0].day;
            cin>>time[1].year>>time[1].month>>time[1].day;
            time[0].total=tdays(time[0].year,time[0].month,time[0].day);
            time[1].total=tdays(time[1].year,time[1].month,time[1].day);
            cout<<time[0].total-time[1].total<<endl; 
        }
    点赞 评论 复制链接分享
  • qq_34124780 qq_34124780 1月前
    点赞 评论 复制链接分享