刚刚开始学习,在题库里面抽到这一题。
某人三天打渔两天晒网,假设他从1990年1月1日开始打渔三天,然后晒网两天,请编程回答任意的一天他在打渔还是晒网。
一个男孩工作3天,而请假2天。如果他在1990年1月1日工作,那么对于通过键盘输入的日期,请编写一个程序来确定男孩在做什么,工作或休息?
输入和输出示例:
1)输入
1990-01-05
输出:
他正在休息。
2)输入:
1990-01-07
输出:
他正在工作。
3)输入:
1990-01-33
输出:
输入无效。
输入数据格式:“%4d-%2d-%2d”
输出数据格式:“输入无效。”或“他正在休息。” 或“他正在工作。”

1,闰年的表达式,刚开始我写错了,没有想到整百年份的问题,正确表达(year%4000)||(year%100!=0&&year%40);****
2,对于已知年份求日期,开始我用了三个for循环,穷举每天日期再判断是否合法,计数,效率实在太低,最后,使用一个for求整年天数,闰年366,平年365,
使用数组存储月份天数,另起一个for求月份天数,最后再加上天数减一,嗯哼?????,这个地方好像还有点问题,到底为什么减一呢?????还是有点迷啊
轻轻松松就被绕晕了。
————————————————
版权声明:本文为CSDN博主「叫我小墨迹吧」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30282649/article/details/102835366

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4  int main() 
  5 
  6 {
  7     while(1){     //这个while是为了方便多次测试
  8 
  9     int pastday=0,mday=0;
 10     while(1)
 11     {
 12     int year=1990,month=-1,day=-1,verbool=0;        //初始化很重要,这样可以避免输入不全出错 
 13     scanf("%4d-%2d-%2d",&year,&month,&day);
 14     getchar();
 15     verbool = verData(year,month,day);
 16     if (verbool==1)break;
 17     }
 18 
 19     printf("你输入的日期是%d年%d月%d日\n",year,month,day);
 20     pastday=caData(year,month,day);
 21     printf("据1990-01-01过了%d天",pastday);
 22     mday=pastday%5;
 23     if(mday<3&&mday>=0)
 24     printf("\n今天他打鱼\n");
 25     else
 26     printf("\n今天他晒网\n"); 
 27         
 28     }
 29 return 0;
 30 }
 31 
 32 //检测输入日期是否合法 
 33 int verData(int verY,int verM,int verD)
 34     {
 35     int days[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};            //好像并不需要12月的天数 
 36     if(verY<1990||verM<1||verM>12||verD>=days[verM])
 37         {
 38         printf("输入有误,请重新输入:\n");
 39         return 0;
 40         }
 41     else
 42         {
 43 
 44         return 1;
 45         }
 46     }
 47     
 48     //计算天数
 49     
 50     
 51     int  caData (int caY,int caM,int caD)
 52     {
 53         int i=0,k=1;
 54         int year=0;
 55         int days[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
 56     //计算1990年1月1日到指定年份的1月1日天数        
 57         for (year=1990;year<caY;year++) 
 58         {
 59             if((year%400==0)||(year%100!=0&&year%4==0))//闰年 
 60             {
 61                 i+=366;
 62              }else{
 63                  i+=365;
 64               }
 65         }
 66     //计算指定年份日期到当年1-1天数
 67     //月份天数 
 68         for(k=1;k<caM;k++)
 69         {
 70             if((year%400==0)||(year%100!=0&&year%4==0)&&(k=2))
 71             i+=29;
 72             else{
 73             i+=days[k];
 74             }
 75         }    
 76         i+=caD-1;
 77         return i;
 78         
 79         
 80     
 81     }
 82 //*************************************************************************************************************************************    
 83 //*************************************************************************************************************************************
 84 //失败品,失败品,失败品,失败品 
 85 
 86 //检测输入日期是否合法 
 87 //int verData(int verY,int verM,int verD)
 88 //    {
 89 //        if (verY<1990||verM<1||verM>12||verD<1||verD>31)//取值范围 
 90 //        return 0; 
 91 //        else if((verY%400==0)||(verY%100!=0&&verY%4==0)&&verM==2&&verD>29)//润年2月取值 
 92 //        return 0;
 93 //        else if(verY%4!=0&&verM==2&&verD>28) // 平年二月取值 
 94 //        return 0;
 95 //        else if (verY%4!=0&&verM<7&&verM%2==0&&verD>30)//是否31日 
 96 //        return 0;
 97 //        else if(verY%4!=0&&verM>7&&verM%2!=0&&verD>30)//是否31日 
 98 //        return 0;
 99 //        else
100 //        return 1;
101 //         
102 //    }
103 //    
104 //    int    caData (int caY,int caM,int caD)
105 //    {
106 //        int i=0;
107 //        int year=0,month=0,day=0;
108 //计算1990年1月1日到指定年份的1月1日天数        
109 //    for (year=1990;year<caY;year++) 
110 //    {
111 //        for(month=1;month<12;month++)
112 //        {
113 //            for(day=1;day<31;day++)
114 //            {
115 //                    if (year%400==0year%4==0&&month==2&&day>29)//润年2月取值 
116 //                        ;
117 //                        else if(year%4!=0&&month==2&&day>28) // 平年二月取值 
118 //                        ;
119 //                        else if (year%4!=0&&month<7&&month%2==0&&day>30)//是否31日 
120 //                        ;
121 //                        else if(year%4!=0&&month>7&&month%2!=0&&day>30)//是否31日 
122 //                        ;
123 //                        else
124 //                        i++;
125 //            }
126 //        }
127 //    }
128 //    
129 //    //计算指定年份日期到当年1-1天数
130 //     
131 //        return i;
132 //    }
133 //    

 

版权声明:本文为dosu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dosu/p/11897615.html