4 プログラムに知性を(条件分岐)

4.1 学習目標

4.2 条件分岐を使う

今回のテーマは条件に応じて動作が変化するプログラムを書くことです。

ユーザの入力に応じた絵を書かせてみましょう。

4.2.1 条件分岐

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

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

リスト 4.2.1.1 分岐.dama
  1: ※プログラム名:入力された番号の絵を書くプログラム
  2: ※作成者:岡田 健
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 亀を新規作成して、亀太郎と名付ける。
 11: ウィンドウに亀太郎を追加する。
 12: 
 13: 整数型を新規作成して、絵番号と名付ける。
 14: 
 15: コンソールに「描きたい絵の番号を入力して下さい(1.家、2.星)」を出力する。
 16: コンソールから整数を受け取って、それを絵番号に入れる。
 17: 
 18: ※入力された番号が1ならば家を描く。
 19: 絵番号=1ならば{
 20: 
 21: 	整数型を新規作成して、長さと名付ける。
 22: 	整数型を新規作成して、角と名付ける。
 23: 
 24: 	長さに50を入れる。
 25: 	角に90を入れる。
 26: 
 27: 	※屋根を描く
 28: 	亀太郎を右に30度回す。
 29: 	亀太郎を長さドット進める。
 30: 	亀太郎を右に120度回す。
 31: 	亀太郎を長さドット進める。
 32: 	亀太郎を右に120度回す。
 33: 	亀太郎を長さドット進める。
 34: 
 35: 	※本体を描く
 36: 	亀太郎を左に角度回す。
 37: 	亀太郎を長さドット進める。
 38: 	亀太郎を左に角度回す。
 39: 	亀太郎を長さドット進める。
 40: 	亀太郎を左に角度回す。
 41: 	亀太郎を長さドット進める。
 42: 	亀太郎を左に角度回す。
 43: 	亀太郎を長さドット進める。
 44: 
 45: ※入力された番号が1以外ならば星を書く
 46: }をして、そうでないならば{
 47: 
 48: 	整数型を新規作成して、長さと名付ける。
 49: 	整数型を新規作成して、角と名付ける。
 50: 	長さに100を入れる。
 51: 	角に144を入れる。
 52: 
 53: 	※星を描く
 54: 	亀太郎を右に18度回す。
 55: 	亀太郎を右に角度回す。
 56: 	亀太郎を長さドット進める。
 57: 	亀太郎を右に角度回す。
 58: 	亀太郎を長さドット進める。
 59: 	亀太郎を右に角度回す。
 60: 	亀太郎を長さドット進める。
 61: 	亀太郎を右に角度回す。
 62: 	亀太郎を長さドット進める。
 63: 	亀太郎を右に角度回す。
 64: 	亀太郎を長さドット進める。
 65: 
 66: }をする。

いままでのプログラムでは、命令が必ず上から順番に全て実行されていました。 これを順次実行といいます。

今回登場する"条件分岐"を使うと、命令の実行される順番を変更、制御することができます。

条件分岐の一般的な形は次のとおりです。

[条件式]ならば{
	処理A
}をして、そうでないならば{
	処理B
}をする。

条件式が成立した場合には、処理Aが実行され、処理Bは実行されません。

逆に条件式が不成立の場合には、処理Bが実行され、処理Aは実行されません。

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

図 4.2.1.1 条件分岐のフローチャート

ちなみに、「そうでない」ブロックは必要が無ければ省略できます。次のような形になります。

[条件式]ならば{
	処理A
}をする。

このように書くと、条件式が成立した時に処理Aが実行され、 不成立の時には処理Aを飛ばします。

4.2.2 条件式の評価

条件式の評価の過程を見ていきましょう。

4.2.2.1 成立する場合

図 4.2.2.1.1 成立する場合

4.2.2.2 不成立(false)する場合

図 4.2.2.2.1 不成立(false)する場合

4.2.3 複数の分岐

4.2.3.1 じゃんけんプログラム

複数に分岐するプログラムを書くこともできます。

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

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

リスト 4.2.3.1.1 じゃんけん.dama
  1: ※プログラム名:じゃんけんプログラム
  2: ※作成者:岡田 健
  3: ※作成日:2009.11.11
  4: 
  5: ※授業に必要なライブラリを取り込む。
  6: TurtleLibraryを参照する。
  7: 
  8: ※環境を初期化する。
  9: ウィンドウを初期化する。
 10: 亀を新規作成して、亀太郎と名付ける。
 11: ウィンドウに亀太郎を追加する。
 12: 
 13: 整数型を新規作成して、じゃんけん手と名付ける。
 14: 
 15: ※じゃんけんの手は、1をグー、2をチョキ、3をパーとする
 16: 計算機が3でランダム数を生成して、それ+1をじゃんけん手に入れる。
 17: 
 18: ※グーの場合
 19: じゃんけん手=1ならば{ 
 20: 
 21: 	亀太郎を30ドット進める。
 22: 			
 23: 	亀太郎を左に30度回す。
 24: 	亀太郎を25ドット進める。
 25: 	亀太郎を右に60度回す。
 26: 	亀太郎を25ドット進める。
 27: 	亀太郎を右に150度回す。
 28: 	亀太郎を30ドット進める。
 29: 	亀太郎を左に180度回す。
 30: 	亀太郎を20ドット進める。
 31: 			
 32: 	亀太郎を20ドット進める。
 33: 	亀太郎を右に90度回す。
 34: 	亀太郎を20ドット進める。
 35: 	亀太郎を右に90度回す。
 36: 	亀太郎を20ドット進める。
 37: 	亀太郎を左に90度回す。
 38: 	亀太郎を5ドット進める。
 39: 			
 40: 	亀太郎を左に90度回す。
 41: 	亀太郎を20ドット進める。
 42: 	亀太郎を右に90度回す。
 43: 	亀太郎を20ドット進める。
 44: 	亀太郎を右に90度回す。
 45: 	亀太郎を20ドット進める。
 46: 	亀太郎を左に90度回す。
 47: 	亀太郎を5ドット進める。
 48: 
 49: 	亀太郎を左に90度回す。
 50: 	亀太郎を20ドット進める。
 51: 	亀太郎を右に90度回す。
 52: 	亀太郎を20ドット進める。
 53: 	亀太郎を右に90度回す。
 54: 	亀太郎を20ドット進める。
 55: 	亀太郎を左に90度回す。
 56: 	亀太郎を5ドット進める。
 57: 			
 58: 	亀太郎を左に90度回す。
 59: 	亀太郎を20ドット進める。
 60: 	亀太郎を右に90度回す。
 61: 	亀太郎を20ドット進める。
 62: 	亀太郎を右に90度回す。
 63: 	亀太郎を20ドット進める。
 64: 
 65: 	亀太郎を65ドット進める。
 66: 
 67: ※チョキの場合
 68: …をして、じゃんけん手=2ならば…
 69: 
 70: 	亀太郎を30ドット進める。
 71: 			
 72: 	亀太郎を左に30度回す。
 73: 	亀太郎を25ドット進める。
 74: 	亀太郎を右に60度回す。
 75: 	亀太郎を25ドット進める。
 76: 	亀太郎を右に150度回す。
 77: 	亀太郎を30ドット進める。
 78: 	亀太郎を左に180度回す。
 79: 	亀太郎を30ドット進める。
 80: 			
 81: 	亀太郎を左に15度回す。
 82: 	亀太郎を80ドット進める。
 83: 	亀太郎を右に105度回す。
 84: 	亀太郎を20ドット進める。
 85: 	亀太郎を右に75度回す。
 86: 	亀太郎を80ドット進める。
 87: 	亀太郎を左に75度回す。
 88: 			
 89: 	亀太郎を左に75度回す。
 90: 	亀太郎を80ドット進める。
 91: 	亀太郎を右に75度回す。
 92: 	亀太郎を20ドット進める。
 93: 	亀太郎を右に105度回す。
 94: 	亀太郎を80ドット進める。
 95: 	亀太郎を20ドット進める。
 96: 	亀太郎を左に105度回す。
 97: 	亀太郎を5ドット進める。
 98: 
 99: 	亀太郎を左に90度回す。
100: 	亀太郎を20ドット進める。
101: 	亀太郎を右に90度回す。
102: 	亀太郎を20ドット進める。
103: 	亀太郎を右に90度回す。
104: 	亀太郎を20ドット進める。
105: 	亀太郎を左に90度回す。
106: 	亀太郎を5ドット進める。
107: 			
108: 	亀太郎を左に90度回す。
109: 	亀太郎を20ドット進める。
110: 	亀太郎を右に90度回す。
111: 	亀太郎を20ドット進める。
112: 	亀太郎を右に90度回す。
113: 	亀太郎を20ドット進める。
114: 
115: 	亀太郎を65ドット進める。
116: 
117: ※パーの場合
118: }をして、じゃんけん手=3ならば{
119: 
120: 	亀太郎を30ドット進める。
121: 			
122: 	亀太郎を左に30度回す。
123: 	亀太郎を80ドット進める。
124: 	亀太郎を右に120度回す。
125: 	亀太郎を20ドット進める。
126: 	亀太郎を右に60度回す。
127: 	亀太郎を40ドット進める。
128: 	亀太郎を左に150度回す。
129: 	亀太郎を15ドット進める。
130: 			
131: 	亀太郎を80ドット進める。
132: 	亀太郎を右に90度回す。
133: 	亀太郎を20ドット進める。
134: 	亀太郎を右に90度回す。
135: 	亀太郎を80ドット進める。
136: 	亀太郎を左に90度回す。
137: 	亀太郎を5ドット進める。
138: 			
139: 	亀太郎を左に90度回す。
140: 	亀太郎を80ドット進める。
141: 	亀太郎を右に90度回す。
142: 	亀太郎を20ドット進める。
143: 	亀太郎を右に90度回す。
144: 	亀太郎を80ドット進める。
145: 	亀太郎を左に90度回す。
146: 	亀太郎を5ドット進める。
147: 
148: 	亀太郎を左に90度回す。
149: 	亀太郎を80ドット進める。
150: 	亀太郎を右に90度回す。
151: 	亀太郎を20ドット進める。
152: 	亀太郎を右に90度回す。
153: 	亀太郎を80ドット進める。
154: 	亀太郎を左に90度回す。
155: 	亀太郎を5ドット進める。
156: 			
157: 	亀太郎を左に90度回す。
158: 	亀太郎を80ドット進める。
159: 	亀太郎を右に90度回す。
160: 	亀太郎を20ドット進める。
161: 	亀太郎を右に90度回す。
162: 	亀太郎を80ドット進める。
163: 
164: 	亀太郎を75ドット進める。
165: 
166: ※ 1,2,3 以外の場合
167: }をして、そうでないならば{
168: 	コンソールに「不正な数です。」を出力する。
169: }をする。

4.2.3.2 じゃんけんの手のデータの扱いについて

じゃんけんプログラムのような現実問題を扱うときに問題となるのは、 データ(グー、チョキ、パーの手)をどうコンピュータで扱えるようにするかです。 コンピュータでは、そのままこの概念を表すことができないので、 ここでは、1,2,3の数値で表すという方法で実現することを考えましょう。

図 4.2.3.2.1 じゃんけんの手をどのようにプログラムのデータとして扱うか

このように、現実に即したプログラムを作成するためには、 データをコンピュータが扱う形式に変換するという作業が必要になります。 この作業のことをデータ構造の設計(モデル化)といいます。

4.2.3.3 複数の条件分岐

else if 文を使うと、複数にわたる条件分岐を記述することができます。

記述例(書式)を以下に示します。ちなみに、一つのif文に対して、else if文はいくつでも書くことができます。

[条件式]ならば{
	処理A
}をして、[条件式]ならば{
	処理B
}をして、そうでないならば{
	処理C
}をする。

この場合のフローチャートは次のようになります。

図 4.2.3.3.1 複数にわたる条件分岐のフローチャート

4.3 いろいろな条件式

4.3.1 比較演算子

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

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

リスト 4.3.1.1 ローレル指数計算.dama
  1: ※プログラム名:健康管理プログラム
  2: ※       (身長と体重からローレル指数を計算し、体型に対するコメントを表示する)
  3: ※作成者:岡田 健
  4: ※作成日:2009.11.11
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: 整数型を新規作成して、身長と名付ける。
 10: 整数型を新規作成して、体重と名付ける。
 11: 整数型を新規作成して、ローレル指数と名付ける。
 12: 
 13: コンソールに「身長を入力して下さい。」を出力する。
 14: コンソールから整数を受け取って、それを身長に入れる。
 15: コンソールに「体重を入力して下さい。」を出力する。
 16: コンソールから整数を受け取って、それを体重に入れる。
 17: 
 18: ※ローレル指数を求める
 19: ローレル指数に、体重×10000000÷身長÷身長÷身長を入れる。
 20: 
 21: ※ローレル指数を表示する
 22: コンソールに「ローレル指数は、」を出力する。
 23: コンソールにローレル指数を出力する。
 24: コンソールに「です。」を出力する。
 25: コンソールに改行を出力する。
 26: 
 27: ※体型に対するコメントを表示する
 28: ローレル指数<100ならば{
 29: 	コンソールに「やせすぎですね。」を出力する。
 30: }をして、ローレル指数<115ならば{
 31: 	コンソールに「やせていますね。」を出力する。
 32: }をして、ローレル指数<145ならば{
 33: 	コンソールに「普通ですね。」を出力する。
 34: }をして、ローレル指数<160ならば{
 35: 	コンソールに「太っていますね。」を出力する。
 36: }をして、そうでないならば{
 37: 	コンソールに「太りすぎですね。」を出力する。
 38: }をする。
 39: 
 40: コンソールに改行を出力する。

今度のプログラムでは、ローレル指数の範囲に対応して、メッセージが変わっていますね。 このように、プログラムでは、変数に入っている値が同じかどうかを調べるだけでなく、 大きさの大小を比較して、条件を判定することもできます。

表 4.3.1.1 言霊で使える数値の比較演算子
演算子  別の記述方法  表記例 評価 かな漢字変換を使った入力方法
A=B AとBが同じ値の時成立(真)
!= A≠B AとBが同じ値でない時成立(true) =を入力して変換すると、≠が出ます
A>B AがBより大きい時成立(true)
A<B AがBより小さい時成立(true)
>= A≧B AがB以上の時成立(true) >を入力して変換すると、≧が出ます
<= A≦B AがB以下の時成立(true) <を入力して変換すると、≦が出ます

4.3.2 論理演算子

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

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

リスト 4.3.2.1 ローレル指数計算2.dama
  1: ※プログラム名:健康管理プログラム
  2: ※       (身長と体重からローレル指数を計算し、体型に対するコメントを表示する)
  3: ※作成者:岡田 健
  4: ※作成日:2009.11.11
  5: 
  6: ※授業に必要なライブラリを取り込む。
  7: TurtleLibraryを参照する。
  8: 
  9: 整数型を新規作成して、身長と名付ける。
 10: 整数型を新規作成して、体重と名付ける。
 11: 整数型を新規作成して、ローレル指数と名付ける。
 12: 
 13: コンソールに「身長を入力して下さい。」を出力する。
 14: コンソールから整数を受け取って、それを身長に入れる。
 15: コンソールに「体重を入力して下さい。」を出力する。
 16: コンソールから整数を受け取って、それを体重に入れる。
 17: 
 18: ※ローレル指数を求める
 19: ローレル指数に、体重×10000000÷身長÷身長÷身長を入れる。
 20: 
 21: ※ローレル指数を表示する
 22: コンソールに「ローレル指数は、」を出力する。
 23: コンソールにローレル指数を出力する。
 24: コンソールに「です。」を出力する。
 25: コンソールに改行を出力する。
 26: 
 27: ※体型に対するコメントを表示する
 28: ローレル指数<100ならば{
 29: 	コンソールに「やせすぎですね。」を出力する。
 30: }をして、ローレル指数≧100かつローレル指数<115ならば{
 31: 	コンソールに「やせていますね。」を出力する。
 32: }をして、ローレル指数≧115かつローレル指数<145ならば{
 33: 	コンソールに「普通ですね。」を出力する。
 34: }をして、ローレル指数≧145かつローレル指数<160ならば{
 35: 	コンソールに「太っていますね。」を出力する。
 36: }をして、ローレル指数≧160ならば{
 37: 	コンソールに「太りすぎですね。」を出力する。
 38: }をする。
 39: 
 40: コンソールに改行を出力する。

今度のプログラムも、前例とやっていることは同じなのですが、条件文がちょっと異なっていますね。

論理演算子を使うと、2つの条件式を使って、それらの条件が両方とも、もしくは、 どちらかが成立した時のように、組み合わされた条件式全体の条件を判定することができます。

表 4.3.2.1 言霊で使える論理演算子
演算子 表記例 意味
かつ AかつB AとB両方とも成立の時、成立
または AまたはB AもしくはBが成立の時、成立

4.3.2.1 論理演算子の評価の過程

論理演算子の評価の過程を見ていきましょう。

And演算子が成立(true)する場合

図 .1 And演算子が成立(true)する場合

And演算子が不成立(false)する場合

図 .1 And演算子が不成立(false)する場合

4.4 変数の有効範囲

変数はブロック({}で囲まれた範囲)内でのみ有効なので注意しましょう。

例えば、次のような例の場合の変数の有効範囲は下表のようになります。

整数型を新規作成して、zと名付ける。
	
[条件式]ならば{
	
	整数型を新規作成して、xと名付ける。
	処理A
	
}をして、そうでないならば{
	
	整数型を新規作成して、yと名付ける。
	処理B

}をする。	
				
表 4.4.1 変数の有効範囲
変数名 処理A 処理B
x 有効 無効
y 無効 有効
z 有効 有効

有効範囲外で変数を呼び出そうとすると、コンパイルエラーが出ます。

有効範囲外なら同じ変数名を使うことができます。 その場合、それぞれの変数が違う値を持つことになります。

4.5 練習問題

4.5.1 問題1:絵の描き分けプログラムを作ろう

前回作ったプログラムを改造して、条件式を使って、 ユーザの入力に応じて、タートルの書く絵を変えるプログラムを書いてください。 余裕がある人は、条件文を駆使して実用的なプログラムに挑戦してみてください。

4.5.2 問題2:おみくじプログラムを作ろう

乱数と条件分岐を使って、「大吉」「中吉」「小吉」「凶」を表示するプログラムを作りましょう。 大吉のときだけ、タートルの絵(星など)を描くようにしましょう。