プログラム言語の文法を覚えても
どうやって書いたら良いか
まだまだ解らないよーって人多いと思います。
そんな方のためのプログラミング上達講座です。
考えたい方は動画を止めて
プログラムを考えてみてください。
解説動画はこちら
星を書いてみる
今回のテーマは星を書いてみる
です。
次のような星を描く関数を作成してみましょう。
条件:
n = 行数
def star(n):
処理
※星や口は全角
初級の問題
n段目にn個の星を描く
例えば
star(5)
と実行したら、次のように感じに
表示されるような関数を作りましょう。
★
★★
★★★
★★★★
★★★★★
中級の問題
n段に三角形になるように星を描く
star(5)
口口口口★口口口口
口口口★★★口口口
口口★★★★★口口
口★★★★★★★口
★★★★★★★★★
上級の問題
n段にダイヤを描くように星を描く
star(9)
口口口口★口口口口
口口口★口★口口口
口口★口口口★口口
口★口口口口口★口
★口口口口口口口★
口★口口口口口★口
口口★口口口★口口
口口口★口★口口口
口口口口★口口口口
star(10)
口口口口★★口口口口
口口口★口口★口口口
口口★口口口口★口口
口★口口口口口口★口
★口口口口口口口口★
★口口口口口口口口★
口★口口口口口口★口
口口★口口口口★口口
口口口★口口★口口口
口口口口★★口口口口
※偶数個と奇数個の時で処理が変わり
真ん中からは折り返す
さあ、考えてみましょう。
初級編回答
まずprint
関数で文字を出力できます。
n段目にn個の星ということで
毎回個数が変わりますので
このような繰り返しを行うには
for
文を用います。
def star(n):
for i in range(n):
print('★'*(i+1))
star(5)
range
関数を用いると
数値の代わりになるものを生成できます。
数値は0から始まるので1を足してあげます。
Pythonでは文字に関しては
*
で繰り返しを表現できるので
print
関数で文字をn
段分だけ
表示するようにすれば完成です。
中級編回答
まず、引数で入力された行数で総量を求めておきます。
ピラミッド型に星を出力する個数は行数 x 2 -1
個になります。
次に出力を
星の左側の口
★
星の右側の口
というように3分割しそれぞれの個数を計算します。
星の個数が決まれば全体から引いて
2で割れば外側の口の個数になります。
このような関数になりました。
def star(n):
tmp = n*2-1
for i in range(n):
s = ((i+1)*2-1)
k = (tmp - s)//2
res = '口'*k + '★'*s + '口'*k
print(res)
star(5)
上級編回答
上級は解くのに時間がかかると思います。
まず入力された行数が奇数の時と
偶数の時で処理が変わります。
ひし形の上部と下部では
処理が変わることに注意が必要です。
ひし形の左の口
ひし形に描くための★の外枠と口
ひし形の右の口
と分けて考えて
各部分の個数を計算して繋げれば
正解にたどり着けます。
if文の条件分岐で個数を先に考え
出力する1行分の文字を考えます。
こんな感じのコードで星を描けます。
def star(n):
for i in range(n):
s = (i+1)*2-1
k = (i-n//2) if (i+1>n//2) else (n - s)//2
w = (n-(k*2)-2) if (i+1>n//2) else (i*2 if n%2==0 else i*2-1)
res = '口'*k
if (i+1)==1 or (i+1)==n:
res += '★★' if n%2==0 else '★'
else:
res += '★' + '口'*w + '★'
res +='口'*k
print(res)
参考例なので結果があっていれば正解です。
まとめ
さていかがだったでしょうか?
プログラミングの考え方が
身についてきましたでしょうか。
引き続きやっていきたいと思いますので
プログラミングを上達したい方は
解いてみてください。
それでは。
作者の情報
乙pyのHP:
http://www.otupy.net/
Youtube:
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw
Twitter:
https://twitter.com/otupython