zoukankan      html  css  js  c++  java
  • 打鱼晒网问题, 初见日期计算

    刚刚开始学习,在题库里面抽到这一题。
    某人三天打渔两天晒网,假设他从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日
    ",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("
    今天他打鱼
    ");
     25     else
     26     printf("
    今天他晒网
    "); 
     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("输入有误,请重新输入:
    ");
     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 //    
  • 相关阅读:
    RN8209校正软件开发心得(1)
    Chrome 31版本导出Excel问题
    ComBox选择
    网页设计的一般步骤
    .NET一套开发工具
    关于用sql语句实现一串数字位数不足在左侧补0的技巧
    python jieba模块详解
    python内置函数详细描述与实例演示
    Markdown的基本语法记录
    python configparser模块详解
  • 原文地址:https://www.cnblogs.com/dosu/p/11897615.html
Copyright © 2011-2022 走看看