闰年问题-第11届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第25讲。

闰年问题,本题是2020年5月31日举办的第11届蓝桥杯青少组Python编程选拔赛真题,题目要求编程计算输入日期和2020年5月30日相差多少天,并输出是星期几,在计算时需要考虑闰年情况。

先来看看题目的要求吧。

一.题目说明

提示信息:

闰年分为普通闰年和世纪闰年。

音通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004年就是闰年)。

世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。

总结:四年一闰,百年不闰,四百年再闰。

闰年的一年为366天,闰年的二月份为29天。平年一年为365天,平年的二月为28天。

每年的1、3、5、7、8、10、12月份为31天,4、6、9、11月份为30天。

编程实现:

用户输入未来的某一天,输入格式:“2020.6.1”,计算和2020年5月30日相差多少天,是星期几?(例如:今天和明天是相差一天)。

样例输入:

2020.6.1

样例输出:

2

星期 1

评分标准:

  • 5分:能正确输出一组相差的天数及星期几;

  • 10分:能正确输出两组相差的天数及星期几;

  • 15分:能正确输出三组及以上相差的天数及星期几。

二.思路分析

这是一道复杂的计算题,考查的知识点主要包括循环、双分支条件、列表操作和闰年算法等。

根据题目的描述,我们可以将需求拆分成如下3个部分:

  • 判断闰年

  • 计算日期差

  • 计算星期几

下面,超平老师就逐一对这3个部分进行详细分析。

1.判断闰年

闰年的判断,简单来说,分为如下两种情况:

什么是普通闰年?就是指尾数不是00的年份,也就是不能被100整除的年份。在这个前提条件下,只要是能被4整除的年份都是闰年,其条件也就不难写出来了:

year % 100 != 0 and year % 4 == 0

对于世纪闰年来说,就更简单 ,只需要满足一个条件,即能被400整除,其条件如下:

year % 400 == 0

将上面两个条件综合起来,就可以得到判断闰年的完整条件,如下:

year % 100 != 0 and year % 4 == 0 or year % 400 == 0

注意,二者是逻辑或的关系。为了方便,我们可以使用自定义函数来实现闰年的判断逻辑。

2. 计算日期差

这是本题的难点,对于日期差的计算,要考虑的因素比较多,需要分情况讨论,如下:

图片

我们可以举例来说明。

如果输入的是2020年的某一天,只需要统计整月的天数,再加上当前月份的天数。

当输入2020.8.20时,需要先将6月的30天和7月的31天进行累加,再加上8月份的20天,同时不要忘了5月31日这一天。

如果不是2020年,处理情况就稍微复杂一些了。

当输入2021.4.3时,则需要先计算2020.5.31到2020.12.31的天数,然后计算2021.1.1到2021.4.3所有的天数,在这个过程中,需要考虑特殊的闰二月。

当输入2022.6.7时,则需要先计算2020.5.31到2020.12.31的天数,然后计算2021年全年的天数,再统计2022.1.1到2022.6.7所有的天数,此过程也需要考虑特殊的闰二月。

为了更好地理解这个过程,可以绘制流程图如下:

由于每个月的天数是固定的,我们可以使用列表将月份保存起来,如下:

[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

注意,这是平年的月份,对于闰年,2月份需要增加一天。

3. 计算星期几

对于星期几的判断,最快捷的方法莫过于使用datetime模块中的weekday()方法。它通常与datetime模块中的date对象一起使用,用于获取指定日期是星期几。

from datetime import date# 创建一个date对象表示指定日期d = date(2023, 10, 20)  # 2023年10月20日# 使用weekday()方法获取该日期是星期几,# 返回值为0(星期一)到6(星期日)weekday_number = d.weekday()

需要注意的是,使用weekday()方法得到的结果是数字0~6,分别表示从从星期一到星期日。

题目要求输出的是星期1、星期2...星期7,我们可以使用列表将它们保存起来,如下:

["星期1","星期2","星期3","星期4","星期5","星期6","星期7"]

然后通过下标直接就可以输出对应的星期几了。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们分3步来编写程序:

  • 定义函数判断闰年;

  • 计算天数;

  • 计算星期几;

1. 定义函数判断闰年

根据前面的思路分析,定义函数如下:

图片

输入一个年份,如果是闰年,则返回True,否则返回False。

2. 计算天数

首先是获取用户输入的年月日,然后根据不同情况来计算相差天数,代码如下:

图片

代码比较多,强调4点:

1). 获取用户输入的年月日,使用了列表推导式和多变量赋值的编程技巧,前面已经多次介绍过,这里就不再赘述了;

2). 2020年5月31日这一天也需要计算的,所以将dis的初始值设置为1;

3). 在统计整年的天数时,其循环的范围是(2021,y),如果输入的是2021年,循环就不会执行,同时需要判断年份是否为闰年,闰年的天数为366;

4). 在统计整月的时候,需要考虑特殊的闰二月,如果是闰年并且是2月份在,则多加一天。

3. 计算星期几

这部分的代码比较简单,如下:

图片

输入2020.6.1,效果如下:

图片

输入2023.10.21,效果如下:

图片

至此,整个程序就全部完成了,你也可以输入不同的日期来测试效果。

四.总结与思考

本题的分数为30分,代码在30行左右,涉及到的知识点包括:

  • 循环语句,主要for...in循环;

  • 条件语句,包括单分支和双分支;

  • 循环和条件语句的相互嵌套;

  • 函数的定义及使用;

  • 列表运算;

  • 日期对象的基本使用;

题目难度较大,代码量也比较多。难点有两个,一是要搞清楚计算相差天数的逻辑,二是使用date对象来获取星期几。

对于难点一,非常考验学生的逻辑思维能力和解决问题的能力,超平老师建议使用特例法,先列举几个具体的日期,看看是怎么计算的,然后画出流程图。

对于难点二,就看平时的积累了,日期时间对象是编程时常用的知识点,还是多运用,做到熟练掌握。

超平老师给你留一道思考题,如果不使用date对象,能否计算出星期几呢?

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/303447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

swaggerUI不好用,试试这个openapiUI?

1.背景 由于长期使用 swaggerUI 工具,它的轻量风格个人觉得还是不错的,但是它的整体使用体验确实不好,用过的可能都有体会,这里就不一一列举了(由于语言表达能力有限,手动🐶保命,毕…

1.7数算PPT选择汇总,PTA选择汇总,计算后缀表达式,中缀转后缀、前缀、快速排序

PTA选择汇总 在第一个位置后插入,注意是在后面插入,而不是前面;要移动49,为50-I,第25个的话,移25个 如果是插在前面,就移动50,N-I1,注意是插在前面还是后面 删第一个&a…

JS-基础语法(一)

JavaScript简单介绍 变量 常量 数据类型 类型转换 案例 1.JavaScript简单介绍 JavaScript 是什么? 是一种运行在客户端(浏览器)的编程语言,可以实现人机交互效果。 JS的作用 JavaScript的组成 JSECMAScript( 基础语法 )…

变换器电感饱和以及电流变大电感变小原因分析

电感电流变大电感值变小 在一个DC-DC电源转换器中,电感器的电流与其电感量是有关系的。当电感器的电流增大时,其电感量通常会变小。 电感器的电感量(L)是指在单位电流变化率下,电感器两端的电压变化的比例。根据电感…

【JAVA GUI+MYSQL]社团信息管理系统

本社团信息管理系统主要实现登录注册、管理员信息管理、社团用户信息管理、用户申请信息管理功能模块。 目录 1.系统主要功能介绍 2. 数据库概念模型设计 3.具体功能模块的实现 3.1模型类 3.1.1Student.java 3.1.2User .j…

高通平台开发系列讲解(USB篇)Ubuntu 下如何使用模块

文章目录 一、查看VID、PID二、adb添加2.1、在udev下添加模块的VID2.2、重启adb服务三、虚拟串口添加(AT、Diag)沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要图解高通平台上位机使用方法 一、查看VID、PID 在ubuntu下使用模块进行AT指令发送,Diag等串…

【QML COOK】- 003-处理鼠标事件

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {id: backgroudanchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"}MouseArea {anchors.fill: parentonClicked: backgroud.rot…

docker run 命令详解

一、前言 Docker容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了Docker引擎的服务器上(包括流行的Linux机器、Windows机器),也可以实现虚拟…

【hcie-cloud】【20】容器详解【容器介绍,容器工作机制、容器常用命令说明】【上】

文章目录 前言容器是什么虚拟化技术的四个特点容器也是一种虚拟化技术容器是怎么实现虚拟化的?容器对比虚拟机有哪些优势?容器对比虚拟机有哪些不足?容器不仅是一种虚拟化技术,更重要的是一种应用打包机制容器提供的是PaaS服务常见…

SSH远程访问出现Permission denied(password)解决方法

首先,这个不是密码输错了的问题; 1、在主机先ping一下服务器 ping XXX.XXX.XX.XXX (服务器ip地址) 如果pin成功了,说明可以进行连接 查看服务器的ip ifconfig2、主机连接服务器 (服务器的ip) ssh testXXX.XXX.XX.…

Java中SpringBoot组件集成接入【MQTT中间件】

Java中SpringBoot组件集成接入【MQTT中间件】 1.MQTT介绍2.搭建MQTT服务器1.Windows2.Ubuntu3.Docker4.其他方式3.mqtt可视化客户端MQTTX及快速使用教程4.SpringBoot接入MQTT1、maven依赖2、MQTT配置3、MQTT组件具体代码1.定义通道名字2.消息发布器3.MQTT配置、生产者、消费者4…

线扫相机品牌汇总(国外+国内)

线扫相机品牌汇总(国外+国内) 行者 ​ 热爱生活 22 人赞同了该文章 线扫相机也叫做线阵相机,和面阵相机一样,都是重要的工业相机。 线扫相机正如其名字那样,拍照时像扫描一样,相机和被拍照物体有相对匀速运动。 Perhaps the most common example of line scan imagin…

如何顺滑使用华为云编译构建平台?

这两年平台构建服务需求越来越大,却一直苦于找不到一些指南, 这里特意写了一篇, 对在学习代码阶段和新手程序员朋友也蛮友好, 配置真的也不难, 也特别适合想尝试从0到1做个APP的朋友了。 以华为云的CodeArts Build为例…

Mac/Linux虚拟机CrossOver2024新版下载使用教程

CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件,该软件可以让用户在mac是上直接运行windows软件,本文为大家带来的是CrossOver Mac版安装教程! CrossOver Mac-安装包下载如下:http…

ubuntu系统(9):ubuntu 20.02安装pydot

目录 警告信息 1、确保安装了Python和pip 2、安装Graphviz软件包 3、pip安装pydot 验证 在gem5中,pydot库用于生成图形化输出,特别是生成.dot文件和相关的图像文件,如PDF、PNG等。它与gem5结合使用的一个常见用途是生成系统结构图、内存…

MFC结合GDI+

MFC结合GDI 创建一个空的MFC界面,在确定按钮函数里进行画图: 1、包含头文件与库 在stdafx.h中加入以下三行代码: #include "gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "gdiplus.lib")2、安装GDI 在…

深度学习 Day25——J4 ResNet与DenseNet结合探索(DPN)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 文章目录 前言1 我的环境2 pytorch实现DPN算法2.1 前期准备2.1.1 引入库2.1.2 设置GP…

【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

一、关联式容器 vector/list/deque… 这些容器统称为序列式容器 因为其底层为线性序列的数据结构 里面存储的是元素本身 map/set… 这些容器统称为关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是<key, value>结构的键值对 在数据检索时…

MongoDB高级集群架构设计

两地三中心集群架构设计 容灾级别 RPO & RTO RPO&#xff08;Recovery Point Objective&#xff09;&#xff1a;即数据恢复点目标&#xff0c;主要指的是业务系统所能容忍的数据丢失量。RTO&#xff08;Recovery Time Objective&#xff09;&#xff1a;即恢复时间目标&…

赋能软件开发:生成式AI在优化编程工作流中的应用与前景

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是生成式AI模型如GPT-3/4的出现&#xff0c;软件开发行业正经历一场变革&#xff0c;这些模型通过提供代码生成、自动化测试和错误检测等功能&#xff0c;极大地提高了开发效率和软件质量。 本文旨在深入…