浪里小白虫… 2021-03-03 23:49 采纳率: 66.7%
浏览 315
已采纳

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条回答 默认 最新

  • 规则边缘 2021-03-04 10:31
    关注

    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; 
        }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器