[导读]:超平老师的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。