[導讀]:超平老師的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。