[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第9讲。
打印菱形,本题是2019年~2020年举办的第11届蓝桥杯青少组Python编程选拔赛真题(具体日期不详),题目要求根据输入的字符和数字,打印一个菱形图形。
先来看看题目的要求吧。
一.题目说明
编程实现:
输入一个半角英文字符和一个3 ~ 19之间的奇数 , 输出由英文字符构成的菱形图形,输入的数值为菱形中间最长一行中英文符号的个数。
输入描述:
第一行,构成菱形的半角英文字符 ;
第二行,菱形中最长一行英文符号的个数。
输出描述:
由英文符号构成的菱形。
样例输入:
*
11
样例输出:
评分标准:
-
10分:能用输入的英文字符输出菱形, 不论输出的字符数量和形状是否正确 ;
-
30分:至少对一个随机的评判用例 ,能输出高度符合要求的形状,不要求形状完全正确;
-
50分:完全符合题意,即对所有评判用例均 能给出正确输出。
二.思路分析
这是一道打印图案的题目,也是学习Python基础语法时常见的一类题目,考查的知识点包括循环和字符串操作。
本题的难点是如何找到菱形图形的规律,具体来说,就是给定一个行数i,就可以输出第i行的空格和英文字符。
为方便分析和理解,超平老师将题目给出的样例数据,绘制一个表格如下:
你找到这其中的规律了吗?
输入的数字是11,一共有11行字符,可以分成如下3个部分:
-
前5行,
-
中间行
-
后5行
前5行,每一行的空格数量从5开始,依次递减1,分别是5、4、3、2、1;每一行的*则从1开始,依次递增2,分别是1、3、5、7、9。
中间行,即第6行,没有空格,一共有11个*。
后5行和前5行刚好相反,每一行的空格数量从1开始,依次递增1,分别是1、2、3、4、5;每一行的*则从9开始,依次递减2,分别是9、7、5、3、1。
如此一来,问题就变简单了,针对行数为11的情况,只要处理好前5行就可以。推而广之,如果是n行,则只需要处理好前(n//2)行就ok了。
在Python中,for...in循环默认是从0开始的,
for i in range(n//2)
所以,i = 0表示第一行,i = 1表示第二行,根据前面的分析,可以得出如下对应关系:
第i行空格数:n//2 - i
第i行字符数:i * 2 + 1
对于中间行,只需要输出n个字符即可。
而后n//2行,只需要将前n//2行倒过来循环就可以,每一行的空格数和字符数还是遵循上面的关系。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们编写代码如下:
代码不难理解,简单说明3点:
1). 在取中间行的时候,需要使用整除,Python提供了整除运算符//,如果不记得的话,也可以先使用除法/,然后再取整,如下:
mid = int(n / 2)
2). 在Python中,*运算符用途广泛,可以用于重复指定的字符和字符串,从而避免了使用循环结构;
3). Python中的range()函数,具有虎头蛇尾的特性(包含第一个,不包含最后一个),其完整的用法如下:
range(start, stop[, step])
start: 计数从start开始。默认是从0开始;
stop: 计数到stop结束,但不包括stop;
step:步长,默认为1。
所以,在倒序循环的时候,需要将步数设置为负数,同时要注意start和stop的值,确保临界值正确无误。
当输入*和11,效果如下:
当输入#和9时,效果如下:
当输入$和13时,效果如下:
至此,整个程序就全部完成了,你也可以输入不同的符号和数字打印各种菱形效果。
四.思考与总结
本题的分数为50分,代码在10行左右,涉及到的知识点包括:
-
输入处理,主要是类型转换
-
循环语句,主要是for...in循环;
-
range()函数的特点及灵活运用;
-
字符串运算,包括*运算符和连接运算,;
题目难度一般,考查的都是基础知识点,难点在于如何找到菱形图案的规律并进行简化。
对于基础知识点,千万不可忽略,尤其是一些好用的编程技巧。比如本题中的整除运算符//、字符串重复运算符*、字符串连接运算符+以及range()函数的细节,灵活运用这些小技巧,可以极大地提升编程效率。
寻找菱形图案的规律,对大部分同学来说,难度不大,关键在于如何将复杂的问题进行拆分,变成简单问题。
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。