20 やり残したJava文法

20.1 学習目標

20.2 繰り返しの制御

このプログラムは、10枚のカードを入れ物1に入れ、1枚ずつ取り出して入れ物2に移すプログラムです。

リスト 20.2.1 MoveCards.java
  1: /*
  2: * プログラム名:カードをリスト1からリスト2に移動するプログラム
  3: * Created on 2012/01/07
  4: * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5: */
  6: public class MoveCards extends Turtle {
  7: 	
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new MoveCards(), args);
 11: 	}
 12: 	
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 		hide();
 16: 		Turtle.window.size(550,300);
 17: 		ListTurtle<CardTurtle> list1 = new ListTurtle<CardTurtle>(true,"リスト1");
 18: 		ListTurtle<CardTurtle> list2 = new ListTurtle<CardTurtle>(true,"リスト2");
 19: 		{	//位置を移動する
 20: 			list1.warp(50,40);
 21: 			list2.warp(50,110);
 22: 		}
 23: 		{	//カードを入れる
 24: 			int i = 0;
 25: 			while(i < 10){
 26: 				list1.addLast(new CardTurtle(i * 10));
 27: 				i++;
 28: 			}
 29: 		}
 30: 		do{
 31: 			sleep(0.5);
 32: 			{	//移動する
 33: 				if(list1.getSize() != 0){
 34: 					list2.addLast(list1.getObjectAtCursor());
 35: 				}else if(list1.getSize() == 0){
 36: 					break;
 37: 				}
 38: 				
 39: 			}
 40: 			update();
 41: 		}while(true);
 42: 		print("アニメーションループが終了しました.");
 43: 	}
 44: 	
 45: }

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

下のボタンを押すと、MoveCardsプログラムが実行できます。

do-while文

while文とdo-while文は、両方とも繰り返しを表す文ですが、 条件判断の位置が違います。 while文は、最初に繰り返しを続けるかどうか調べて、続けるならば処理を行い、 続けないならば処理を抜ける、という構造をしています。 do-while文は、はじめに処理を行い、処理を行ったあとで、 繰り返しを続けるかどうか調べて、続けるならば2回目の処理を行い、続けないならば処理を抜ける、 という構造をしています。

break文

このプログラムでは、アニメーションループを抜け出すためにbreak文を使用しています。 break文が繰り返し文(while文、for文、do/while文)の中で実行されると、 プログラムの処理の流れはただちに繰り返し構造から抜け出し、 制御が繰り返し構造の直後にある命令に移ります。

break文は、構造化プログラミング(入り口ひとつ、出口ひとつの処理構造)を破壊するものとして、 プログラミングの作法としてはあまりよくないものだと言われています。 break文を使わなくても、同じ処理の流れを定義することは可能なので、 プログラミングの作法を重んじるプログラマは、break文の代わりに変数を用いて繰り返し構造を制御し、 break文を使わないプログラムを記述します。

20.3 論理否定演算子

ボタンを見張ることで,以下のように1ステップずつコマ送りできるプログラムを作ることができます.

リスト 20.3.1 MoveCards2.java
  1: /*
  2:  * プログラム名:カードをリスト1からリスト2に移動するプログラム(改:ボタンで1ステップずつ進む)
  3:  * Created on 2012/01/07
  4:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  5:  */
  6: public class MoveCards2 extends Turtle {
  7: 
  8: 	// 起動処理
  9: 	public static void main(String[] args) {
 10: 		Turtle.startTurtle(new MoveCards2(), args);
 11: 	}
 12: 
 13: 	// タートルを動かす処理
 14: 	public void start() {
 15: 
 16: 		hide();
 17: 		Turtle.window.size(550, 300);
 18: 
 19: 		// リストを2つ作る
 20: 		ListTurtle<CardTurtle> list1 = new ListTurtle<CardTurtle>(true, "リスト1");
 21: 		list1.warp(50, 60);
 22: 		ListTurtle<CardTurtle> list2 = new ListTurtle<CardTurtle>(true, "リスト2");
 23: 		list2.warp(50, 130);
 24: 
 25: 		// リスト1に10枚のカードを入れる
 26: 		for (int i = 0; i < 10; i++) {
 27: 			list1.addLast(new CardTurtle(i * 10));
 28: 		}
 29: 
 30: 		// ボタンを作る
 31: 		ButtonTurtle stepButton = new ButtonTurtle("Step");
 32: 		stepButton.warp(200, 20);
 33: 
 34: 		// アニメションループ
 35: 		do {
 36: 			sleep(0.025);
 37: 
 38: 			if (list1.getSize() != 0) {
 39: 				list2.addLast(list1.getObjectAtCursor());// 入れ物1から入れ物2にカードを移動する
 40: 				waitForPushButton(stepButton);
 41: 			} else if (list1.getSize() == 0) {
 42: 				break;// アニメーションループを抜ける
 43: 			}
 44: 
 45: 			update();
 46: 		} while (true);
 47: 
 48: 		print("アニメーションループが終了しました.");
 49: 	}
 50: 
 51: 	// ステップボタンが押されるまで待つ
 52: 	void waitForPushButton(ButtonTurtle button) {
 53: 		do {
 54: 			update();
 55: 			sleep(0.025);
 56: 		} while (!(button.isClicked()));
 57: 	}
 58: 
 59: }

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

下のボタンを押すと、MoveCards2プログラムが実行できます。

「!」(論理否定演算子)

「!」を論理否定演算子といい、真偽値を逆にする演算子です。!(true)=false、!(false)=trueとなります。 このプログラムに使われている!(StepButton.isClicked())は、ステップボタンが押されていたら、falseを返し、押されていなかったら、trueを返します。