刚刚开始学习,在题库里面抽到这一题。

某人三天打渔两天晒网,假设他从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求月份天数,最后再加上天数减一,嗯哼?????,这个地方好像还有点问题,到底为什么减一呢?????还是有点迷啊
轻轻松松就被绕晕了。~


  1. 闰年的判别表达式: 四位年份,闰年满足以下条件,后两位被 4整除 或者前两位被 4整除 简单说,就是,被 400 整除的年 或 被 4 整除但 不被 100 整除的年
(year % 400) || (year % 100  != 0 && year % 400 != 0  )

其他的代码注释里都有
代码如下:

#include <stdio.h>int main(){int m_days[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31}; int year, month, day, sumdays = 0;scanf("%4d-%2d-%2d", &year, &month, &day);// 检测非法输入if (year < 1990 || month < 1 || month > 12 || day < 1 || day > m_days[month]){printf("输入无效。\n");return 0;}// 加上 每年的基本天数sumdays += (year - 1990) * 365;// 计算有多少个闰年 就额外加多少天// 1992 年是闰年,每过四年是一个闰年sumdays += ( (year - 1990) / 4 );// 累加每月天数,其实,数组可以存成 {0 , 31, 59, 90 .....} 这样免去累加for (int i = 1; i < month; i++){sumdays += m_days[i];}// 加上这个月的天数sumdays += day;// 根据算法: 输入 1990-1-5 ,计算得 sumdays = 5// 所以 1 2 3 4 5 日// 在 sumdays - 1 整除 5 的余数 分别为 0 1 2 3 4// 那么休息的条件就是 >= 3// 如果 sumdays 不减一 整除 5 的余数 分别为 1 2 3 4 0// 休息的条件是 > 3 || == 0if ( ((sumdays - 1) % 5) >= 3){printf("他正在休息。\n");}else{printf("他正在工作。\n");}return 0;
}

下面是烂代码

#include <stdio.h>
#include <stdlib.h>int main() {while(1){   //这个while是为了方便多次测试int pastday=0,mday=0;while(1){int year=1990,month=-1,day=-1,verbool=0;     //初始化很重要,这样可以避免输入不全出错 scanf("%4d-%2d-%2d",&year,&month,&day);getchar();verbool = verData(year,month,day);if (verbool==1)break;}printf("你输入的日期是%d年%d月%d日\n",year,month,day);pastday=caData(year,month,day);printf("据1990-01-01过了%d天",pastday);mday=pastday%5;if(mday<3&&mday>=0)printf("\n今天他打鱼\n");elseprintf("\n今天他晒网\n"); }
return 0;
}//检测输入日期是否合法
int verData(int verY,int verM,int verD){int days[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};         //好像并不需要12月的天数 if(verY<1990||verM<1||verM>12||verD>=days[verM]){printf("输入有误,请重新输入:\n");return 0;}else{return 1;}}//计算天数int  caData (int caY,int caM,int caD){int i=0,k=1;int year=0;int days[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};//计算1990年1月1日到指定年份的1月1日天数       for (year=1990;year<caY;year++) {if((year%400==0)||(year%100!=0&&year%4==0))//闰年 {i+=366;}else{i+=365;}}//计算指定年份日期到当年1-1天数//月份天数 for(k=1;k<caM;k++){if((year%400==0)||(year%100!=0&&year%4==0)&&(k=2))i+=29;else{i+=days[k];}}   i+=caD-1;return i;}
//*************************************************************************************************************************************
//*************************************************************************************************************************************
//失败品,失败品,失败品,失败品 //检测输入日期是否合法
//int verData(int verY,int verM,int verD)
//  {
//      if (verY<1990||verM<1||verM>12||verD<1||verD>31)//取值范围
//      return 0;
//      else if((verY%400==0)||(verY%100!=0&&verY%4==0)&&verM==2&&verD>29)//润年2月取值
//      return 0;
//      else if(verY%4!=0&&verM==2&&verD>28) // 平年二月取值
//      return 0;
//      else if (verY%4!=0&&verM<7&&verM%2==0&&verD>30)//是否31日
//      return 0;
//      else if(verY%4!=0&&verM>7&&verM%2!=0&&verD>30)//是否31日
//      return 0;
//      else
//      return 1;
//
//  }
//
//  int    caData (int caY,int caM,int caD)
//  {
//      int i=0;
//      int year=0,month=0,day=0;
//计算1990年1月1日到指定年份的1月1日天数
//  for (year=1990;year<caY;year++)
//  {
//      for(month=1;month<12;month++)
//      {
//          for(day=1;day<31;day++)
//          {
//                  if (year%400==0year%4==0&&month==2&&day>29)//润年2月取值
//                      ;
//                      else if(year%4!=0&&month==2&&day>28) // 平年二月取值
//                      ;
//                      else if (year%4!=0&&month<7&&month%2==0&&day>30)//是否31日
//                      ;
//                      else if(year%4!=0&&month>7&&month%2!=0&&day>30)//是否31日
//                      ;
//                      else
//                      i++;
//          }
//      }
//  }
//
//  //计算指定年份日期到当年1-1天数
//
//      return i;
//  }
//

【练习题+1】某人三天打渔两天晒网,假设他从1990年1月1日开始打渔三天,然后晒网两天,请编程回答任意的一天他在打渔还是晒网。相关推荐

  1. 中国有句俗语叫“三天打鱼两天晒网”。如果从1990年1月1日起开始执行“三天打鱼两天晒网”。如何判断在以后的某一天中是“打鱼”还是“晒网”?

    在线问题 中国有句俗语叫"三天打鱼两天晒网".如果从1990年1月1日起开始执行"三天打鱼两天晒网".如何判断在以后的某一天中是"打鱼"还是 ...

  2. 03【C语言 趣味算法】(值得品味的一道题)打鱼还是晒网?结构体的简单应用。函数的应用。判断闰年的应用。求指定日期距1990年1月1日的天数。

    目录 一.指路哦 三.打鱼还是晒网 嘞? 3.1 问题描述 3.2 问题分析 3.3 算法设计 3.4 确定程序框架 3.5 求出指定日期距 1990年1月1日的天数 3.6 完整code 及结果 一 ...

  3. 开源社区Github在2022年06月09日公测了三个新的成就徽章

    开源社区Github在2022年06月09日公测了三个新的成就Achievements 徽章 今天登录GitHub突然惊喜的发现多了一个可爱的小鲨鱼徽章. 加上之前的三个徽章,现在一共有六个啦- 有两 ...

  4. 3月1日Azure夜校第三场继续开始

    各位合作伙伴 感谢各位的支持!时间过的快,坚持总是一件很难的事情. 春暖花开,第三场azure夜校培训3月1日18:00再次来临.前两场的课件.视频都可下载了.请见下列表. 培训日程和内容 外地可以6 ...

  5. 【历史上的今天】12 月 5 日:分布式系统的“三驾马车”;世界上第一篇计算机科学博士论文;IBM 推出“深蓝”计算机

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 5 日,在 120 年前的今天,娱乐业巨头沃尔特·迪斯尼(Walt Disney)诞生:他 ...

  6. 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

    输入(Input): 年 月 日 输出(Output): (1)若这一天"晒网",输出 sleeping (2)若这一天"打鱼",输出 fishing 示例1( ...

  7. 5月1日起施行,三种情形不予信用修复!

    为进一步加强专利代理分级分类信用监管,促进专利代理机构.专利代理师依法诚信执业,维护专利代理行业秩序.近日,国家知识产权局印发<专利代理信用评价管理办法(试行)>. 此次<办法> ...

  8. (精华)2020年7月26日 React ref的三种方式

    import React from 'react'export default class RefDemo extends React.Component {constructor() {super( ...

  9. 大话西游维护完怎么刷服务器,大话西游2免费版 12月17日维护公告 街坊三妖刷新调整...

    亲爱的玩家: 为了保证服务器的稳定和服务质量,<大话西游2免费版>将于2020年12月17日早上8:00停机,进行每周例行的维护工作,维护时间为早上08:00至09:30,同时,本次停机还 ...

最新文章

  1. JSP第二次作业_6小题
  2. 数据公钥加密和认证中的私钥公钥
  3. 利用DNS Zone Transfers漏洞工具dnswalk
  4. shell脚本——调试(-n / -x /-c)
  5. 计算机系统占有率,微软继续领跑PC操作系统市场 Win10占有率突破25%
  6. SpringBoot默认日志logback配置解析
  7. oracle与mysql的区别总结(一)
  8. 关于 Win 8 RT 你应该知道的 15 件事
  9. 计算平均成绩,科目数已知
  10. python 去重方法
  11. 常用的个人网站建站系统
  12. SpringBoot格式化日期
  13. java实现爬虫,爬取网易歌单信息
  14. 北京大学可视化发展前沿研究生暑期学校Day3
  15. 刘德华陈年温馨情侣照(多图)
  16. 腾讯、网易云、字节跳动面试点总结—AMS在Android起到什么作用?
  17. 2345浏览器写CSDN博客错误
  18. 西瓜书+南瓜书学习(1-2章)
  19. Android笔记:触摸事件的分析与总结----多点触控
  20. 首航新能冲刺上市:主打并网逆变器,宁德时代、深创投均为股东

热门文章

  1. kafka与zk的关系(一)
  2. win10你需要来自trustedinstaller的权限的解决办法
  3. 从手机丢失看数据安全
  4. 配资指数带您了解恒生HOMS系统发展历史
  5. vue+echarts+json绘制地图“绝对干货”
  6. 常用鱼钩及8字环绑法
  7. 从 薛定谔的猫 聊到 Event loop
  8. AD安装:Cannot find extension ComponentFromSupplierSearch
  9. 切换极速模式和兼容模式,可以解决一部分网页问题。
  10. python 压缩文件夹_python3 压缩文件及文件夹