今までに出てきたプログラムは,ある特定の状況でデータを処理するものでしたが,より複雑なプログラムを書く場合には,状況によって処理の仕方を変 えることができます.このように状況に応じて処理をさせることを「プログラムの制御」と言います.
一般に,プログラム言語に用意されている処理の仕方には大きく分けて3通りあります.
以上の構造を組み合わせることによって様々なプログラムを記述することができます.
選択構造では,複数の処理から一つを選択するための「条件」を設定する必要があり,反復構造においては,繰り返しを終了する「条件」を設定する必要 があります.
この条件設定の記述の仕方を見てみましょう.
「真」,「偽」のどちらかの値だけを取る型を「boolean型」(論理値型)と言います.
| 表記 | 意味 |
|---|---|
| true | 真 |
| false | 偽 |
プログラム上で「条件」は,同じ型の変数2つの間の関係式:「条件式」によって表されます.様々な条件に対応した関係を表す「関係演算子」が用意されています.
二つの変数をそれぞれ X,Y とした場合,条件式は以下のように記述します.そして,プログラム中で条件式が呼び出されると,その時に変数に代入されている「値」に対して関係式が評価され,条件が成立する場合:「真」が,成立しない場合:「偽」が結果として得られます.
| 条件式 | 関係演算子 | 意味 | 結果(boolean型) | |
|---|---|---|---|---|
| true(真) | false(偽) | |||
| X < Y | < | 小さい | X < Y | X ≥ Y |
| X > Y | > | 大きい | X > Y | X ≤ Y |
| X <= Y | <= | 以下 | X ≤ Y | X > Y |
| X >= Y | >= | 以上 | X ≥ Y | X < Y |
| X == Y | == | 等しい | X = Y | X ≠ Y |
| X != Y | != | 等しくない | X ≠ Y | X = Y |
これらの関係演算子を使用して,プログラム内の変数に対する「条件式」を記述してみます.
整数の変数 x の内容が5以上かどうか(5以上のとき真):x >= 5
整数の変数 x の内容が5かどうか(5のとき真):x == 5
doubleの変数 x の内容が3.5より小さいかどうか(3.5未満のとき真):x < 3.5
プログラムによっては,より複雑な条件を考える必要も生じます.しかし,関係演算子だけでは単純な条件式しか記述できません.従って,複雑な条件を記述しなければならない場合には,単純な条件式を組合せて複雑な条件式を記述することが出来るようになっています.
複数の条件式を組み合わせて一つの条件式を記述するために「論理演算子」と言う演算子が用意されています.
二つの条件式をそれぞれ A,B とすると.次のような記号と使用することで,2つの条件式を組合せた条件式を記述できます.また,これらの論理演算子を複数使用し,2つ以上の条件式を多様に組み合わせることで,様々に組み合わされた複雑な条件式を記述することが可能です.
| 論理演算子 | 種類 | 意味 | 記述法 |
|---|---|---|---|
| && | 論理的AND | かつ | A && B |
| || | 論理的OR | または | A || B |
| ! | 論理否定 | でない | !A |
論理演算の結果を表したものを「真理値表」と言い,それぞれの論理演算子によって,組み合わされる条件式の個々の真偽がどのように組み合わされるかを示しています.
| A | B | A && B | A || B | !A |
|---|---|---|---|---|
| 偽 | 偽 | 偽 | 偽 | 真 |
| 偽 | 真 | 偽 | 真 | 真 |
| 真 | 偽 | 偽 | 真 | 偽 |
| 真 | 真 | 真 | 真 | 偽 |
これらの論理演算子を使用して,複雑な条件式を記述できます.
整数の変数 x の内容が5以上かつ10未満かどうか(5以上かつ10未満のとき真):x >= 5 && x < 10
整数の変数 x の内容が5ではなく,整数の変数 y の内容が3かどうか(xが5でなくyが3のとき真):x != 5 && y == 3
doubleの変数 x の内容が 3.5 より小さいまたは,doubleの変数 y の内容が 7.5 より大きいかどうか:x < 3.5 || y > 7.5
各自,様々な条件をどのように記述すれば良いかを考えてみましょう.論理演算子で結合した条件式は,基本的に左辺から順に評価されますが,括弧()で囲えば,その部分が先に評価されます.
条件によって2つの処理のうちどちらかが選択されるプログラムを作ってみましょう.
条件によって2つの処理から1つを選択するには,次のような「IF文」と言う構造を使用します.
if(条件式){
処理1
}
else{
処理2
}
このように書くと,「条件式」が「真」のときは「処理1」が,「偽」のときは「処理2」が実行されます.
入力した数値が偶数か奇数かを判定するプログラムを作ってみましょう.
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class FirstIF extends Application{
public static void main(String[] args) {
launch(args);
}
//TextFieldの作成
TextField tf = new TextField();
Label label1 = new Label("整数を入力して下さい.");
Label label2 = new Label();
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Application FirstIF");
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10,10,10,10));
root.setSpacing(10.0);
//テキストフィールドの設定
tf.setAlignment(Pos.CENTER_RIGHT); //入力値を中央右揃え
tf.setMaxWidth(100); //フィールドの最大サイズを100pxにする
root.getChildren().addAll(label1, tf,label2);
//イベント処理のラムダ式による記述
tf.setOnAction(event -> judgeValue());
Scene scene = new Scene(root,320,240);
stage.setScene(scene);
stage.show();
}
//メソッド「judgeValue」
private void judgeValue() {
String s = tf.getText();
int x = Integer.parseInt(s);
//IF文により判定
if(x%2 == 0){ //%は余りを求める演算
label2.setText(x + "は偶数です.");
}
else{
label2.setText(x + "は奇数です.");
}
}
}
上のプログラムを参考にして次のどちらかのプログラムを作って実行してみましょう.
IF文は二者択一であるが,多くの条件に従って選択をしたい場合もあります.その場合,「ELSE-IF文」という書き方を用います.
「ELSE-IF文」は,多数の条件を順番に評価していくようにプログラムを書きます.
if(条件式1){
処理1
}
else if(条件式2){
処理2
}
…
…
…
else{
処理n
}
このように書くと,「条件式1」が「真」の時「処理1」が実行され,「偽」のときは次の「条件式2」の評価をします.
そして,「条件式2」が「真」の時「処理2」が実行され,「偽」のときはさらに次の「条件式」を評価します.
その後は「else if」が続く限り条件分岐が生じ,全ての条件に「偽」の場合,最後の「else」の「処理n」が実行されます.
入力した数値が偶数か奇数か判定し,さらにそれらが3の倍数かどうかを判定するプログラムを作ってみましょう.
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class SecondIF extends Application{
public static void main(String[] args) {
launch(args);
}
//TextFieldの作成
TextField tf = new TextField();
Label label1 = new Label("整数を入力して下さい.");
Label label2 = new Label();
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Application FirstIF");
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10,10,10,10));
root.setSpacing(10.0);
//テキストフィールドの設定
tf.setAlignment(Pos.CENTER_RIGHT); //入力値を中央右揃え
tf.setMaxWidth(100); //フィールドの最大サイズを100pxにする
root.getChildren().addAll(label1, tf,label2);
//イベント処理のラムダ式による記述
tf.setOnAction(event -> judgeValue());
Scene scene = new Scene(root,320,240);
stage.setScene(scene);
stage.show();
}
//メソッド「judgValue」
private void judgValue() {
String s = tf.getText();
int x = Integer.parseInt(s);
//ELSE-IF文により判定
if(x%2 == 0){
if(x%3 == 0){
label2.setText(x + "は偶数で3の倍数です.");
}
else{
label2.setText(x + "は偶数ですが3の倍数ではありません.");
}
}
else if(x%3 == 0){
label2.setText(x + "は奇数で3の倍数です.");
}
else{
label2.setText(x + "は奇数ですが3の倍数ではありません.");
}
}
}
プログラム例では,ELSEーIF文による判定の所で,単純な条件式のIF文を2重に使用して判定をしていますが, 以下のように論理演算子を用いて条件式を複合して用いることにより,ELSE-IF文の構造を単純化することも可能です.
if(x%2 == 0 && x%3 == 0){
label2.setText(x + "は偶数で3の倍数です.");
}
else if(x%2 == 0){
label2.setText(x + "は偶数ですが3の倍数ではありません.");
}
else if(x%3 == 0){
label2.setText(x + "は奇数で3の倍数です.");
}
else{
label2.setText(x + "は奇数ですが3の倍数ではありません.");
}
上のプログラムを参考にして,次のどちらかのプログラムを作成して実行してみましょう.
考え方1(if文は入れ子に出来る:if文の中にif文を書く)