メインコンテンツへスキップ
見出し画像
Photo byomori55

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 でピタゴラス数を書き出す

     
     
    情報科・数学科教員にして   作家・旅人・芸人 AI評論家・火山ハンター

    あなたへのおすすめ