6 ブロックの入れ子構造

6.1 学習目標

6.2 繰り返しの入れ子

今回は繰り返しの入れ子(繰り返しの中に繰り返しがあること)に挑戦してみましょう。

6.2.1 たくさんの円を書くプログラム

次のプログラムを見てみましょう。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 6.2.1.1 円_複数.dama
  1: ※プログラム名:複数の円を描くプログラム
  2: ※       (角度を増やしていく版)
  3: ※作成者:秋山 優
  4: ※作成日:2009.11.11
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: ※環境を初期化する。
 10: ウィンドウを初期化する。
 11: 亀を新規作成して、亀太郎と名付ける。
 12: ウィンドウに亀太郎を追加する。
 13: 
 14: 整数型を新規作成して、iと名付ける。※ループ用1
 15: 整数型を新規作成して、jと名付ける。※ループ用2
 16: 
 17: 整数型を新規作成して、長さと名付ける。※1回に進む距離
 18: 整数型を新規作成して、角と名付ける。※1回に曲がる角度
 19: 
 20: ※円を10個描くためのループ
 21: iに1を入れる。
 22: i≦10である限り{
 23: 	角にiを入れる。
 24: 	長さに1を入れる。
 25: 
 26: 	※円を描くためのループ
 27: 	jに1を入れる。
 28: 	j≦360である限り{
 29: 		亀太郎を長さドット進める。
 30: 		亀太郎を角度右に回す。
 31: 		jにj+角を入れる。
 32: 	}を繰り返す。
 33: 
 34: 	iにi+1を入れる。
 35: }を繰り返す。
図 6.2.1.1 たくさんの円を書くプログラム

前回、円を書くには繰り返しを使うことを習いました。今回は、さらにその円を何個も書くために、 もう一つ外側に繰り返しを作って、"繰り返しを繰り返す"ということをやっています。

6.2.2 ブロックの入れ子

ブロックは{と}で囲まれた部分のことをいいます。条件分岐文であれば、「ならば{」と「}をする。」、繰り返し文であれば、「である限り{」と「}をする。」で囲まれた部分がブロックです。

下図のように、プログラムの条件分岐ブロックや繰り返しブロックはいくつでも入れ子にすることができます。

図 6.2.2.1 ブロックの入れ子
コンパイルエラーに注意

ブロックの始まりと終わり示す{}は必ず対応していなくてはなりません。 条件分岐や繰り返し文が「}をする。」で閉じていない場合、コンパイルエラーとなります。

6.2.3 インデント

第3回の時にも指摘しましたが、インデントをつけるとブロックの範囲が分かりやすくなり、自分にとっても他人にとっても読みやすいプログラムとなります。 インデントがついていないソースは受理しません。

見やすいだけでなく、これができていないためにコンパイルエラーで動かない場合が非常に多いので、 注意してください。

図 6.2.3.1 インデント

6.3 奇数と偶数を判定する

剰余演算子(%)を使うと、割り算のあまりを求めることができます。 これを使うと、例えば奇数と偶数を判定することができます。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 6.3.1 四角三角.dama
  1: ※プログラム名:四角と三角を並べていくプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 亀を新規作成して、亀太郎と名付ける。
 11: ウィンドウに亀太郎を追加する。
 12: 
 13: 整数型を新規作成して、iと名付ける。※ループ用1
 14: 整数型を新規作成して、jと名付ける。※ループ用2
 15: 
 16: 整数型を新規作成して、長さと名付ける。
 17: 長さに50を入れる。
 18: 
 19: ※8回繰り返す。
 20: iに0を入れる。
 21: i<8である限り{
 22: 
 23: 	※偶数なら
 24: 	i%2=0ならば{
 25: 		※四角形を描く
 26: 		jに1を入れる。
 27: 		j≦4である限り{
 28: 			亀太郎を長さドット進める。
 29: 			亀太郎を90度左に回す。
 30: 			jにj+1を入れる。
 31: 		}を繰り返す。
 32: 
 33: 	※奇数なら
 34: 	}をして、そうでないならば{
 35: 		※三角形を描く
 36: 		jに1を入れる。
 37: 		j≦3である限り{
 38: 			亀太郎を長さドット進める。
 39: 			亀太郎を120度左に回す。
 40: 			jにj+1を入れる。
 41: 		}を繰り返す。
 42: 	}をする。
 43: 
 44: 	※次の図形を描く位置に移動
 45: 	亀太郎の筆を無効化する。
 46: 	亀太郎を右に135度回す。
 47: 	亀太郎を長さドット進める。
 48: 	亀太郎を右に180度回す。
 49: 	亀太郎の筆を有効化する。
 50: 
 51: 	iにi+1を入れる。
 52: 
 53: }を繰り返す。

6.4 応用:花を描くプログラム

応用として、花を描くプログラムを考えてみましょう。

図 6.4.1 花を書くプログラム

6.4.1 花びらを描く

花を描くには、まず花びらをかいて、それを繰り返す必要があります。

図 6.4.1.1 花びらを書くプログラム

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 6.4.1.1 花びら.dama
  1: ※プログラム名:花びらを描くプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 亀を新規作成して、亀太郎と名付ける。
 11: ウィンドウに亀太郎を追加する。
 12: 
 13: 整数型を新規作成して、iと名付ける。※ループ用
 14: 
 15: 整数型を新規作成して、長さと名付ける。
 16: 長さに1を入れる。
 17: 整数型を新規作成して、角と名付ける。
 18: 角に1を入れる。
 19: 
 20: ※円弧を描く
 21: iに1を入れる。
 22: i≦120である限り{
 23: 	亀太郎を角度右に回す。
 24: 	亀太郎を長さドット進める。
 25: 	iにi+角を入れる。
 26: }を繰り返す。
 27: 
 28: ※次の円弧の角度へ
 29: 亀太郎を60度右に回す。
 30: 
 31: ※円弧を描く
 32: iに1を入れる。
 33: i≦120である限り{
 34: 	亀太郎を角度右に回す。
 35: 	亀太郎を長さドット進める。
 36: 	iにi+角を入れる。
 37: }を繰り返す。

6.4.2 花を描く

花びらを描くには繰り返しが必要で、花を描くにはさらにそれを繰り返す必要があります。 以下のように、繰り返しの入れ子を使います。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 6.4.2.1 花.dama
  1: ※プログラム名:花を描くプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 亀を新規作成して、亀太郎と名付ける。
 11: ウィンドウに亀太郎を追加する。
 12: 
 13: 整数型を新規作成し、iと名付ける。※ループ用
 14: 整数型を新規作成し、jと名付ける。※ループ用
 15: 
 16: 整数型を新規作成し、長さと名付ける。
 17: 長さに1を入れる。
 18: 整数型を新規作成し、角と名付ける。
 19: 角に1を入れる。
 20: 
 21: ※6枚の花びらを描く
 22: iに1を入れる。
 23: i≦6である限り{
 24: 	※円弧を描く
 25: 	jに1を入れる。
 26: 	j≦120である限り{
 27: 		亀太郎を右に角度回す。
 28: 		亀太郎を長さドット進める。
 29: 		jにj+角を入れる。
 30: 	}を繰り返す。
 31: 
 32: 	※次の円弧の角度へ
 33: 	亀太郎を右に60度回す。
 34: 
 35: 	※円弧を描く
 36: 	jに1を入れる。
 37: 	j≦120である限り{
 38: 		亀太郎を右に角度回す。
 39: 		亀太郎を長さドット進める。
 40: 		jにj+角を入れる。
 41: 	}を繰り返す。
 42: 
 43: 	iにi+1を入れる。
 44: 
 45: }を繰り返す。

ポイントは、花びらを書くループの外側にそれを6回繰り返すループをつくる (つまりループを入れ子にする)ことです。 「繰り返しを繰り返す」ためには、繰り返す繰り返しの外側に繰り返しループ を書く必要がありました。構造は以下のようになります。

図 6.4.2.1 花を書くプログラムの構造

以下に、よくある間違いの例を示します。

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 6.4.2.2 花_間違い.dama
  1: ※プログラム名:花を描くプログラム(うまくいかない版)
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 亀を新規作成して、亀太郎と名付ける。
 11: ウィンドウに亀太郎を追加する。
 12: 
 13: 整数型を新規作成し、iと名付ける。※ループ用
 14: 整数型を新規作成し、jと名付ける。※ループ用
 15: 
 16: 整数型を新規作成し、長さと名付ける。
 17: 長さに1を入れる。
 18: 整数型を新規作成し、角と名付ける。
 19: 角に1を入れる。
 20: 
 21: ※6枚の花びらを描く
 22: iに1を入れる。
 23: i≦6である限り{
 24: 	亀太郎を右に角度回す。
 25: 	亀太郎を長さドット進める。
 26: 	iにi+1を入れる。
 27: }を繰り返す。
 28: 
 29: ※円弧を描く
 30: jに1を入れる。
 31: j≦120である限り{
 32: 	亀太郎を右に角度回す。
 33: 	亀太郎を長さドット進める。
 34: 	jにj+角を入れる。
 35: }を繰り返す。
 36: 
 37: ※次の円弧の角度へ
 38: 亀太郎を右に60度回す。
 39: 
 40: ※円弧を描く
 41: jに1を入れる。
 42: j≦120である限り{
 43: 	亀太郎を右に角度回す。
 44: 	亀太郎を長さドット進める。
 45: 	jにj+角を入れる。
 46: }を繰り返す。

これがうまくいかない理由が説明できるでしょうか? 以下に、このプログラムの構造を示しますので、 うまくいく方と比較してみましょう。

図 6.4.2.2 うまくいかない花を書くプログラムの構造

6.5 練習問題

6.5.1 問題1:四角形と三角形を交互に100個描くプログラムを作ろう

図 6.5.1.1 四角形と三角形を交互に100個描くプログラム

ヒント: 下の四角形を100個描くプログラムを参考にせよ

ここをクリックすると、以下のプログラムをダウンロードできます。

リスト 6.5.1.1 四角_百個.dama
  1: ※プログラム名:四角を並べていくプログラム
  2: ※作成者:秋山 優
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 亀を新規作成して、亀太郎と名付ける。
 11: ウィンドウに亀太郎を追加する。
 12: 
 13: 整数型を新規作成して、Iと名付ける。※ループ用1
 14: 整数型を新規作成して、Jと名付ける。※ループ用2
 15: 整数型を新規作成して、Kと名付ける。※ループ用3
 16: 
 17: ※縦に10回繰り返すためのループ
 18: Iに1を入れる。
 19: I≦10である限り{
 20: 	※横に10回繰り返すためのループ
 21: 	Jに1を入れる。
 22: 	J≦10である限り{
 23: 
 24: 		※四角形を描くためのループ
 25: 		Kに1を入れる。
 26: 		K≦4である限り{
 27: 			亀太郎を10ドット進める。
 28: 			亀太郎を右に90度回す。
 29: 			KにK+1を入れる。
 30: 		}を繰り返す。
 31: 
 32: 		※四角形を描いたら隣に移動
 33: 		亀太郎の筆を無効化する。
 34: 		亀太郎を右に90度回す。
 35: 		亀太郎を15ドット進める。
 36: 		亀太郎を左に90度回す。
 37: 		亀太郎の筆を有効化する。
 38: 
 39: 		JにJ+1を入れる。
 40: 	}を繰り返す。
 41: 
 42: 	※横一列が終わったら左下に移動
 43: 	亀太郎の筆を無効化する。
 44: 	亀太郎を左に90度回す。
 45: 	亀太郎を15×10ドット進める。
 46: 	亀太郎を左に90度回す。
 47: 	亀太郎を15ドット進める。
 48: 	亀太郎を右に180度回す。
 49: 	亀太郎の筆を有効化する。
 50: 
 51: 	IにI+1を入れる。
 52: 
 53: }を繰り返す。
図 6.5.1.2 四角形を10×10描くプログラム

6.5.2 問題2:貝殻を描くプログラムを作ろう

図 6.5.2.1 貝殻を描くプログラム

ヒント:四角を大きくしながら、角度を変えていく ( 繰り返しの変数を利用すること )

6.5.3 問題3:タイヤを描くプログラムを作ろう

図 6.5.3.1 タイヤを描くプログラム

ヒント:ずらす角度は8度, 四角の1辺は10ドットにするとうまくいく。 真ん中の円は多少ずれていても構わない。

6.5.4 問題4:ドラえもんを描くプログラムを作ろう

図 6.5.4.1 ドラえもんを描くプログラム

ノーヒント

6.5.5 問題5:キーボードを描くプログラムを作ろう

図 6.5.5.1 キーボードを描くプログラム

ノーヒント