5 コンピュータの得意な仕事(繰り返し)

5.1 学習目標

5.2 繰り返し

今回のテーマは同じ命令を何度も書かずに、コンピュータに繰り返しさせることです。

繰り返しプログラムを見ていく前に、何を繰り返すか考えていきましょう。

5.2.1 何を繰り返すのか

何回も出てきた、家のプログラムを見てみましょう。

リスト 5.2.1.1 House.java
  1: /*
  2:  * 家を書くプログラム
  3:  * 2003/05/08
  4:  * Yoshiaki Matsuzawa
  5:  */
  6: public class House extends Turtle {
  7: 
  8: 	//起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new House());
 11: 	}
 12: 
 13: 	//タートルを動かす処理
 14: 	public void start(){
 15: 	
 16: 		//屋根を書く
 17: 		rt(30);
 18: 		fd(50);
 19: 		rt(120);
 20: 		fd(50);
 21: 		rt(120);
 22: 		fd(50);
 23: 		rt(120);
 24: 		lt(30);
 25: 		
 26: 		//本体を書く
 27: 		rt(90);
 28: 		fd(50);
 29: 		rt(90);
 30: 		fd(50);
 31: 		rt(90);
 32: 		fd(50);
 33: 		rt(90);
 34: 		fd(50);		
 35: 	}
 36: 	
 37: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

このプログラム、何度も同じことを書いている個所が2箇所ありますね。どこが同じか考えてみましょう。

5.2.2 繰り返しを使ったプログラム

繰り返しを使って、すっきりとしたプログラムにしてみましょう。

リスト 5.2.2.1 WhileHouse.java
  1: /*
  2:  * 家を書くプログラム(繰り返し)
  3:  * 2003/05/08
  4:  * Yoshiaki Matsuzawa
  5:  */
  6: public class WhileHouse extends Turtle {
  7: 
  8: 	//起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new WhileHouse());
 11: 	}
 12: 
 13: 	//タートルを動かす処理
 14: 	public void start(){
 15: 	
 16: 		int i;//ループ用変数
 17: 		
 18: 		//屋根を書く
 19: 		rt(30);
 20: 		i = 1;
 21: 		while(i <= 3){
 22: 			fd(50);
 23: 			rt(120);
 24: 			i = i + 1;
 25: 		}
 26: 		lt(30);//上向きに戻す
 27: 		
 28: 		//本体を書く
 29: 		i = 1;
 30: 		while(i <= 4){
 31: 			rt(90);
 32: 			fd(50);
 33: 			i = i + 1;
 34: 		}
 35: 		
 36: 	}
 37: 	
 38: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

今回登場した"繰り返し"を使うと、プログラムを繰り返すことができます。

繰り返しの一般的な形は次のとおりです。

while( [条件式] ) {
	処理
}
				

条件式が成立(true)のした場合には、処理が実行されます。不成立(false)の場合は処理を飛ばします。

処理が実行し終わると、もう一度条件式を評価します。

これを、条件式が不成立(false)になるまで繰り返します。

これをフローチャートと呼ばれる図を用いて書くと、次のようになります。

5.2.2.1 プログラムのフローチャート

図 5.2.2.1.1 プログラムのフローチャート

5.2.2.2 繰り返しのフローチャート

図 5.2.2.2.1 繰り返しのフローチャート

条件式は前回の条件分岐によるプログラムで学習した書式と同じ書式が使えます。 繰り返しを止めるために、変数を使います。この変数には、「今何回繰り返したか」といった情報を格納しておきます。

5.2.3 繰り返しを使ったプログラムの実行過程

プログラムの実行過程と変数の値の変化を見ていきましょう。

5.2.3.1 変数の宣言

図 5.2.3.1.1 変数の宣言

5.2.3.2 変数を初期化する(1を代入)

図 5.2.3.2.1 変数を初期化する(1を代入)

5.2.3.3 変数を評価して条件を判定する

図 5.2.3.3.1 変数を評価して条件を判定する

5.2.3.4 変数に1を加える

図 5.2.3.4.1 変数に1を加える

変数が、5になったときに条件式が不成立(false)になるので、繰り返しが終ります。 これで4回繰り返されるのが分かるでしょうか?

5.3 応用:円を書くプログラム

繰り返しを使うと、円を簡単に書くことができます。次のプログラムを実行してみましょう。

5.3.1 円を書きつづけるプログラム

リスト 5.3.1.1 Circle.java
  1: /*
  2:  * 円を書くプログラム
  3:  * 2003/06/01
  4:  * Yoshiaki Matsuzawa
  5:  */
  6: public class Circle extends Turtle {
  7: 
  8: 	//起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new Circle());
 11: 	}
 12: 
 13: 	//タートルを動かす処理
 14: 	public void start(){
 15: 		
 16: 		//円を書く
 17: 		while(true){
 18: 			fd(1);
 19: 			rt(1);
 20: 		}
 21: 		
 22: 	}
 23: 	
 24: }

下のボタンを押すと、このプログラムが実行できます。 ここをクリックすると、プログラムをダウンロードできます。

5.4 練習問題

5.4.1 問題1:円を描くプログラムを改良しよう

最後に出てきた円を描くプログラムは、条件が無い(常に成立(true))ので止まりません。 変数をつけ、適切な条件式を考えて、一周したらプログラムを止めるように改良して下さい。

5.4.2 問題2:円の描かれ方について考察しよう

一回の繰り返しで動く大きさ(fd(1))と、角度(rt(1))の数字を変更すと、円の大きさを変えることができます。 いろいろ数字を変えて、どのようにすると自分の思った円がかけるか、考察してください。

ヒント: 大きさと角度を入力できるようにすると、数字を変えるたびにコンパイルする必要がないので、いろいろ実験できますよ。 そのようなプログラムにしてから、実験することをお奨めします。

5.4.3 問題3:五角形や星を繰り返しを使って描こう

いままで作った五角形や星を描くプログラムを繰り返しを使って書き直してみましょう。