見出し画像

Python が九九 81匹

【実習】 まず、for 文で2重ループを作ろう。九九の表を作るには、大回りで9回転、小回りで9回転する間に掛け算した結果を表示すればよい。

for x in range(9):
    for y in range(9):
        print(x*y)

 さて、これを実行してみると、確かに81回掛け算して、81個の数値を表示します。けれども、九九の表とはまるで違う。
 ということで、上のプログラムを修正して、でも2重ループの構造は生かして、みんなが見慣れた、下のような「九九の表」を作ってください。

 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81

 では、どうぞ。


 まず、元のプログラムのどこがマズかったか、なぜ失敗したか、どうすれば良いのかというと、ポイントは3つあります。

  • Python では整数は 0 から始まる。だから上の書式「for x in range(9):」では x は 0 から 8 まで 9 回転する。y も同様。
    → その結果、0×0=0 から 8×8=64 までの掛け算になっている。

  • 掛け算結果を表示した後、その都度改行する。つまり全部縦表示になってしまって、表の形を成さない。

  • 1桁の数と2桁の数が混在するが、隙間を調整しないと、左詰めになってしまって、ちょっと見にくい。

 まず最初の点を修正するには、

for x in range(9):
    for y in range(9):
        print((x+1)*(y+1))

こう(↑)やるか、もしくは、こう(↓)やるかのどちらかでしょう。

for x in range(1,10):
    for y in range(1,10):
        print(x*y)

 次に2つ目の点「改行するかしないか」ということについては、いったんこう(↓)してみましょう。

for x in range(9):
    for y in range(9):
        print((x+1)*(y+1),end="")

 そうすると今度は、全部が1行に並んでしまって、これもとても表には見えません。しかも数と数の間に隙間が無いので、とても見にくい。

12345678924681012141618・・・(中略)・・・91827364554637281

 考えてみると、各段を表示している間は改行しないけれども、各段が終わったタイミングでは改行させたいわけです。そのためには、小回り(y のループ)では改行しないけれど、大回り(x のループ)の中で改行すれば良い。
 その点を修正したものが、これ(↓)です。

for x in range(9):
    for y in range(9):
        print((x+1)*(y+1),end="  ")  # ← 改行しないが、空白入れた(2文字分)
    print()                          # ← 改行のみ(小回りの外側、大回りの内側)

 これで、だいぶ良い感じ(↓)になってきました。あともう少し。

1  2  3  4  5  6  7  8  9  
2  4  6  8  10  12  14  16  18  
3  6  9  12  15  18  21  24  27  
4  8  12  16  20  24  28  32  36  
5  10  15  20  25  30  35  40  45  
6  12  18  24  30  36  42  48  54  
7  14  21  28  35  42  49  56  63  
8  16  24  32  40  48  56  64  72  
9  18  27  36  45  54  63  72  81  

 続いて、3つ目の点「1桁の数と2桁の数の隙間を調整」することについては、次(↓)のように if 文の中で1文字分の空白を入れることで解決します。

for i in range(9):
    for j in range(9):
        if (i+1)(j+1)<10:             # ← もし1桁の数なら、
            print(end=' ')            # ← 1文字分の空白を入れる
        print((i+1)(j+1),end='  ')
    print()

 以上で、完成です(↓)。

 1   2   3   4   5   6   7   8   9  
 2   4   6   8  10  12  14  16  18  
 3   6   9  12  15  18  21  24  27  
 4   8  12  16  20  24  28  32  36  
 5  10  15  20  25  30  35  40  45  
 6  12  18  24  30  36  42  48  54  
 7  14  21  28  35  42  49  56  63  
 8  16  24  32  40  48  56  64  72  
 9  18  27  36  45  54  63  72  81  

 めでたし、めでたし。


 あーだこーだ、あーでもないこーでもない、うまくいきそう!と思ったけど、あれっ?なんかおかしい。。。こんなことを繰り返して、試行錯誤しているうちに、なんだか知らないけどうまくいったり、うまいやり方に気づいたり。こういう時間が実は大事なんだろうと思います。そして、そんな時間をとれることが、プログラム学習の良いところです。
 あるいは、出来上がったものを隣の人と比べてみると、実行結果は同じでも、途中経過や考え方がずいぶん違っていたり。そんな経験が自然と出来てしまうことも、プログラム学習の良いところなのだと思います。

◇      ◇      ◇

〜 Python で2重ループ・3重ループ
▷ Python が九九81匹       
▷ Python で素因数分解する    
▷ Python でピタゴラス数を書き出す

いいなと思ったら応援しよう!