打鱼晒网问题, 初见日期计算
刚刚开始学习,在题库里面抽到这一题。
某人三天打渔两天晒网,假设他从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 //