今週は場合分けのプログラムの書き方を勉強します。場合分けとは、あらかじめ用意された複数の処理の流れを、「こういう場合ならこっちを、そうでなければあっちを実行」という風に、場合に応じて選んで実行させる仕組みのことです。それを実現する分岐文の例として、ここではif文の使い方を学習します。また、先週の繰り返し文と分岐文を組み合わせることで、より複雑な処理の流れを持ったプログラムが書けることも学習します。
3.1 場合分けとは 3.2 分岐文(if文) 3.3 多重に分岐する場合 3.4 制御構造という考え方 3.5 少し複雑な制御構造1(for文を重ねて使う) 3.6 少し複雑な制御構造2(for文とif文を組み合わせて使う)
場合分けとは、あらかじめ複数の選択肢を想定し、場合によってどれか一つを実行することを指しています。たとえば、私たちは日頃「雨の場合は車を使おう(そうじゃなければ歩きでいこう)」とか「おなかがへった場合はこのチョコレートを食べよう(おなかがへらなければ何も食べないでおこう)」というように、「〜の場合」を想定して行動計画をたてることがあります。これをフローチャートで表すと以下のようになります。
プログラムにも、これらの例と同様に、場合分けの考え方を導入することができるのです。プログラムに場合分けの考え方を導入すると、たとえば「ある条件が成立すれば正方形を、それ以外の場合は正三角形を描く」というような処理を考えることができます。以下のフローチャートを見て下さい。
最初にあげた「雨の日は車、、、」と全く同じ構造であることが分かりますね。そして、これをプログラムとして次のように記述できると大変わかりやすいでしょう。
ある条件が成立する場合{ 正方形を描く処理 } それ以外の場合{ 正三角形を描く処理 } |
以下ではまず、実際にJavaでこのプログラムを記述するやり方を学習してゆきます。
プログラムで場合分けを行う際には分岐文を用います。分岐文とは、条件が成立する場合と不成立の場合など、場合に応じて異なる処理を行えるよう、処理の流れを分岐させるときに用いる文のことです。Javaでは分岐文としてif文が用意されています。書式は以下のとおりです。
if(条件式){ 条件が成立した場合に行う処理 } else{ それ以外(条件が不成立)の場合に行う処理 } |
(条件式)のところには、先週繰り返し条件のところで記入した条件式を用いることができます。また、条件が不成立の時には特に何もしないならば、else{}は必要ありません。
さきほどの「ある条件が成立すれば正方形を、、、」の例題を、if文を用いて作成してみましょう。ただしプログラムにするためには、もう少し具体的に問題を定義しなければなりません。「ある条件」がなんであるのかが明らかでないと、プログラムは書けません。そこで今回は、「あらかじめ用意した変数joukenに1が入っている場合は正方形を、それ以外の場合は正三角形を描く」という風に問題を設定してみましょう。
先ほど日本語混じりのプログラムを示した場合分けの部分は、if文を用いると次のようになります。
if(jouken==1){ 正方形を描く処理 } else{ 正三角形を描く処理 } |
プログラム全体を完成するためには、上記のif文を記述する前の段階で、あらかじめ変数joukenの利用を宣言し、さらに変数joukenに条件成立・不成立を決める何らかの整数を代入しなければなりません。
これらを踏まえると、プログラムの全体像は以下のようになります。
/* 場合分けの例として、正方形と正三角形とを 描き分ける 作成日 00.4.23 */ class Jouken1 extends Turtle{ void start(){ // 条件を記憶する int jouken; jouken = 1; // この部分で値を決める。仮に1を与えておく // 条件に応じて図形を描く if(jouken==1){ 正方形を描く処理 } else{ 正三角形を描く処理 } } } |
このプログラムでは変数joukenに、とりあえず1を代入しています(行コメント「この部分で値を決める、、、」の1行を参照)。従ってきちんと完成させると正方形が描かれるはずです。また、この行で1以外の整数を代入すると正三角形が描かれるはずです。
上記のプログラムを完成しなさい(ファイル名Jouken1.java)。うまく実行できたら、変数joukenに異なる数値を与えて実行結果を見てみなさい。
if文はelse ifと併せて用いることにより、2つ以上の条件を設け、3つ以上の処理の流れへの分岐を表すことができます。たとえば「joukenの値が1ならば正方形を、2ならば正三角形を、それ以外ならば正五角形を描く」というような場合です。この場合、以下の書式でプログラムを書きます。
if(jouken == 1){ 正方形を描く処理 } else if(jouken == 2){ 正三角形を描く処理 } else{ 正五角形を描く処理 } |
この場合のフローチャートは次のようになります。
else ifを重ねて行けば、さらに多くの分岐を設けることができます。
else ifを用いてjoukenの値が1ならば正方形を、2ならば正三角形を、それ以外ならば正五角形を描くプログラムを完成しなさい(ファイル名Jouken2.java)。joukenに1を入れてうまくいったら、2の場合、それ以外の場合も試しなさい。
先週学習した繰り返し文や、今週の分岐文は、プログラムにおける処理の順序を制御(コントロール)するという共通した機能を持っています。プログラミングの世界では、これらの文のことを特に制御文、またそれぞれのプログラムが持つ処理の流れの構造のことを特に制御構造と呼ぶことがあります。
どんなに複雑な処理を記述する際にも、基本となる制御構造は以下の三種類です。
順次とは、特に制御文を指定しない場合にはプログラムに書かれた順番で命令が実行されることを表します。
三種類の制御構造はいずれも「入り口ひとつ・出口ひとつ」という点で共通してます。したがって、分岐の命令Aのところに繰り返しを用いたり、繰り返しの命令Aのところでさらに繰り返しを用いたりといった組み合わせが自由にできます。いろいろと複雑な処理も、この単純な三つの制御構造を組み合わせで表現します。
制御文を組み合わせて少し複雑なプログラムを作ってみましょう。for文とif文の組み合わせ方を学習する準備として、先に、for文を重ねて用いるプログラムを作ってみます。
以下のように正方形を横一列に描くプログラムを作成してみましょう。
まず、「正方形を描く→タートルを次の描きはじめの位置に移動する」を4回繰り返すようにプログラムの部分を設計します。
// 正方形を順番に左から右へ描く int i; for(){ 正方形の各辺を順番に描く処理 タートルを次の描きはじめの位置に移動する処理 } |
次に、「正方形の各辺を順番に描く処理」と「タートルを次の描きはじめの位置に移動する処理」をそれぞれ考えます。そのとき、正方形を描くためにはやはりfor文を用います。すると必然的に、このプログラムではfor文の中でfor文を用いることになります。
// 正方形を順番に左から右へ描く int i; for(){ // 正方形の各辺を順番に描く int j; for(){ } // タートルを次の描きはじめの位置に移動する } |
このようにfor文を重ねて用いることをネストすると呼ぶことがあります。
正方形を順番に左から右へ描くプログラムを完成しなさい(ファイル名T_Squares.java)。その際、正方形の一辺の長さは50,正方形同士の間隔は5で作成しましょう。
T_Squares.javaを少し改造すると、以下のような正方形と正三角形を交互に描くプログラムができます。
上記の図形を描くための方法はいくつか考えられますが、ここではT_Squares.javaのやり方を踏まえながらfor文とif文を組み合わせて描く方法を考えてみましょう。
左から右に向かって等間隔に4つの図形を描いているという点で、T_Squares.javaと上記のプログラムは共通しています。しかしながら今回は、1つめと3つめ、つまり奇数番目の図形は正方形、そして偶数番目の図形は正三角形という風に、2種類の異なる図形が並んでいます。
そこで、for文とif文を用いて次のようにプログラムを設計してみましょう。
// 正方形と正三角形を交互に左から右へ描く int i; for(i=1; i<=4; i++){ // 図形の各辺を順番に描く if(奇数回の場合に真){ 正方形を描く処理 } else{ 正三角形を描く処理 } タートルを次の描きはじめの位置に移動する処理 } |
ただしここでif文の「奇数回の場合に真」という条件をどうやって書けばよいのかが問題となります。これは次のように解決します。
奇数偶数を判定する条件文は次のように書きます。判定の対象となる変数名がiならば、
i%2 == 1 |
という条件文をifの()内に書きます。
==の左辺にあるi%2は計算式です。%は左辺の値を右辺の値で割った際の余りを算出します。iが1の場合は「1÷2」の結果が整数ではないので、結果として「余り1」と判定されます。iが2ならば余り0です。つまりi%2の結果は常に1か0になります。
さらにその結果を==の右辺にある1と同じかどうか判定します。同じ、すなわち奇数回ならば正方形を描く、それ以外ならば正三角形を描く、というふうにすればプログラムは完成します。
左から右へ交互に正方形と正三角形を4つ描くプログラムを完成しなさい(ファイル名T_ST.java)。
上の図のような正方形と正三角形によって花模様を描くプログラムを作成しなさい(ファイル名T_Flower.java)。
>> 目次ページへ