1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

プログラミング上達講座1:星を描いてみる

Last updated at Posted at 2020-07-19

プログラム言語の文法を覚えても
どうやって書いたら良いか
まだまだ解らないよーって人多いと思います。

そんな方のためのプログラミング上達講座です。
考えたい方は動画を止めて
プログラムを考えてみてください。

解説動画はこちら

表示されなかったらすみません

星を書いてみる

今回のテーマは星を書いてみるです。
次のような星を描く関数を作成してみましょう。


条件 
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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?