24节气-第11届蓝桥杯省赛Python真题精选

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

24节气,本题是2020年6月20日举办的第11届蓝桥杯青少组Python编程省赛编程部分第5题,题目要求编程计算当前日期对应的节气,如果当天恰好是一个节气,输出该节气的名称,否则就输出下一个节气的名称。

先来看看题目的要求吧。

一.题目说明

时间限制:4000Ms

内存限制:589824K3

题目描述

夏至将至。《中国天文年历》显示,北京时间6月21日,也就是明天,夏至伴随着接天莲叶的碧,和映日荷花的红,即将盛装登场。夏至是中国"二十四节气"的第十个节气,"二十四节气”被列入联合国教科文组织人类非物质文化遗产名录。在国际气象界,这一已有千年历史的时间认知体系被誉为"中国第五大发明”。

春雨惊春清谷天,夏满芒夏暑相连。秋处露秋寒霜降,冬雪雪冬小大寒。二十四节气,在四季轮回流淌,每个节气都有它较为稳定的日子。下面给出了农历 庚子年(公历2020年1月25日-2021年2月11日)中,二十四个节气的名称,公历具体日期及汉语拼音的缩写。

图片

编程实现

24节气。

输入描述

输入一个日期,介于公历2020年1月25日~2021年1月20日之间。例如:2020年5月2日写为“2020“05*02”

输出描述:

如果当天恰好是一个节气,输出这个节气的汉语拼音缩写,如当天不是节气则输出下一个节气的汉语拼音缩写。

样例输入1:

2020*06*21

样例输出1:

XZ

样例输出1说明:6月21日是夏至,汉语拼音缩写是”XZ”

样例输入2:

2020*07*04

样例输出2:

XS

样例输出2说明:7月4日之后的节气是小暑,汉语拼音缩写是 “XS”

评分标准:

  • 20分:能正确输出一组数据;

  • 20分:能正确输出两组数据;

  • 20分:能正确输出三组数据;

  • 20分:能正确输出四组数据。

二.思路分析

这是一道复杂的计算题,考查的知识点主要包括循环、条件、集合数据和字符串的比较等。

图片

乍一看,这一题还是有点难度的,如何去比较日期呢,又怎么获取节气的拼音缩写呢?看似都是麻烦的问题,实际上比想象中的要简单。

解决本题的关键有两点:

  • 如何比较日期

  • 如何找到对应节气的拼音

对于第一个问题,超平老师告诉你一个编程小秘诀,字符串是可以直接比较的

在Python中,字符串比较是根据字符的ASCII码进行的。具体规则如下:

1). 首先比较字符串的第一个字符的ASCII码;

2). 如果这些字符相等,则继续比较下一个字符,直到找到不相等的字符或者其中一个字符串已经比较完毕;

3). 如果两个字符串的所有字符都相等,且长度也相等,则这两个字符串相等;

4). 如果两个字符串的前缀部分相等,但是一个字符串比另一个字符串短,则较短的字符串被认为小于较长的字符串。

例如,下面的代码:

str1 = "apple"str2 = "banana"print(str1 < str2)

结果会输出 True,因为'a'的ASCII码(97)小于'b'的ASCII码(98)。

本题中的日期字符串主要以数字为主,而数字的ASCII码也是从小到大依次排列的,如图:

图片

因此是可以直接进行比较的,对于本题中的日期,输入格式如下:

2020*06*21

干脆将所有的日期都按照这个格式来构造,即:

年*月*日

然后直接使用字符串比较即可,举例如下:

# 输入2020*06*21,刚好是夏至这一天,应该输出XZ”2020*06*21“ == "2020*06*21"# 输入2020*07*04,小于,应该给输出XS”2020*07*04“ < "2020*07*06"

如此一来,第一个问题就解决了。

接下来看第二个问题,每个节气对应于一个日期,貌似是一个键值对,是否可以直接使用字典呢?

由于输入的日期可能没有对应的节气,如果使用字典,要找下一项有点困难,最好是带有索引(下标),元组则刚好满足这个需求。

因此,我们可以使用元组将所有节气和对应日期保存到列表中,如下:​​​​​​​

solor_iterm = [  ("2020*02*04", "LC") ,  ("2020*02*19", "YS"),  ("2020*03*05", "JZ"),  ("2020*03*20", "CF"),  ...]

有了这个列表,当输入一个日期时,就遍历此列表,当找到大于或等于输入日期的列表项时,结束循环,此时的节气就是我们要的最终结果。

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

三.编程实现

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

  • 构造列表;

  • 循环比较;

1. 构造列表

根据前面的思路分析和题目给出的表格,定义列表如下:

图片

代码比较简单,就是构造一个列表,没有其它逻辑,说明三点:

1). 严格按照表格给出的顺序,其实也是日期的自然顺序;

2). 日期和节气拼音的顺序可以交换;

3). 由于字符较多,输入的时候一定要细心,完成之后尽量坚持一遍。

2. 循环比较

接下来就是循环比较了,代码比较简单,如下:

图片

简单解释一下,在对日期字符串进行比较时,无非就是两种情况:

  • 刚好是某个节气:比如2020*06*21,条件就是solar_terms[i][0] = date;

  • 没有对应节气:比如2020*07*04,条件就是solar_terms[i][0] > date;

综合上述两种情况,就是上面代码中的条件,一旦满足条件,直接输出对应的节气拼音缩写,同时结束循环。

测试程序,当输入2020*06*21时,结果如下:

图片

当输入2020*07*04时,结果如下:

图片

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

四.总结与思考

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

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

  • 条件语句;

  • 列表的遍历;

  • 元组的灵活运用;

  • 字符串比较运算;

题目难度中等,代码看起来不少,但主要是24节气列表的构造,真正的核心代码也就四五行。解决本题的关键是有两点,一是如何对日期进行比较,二是使用哪种数据结构来描述节气。

对于第一点,需要考生熟悉字符串的比较规则,这样就可以极大地简化代码。

对于第二点,则要求我们要熟练掌握Python中的集合类型,包括列表、元组、集合和字典,灵活运用这些数据类型,可以让代码变得更加简单优雅。

超平老师给你留一道思考题,除了上面给出的方法,你还有其它方法实现吗?

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

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

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

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值