第十三回 『ループの入れ子構造』について

プログラミング編

はじめに

マサト先生
マサト先生

やあ、こんにちは。今回は『ネスト』というループの入れ子構造についてやっていこう。

ヒロト
ヒロト

はい、よろしくお願いします。

マサト先生
マサト先生

早速だが、次のプログラムを見て、実行するとどうなるか考えてほしい。

ヒロト
ヒロト

はい、『tate』という変数に5が代入され、2行目のfor文の回数が tate=5(回) と定められ、3行目の処理は『* * * * *』を表示することになっています。

よって、実行結果は記号『*』が縦5個、横5個に並んだ正方形となるはずです。

マサト先生
マサト先生

うむ、答え合わせは自分で実行して確認してごらん。

ヒロト
ヒロト

はい、今回は『file32』に書いていきます。実行した結果、確かに予想通りの結果になりました!

ループの入れ子構造について

マサト先生
マサト先生

うむ。今日はこのように記号『*』を用いて、いろいろな図形を描いていくことを通してループの入れ子構造(ネスト)について学んでいこう。

ヒロト
ヒロト

はい、頑張ります!

マサト先生
マサト先生

上のプログラムでは、縦の長さは tate に代入する値を変更することで変えることができたが、横の長さは5個に固定されていて変えることができなかった。今度は『yoko』という変数も用意して、横の長さも自由に変えられるようにしたい。さて、どうするか?

ヒロト
ヒロト

新しく『file33』に書きますね。

うーん、とりあえず1行目と2行目は次のようになります。

ヒロト
ヒロト

上の例にならって3行目にfor文を書くと・・・

ヒロト
ヒロト

for文の各処理ごとに『yoko』という変数を用いて『*』を5個並べたいのだから・・・ううむ、どうすればいいのだろう? print(‘* * * * *’) を書く以外思いつかないぞ。

マサト先生
マサト先生

うむ、これはちょっと難しいので、ぜひ次のプログラムを見て学んでくれ。ポイントは『for文を2回使う』ということだ。

2重ループ

ヒロト
ヒロト

3行目までは同じですね。4行目のfor文では新しい変数 j を用いてます。そして、5行目の処理はprint関数で『*』を表示し・・・

あっ!前回学んだ『end=’ ‘』をつかって『*』を横に伸ばして表示しているのですね!こうすることによって、横に代入された数だけ『*』が横方向に伸びていくということになる!そうか、この手があったか。

マサト先生
マサト先生

うむ、しっかり読み取れているようだな。ここで、4行目のfor文で新しい変数 j を用いているのは3行目のfor文で既に i を使っているからだ。1つのプログラムでfor文をいくつか書く場合、変数を異なるものにする必要があるのだ。単純に、i、j、k・・・と順番に使えばいいだろう。

ヒロト
ヒロト

なるほど、for文の変数として i 以外も使えるのですね。

マサト先生
マサト先生

では、上のプログラムを実行してどうなるか確認してごらん。

ヒロト
ヒロト

はい、実行してみます!

ヒロト
ヒロト

ありゃりゃ、『*』が横一列に並んじゃった!

改行するための方法

マサト先生
マサト先生

ふふふ、すまないがよくやるミスをあえてやらせてもらったのだ。どうしてこういうことになったのか説明しよう。まず、最初横に『*』が5個並ぶだろう?

すると、5個目の『*』に続く『end=’ ‘』が働いて次の5個も横に並ぶということになってしまっているのだ。この事態を回避するためには『改行』をしてくれる『print()』を6行目に入れる必要があるのだ。6行目のどこに入れるかは自分で考えてほしい。

ヒロト
ヒロト

print関数のカッコの中に何も書かないと『改行』をしてくれるのですね!これを6行目のどこに入れるかというと・・・なるほど、インデントの問題があると言いたいのですね!一つ目のfor文のインデントにそろえると良さそうですね!実行すると、下のようにうまくいきました!

マサト先生
マサト先生

今回のプログラムは、for文の中にfor文が入っている『2重ループ』の形をしているこのような形のことを冒頭で触れたように『ネスト』という。入れ子の数が多くなっていくことを『ネストが深くなる』ともいうぞ。

ヒロト
ヒロト

ネスト=入れ子』ということですね、分かりました。

ループを利用して三角形を描く

マサト先生
マサト先生

一つ学んだところで、問題を1問やってみよう!記号『*』を用いて次のような三角形を描いてみよう。新しく『file34』を用意しよう。

ヒロト
ヒロト

縦が5で、横は『*』1個から始まり一つずつ増えていますね。ということは2個目のfor文の回数を1ずつ増えるようにしなくてはいけないから・・・

ヒロト
ヒロト

できました!今回は『yoko』という変数は必要ないことに気づきました。2行目を削除して、2個目のfor文の回数を『i+1』にして横の長さが一つずつ増えるようにしました!

マサト先生
マサト先生

うむ、for文の変数は0から始まり4で終わるから『i+1』としたところは流石だぞ!調子が出てきたところでもう一問!次のような三角形を表示してみよう。

ヒロト
ヒロト

さっきの三角形が逆さまになったものですね!

うん!これは閃いたぞ!

ヒロト
ヒロト

できました!3行目のfor文の回数を『5-i』に変えただけで完成です!

マサト先生
マサト先生

完璧だ!

では、本日最後の問題だ!先ほど『file34』で逆三角形を描いたが、これを3つ連続で表示するプログラムを書いてほしい。つまり下の画像のような図形だ。

ヒロト
ヒロト

なるほど、『file34』に付け加える形で書けそうですね!

3重ループ


・・・数分後


ヒロト
ヒロト

できました!

『kazu』という変数に3を代入して三角形の個数を表し、3行目に新たにfor文を加えるだけで完成です。結果的にfor文を3回使っています。『3重ループ』ということですね!

マサト先生
マサト先生

素晴らしく完璧だ!

複雑なプログラムになってくると入れ子の数が多くなってくるのが常だが、今日はそのことの基礎についてよく理解できたみたいだな。では今日はここまでにしよう、お疲れさん!

ヒロト
ヒロト

はい、ありがとうございました!

コメント

タイトルとURLをコピーしました