第 3 回 プログラムの構造

前回の復習

前回は変数・定数とその型、演算子などについて学びました。 前回のサンプルからの抜粋を見てください。

3      int a;
4      double b;
5      a = 2;
6      b = a + 2.0;
7      System.out.println(b);

補足

6 行目で int 型の a と double 型の 2.0 を加算しています。 このとき、 a から取り出された中身 2 は 2.0 と型が合うよう (暗黙のうちに) double 型の 2.0 へと 型変換 されます。 a そのものは int 型のままです。

a = 2 や b = a + 2.0 のような単位を といい、 それに ; (セミコロン) をつけたものを といいます。

今回の内容

前回までのプログラムは上の行から順に実行されるものでしたが、 今回紹介するふたつのプログラムでは実行の順序が変わります。 そういったところを特に注意してください。

今回の題材は二つの数の最大公約数を求めるプログラムです。

01  class sample3a{
02    public static void main(String[] args){
03      int a = 567, b = 675;
04      System.out.println(a + "と" + b + "の最大公約数は" + gcd(a, b));
05    }
06  
07    public static int gcd(int a, int b){
08      int c;
09      while(a > 1){
10        c = a;
11        a = b % a;
12        b = c;
13      }
14      return b;
15    } 
16  }

boolean 型

boolean 型の変数・定数は、 true (真) か false (偽) どちらかの値を取ります。 boolean 型は次章で述べる条件分岐などに用います。

関係演算子

関係演算子 は両辺の数値を比較して、 その関係が成り立つ場合は true の値を取り、 成り立たない場合は false の値を取ります。

演算子truefalse
< (より大きい)2 < 32 < 2, 2 < 1
<= (以上)2 <= 3, 2 <= 22 <= 1
== (等しい)2 == 22 == 1
!= (異なる)2 != 32 != 2

論理演算子

論理演算子 は両辺の boolean 値によって、 true か false を取ります。 || は両辺の boolean 値のうち少なくとも一方が true のときに true を取り、それ以外は false を取ります。 && は両辺の boolean 値が両方とも true のときに true を取り、それ以外は false を取ります。

制御構文

条件分岐や条件を満たす間の繰り返しなどの構文を扱います。 ここでいう 条件 は、 boolean 型の値を取る式によってあらわします。

if-else

if-else 文は条件によって実行する文を変えるために使います。

if(条件 1)
  文 1 // 条件 1 が true のときに実行される
else if(条件 2)
  文 2 // 条件 1 が false で、条件 2 が true のときに実行される

// 中略

else if(条件 n)
  文 n // 条件 1 から n-1 がすべて false で、条件 n が true の時に実行される
else
  文 n+1 // 条件 1 から n がすべて false のときに実行される

while

while 文は条件の満たされている間文を実行し続けるために使います。

while(条件)
  文 // 条件が true である間繰り返し実行される
  1. 条件が false なら繰り返しを終了
  2. 文を実行して 1. に戻る

for

for 文も繰り返しに使います。

for(文 1; 条件; 文 2)
  文 3
  1. 文 1 を実行 (初期化文)
  2. 条件が false なら繰り返しを終了
  3. 文 3 を実行
  4. 文 2 を実行 (再初期化文) して 2. に戻る

ブロック

{ と } でくくることによって、複数の文をひとつの文のように扱うことができます。 その一塊を ブロック と呼びます。 if 文や while 文などで複数の文を実行したいときはそれらをブロックにします。

ブロックを用いると、 for 文に相当する処理を while 文で記述することができます。 このパターンの繰り返しはよく使われるのですが、どちらで書いてもかまいません。

文 1
while(条件){
  文 3
  文 2
}

メソッド

メソッド とは、よく使う処理をひとまとめにした部品にする構文です。

例えば、最大公約数を何回も求めるプログラムを書くときに、 最大公約数を求める部分を一回だけ書いて、 最大公約数の計算が必要な箇所ではその部分を使うようにできます。

メソッドを作る

メソッドは 0 個以上の入力 (引数) を受け取り、ひとつの出力を戻します (戻り値)。

public static 戻り値の型 メソッド名(引数の型 引数名, ... ){
  // 引数を使った処理

  return 戻り値;
}

二数の最大公約数を計算する関数 gcd の定義を見てみましょう。

07    public static int gcd(int a, int b){ // int 型の引数を二つ受け取り、 int 型の値を戻すメソッド
08      int c;
09      while(a > 1){
10        c = a;
11        a = b % a;
12        b = c;
13      }
14      return b; // この時点で変数 b に入っている値が戻る
15    } 

メソッドは数学の関数に似ているので、対応させて理解するとよいと思います。

メソッド数学関数
いくつかの引数があるいくつかの変数がある
引数を使って定義された処理がなされる変数を使って定義された計算がなされる
引数はデータ型が決まっている変数には定義域がある
戻り値はデータ型が決まっている値域がある

メソッドを呼び出す

メソッドを呼び出すのは簡単です。 sample3a の 4 行目 gcd(a, b) のように適切な入力を与えます。

まとめ

class プログラムの名前{
  public static void main(String[] args){
    // ここにプログラム本体を書く
    // System.out.println を使うと画面に文字が出せる
    // 作ったメソッドを使う
  }

  // ここにメソッドを書く
}

サンプルプログラム (再掲)

以上を踏まえた上で、サンプルプログラムをよく読んでみてください。 多少改造して遊んでみるといいと思います。

01  class sample3a{
02    public static void main(String[] args){
03      int a = 567, b = 675;
04      System.out.println(a + "と" + b + "の最大公約数は" + gcd(a, b));
05    }
06  
07    public static int gcd(int a, int b){
08      int c;
09      while(a > 1){
10        c = a;
11        a = b % a;
12        b = c;
13      }
14      return b;
15    } 
16  }

スコープ

スコープ というのは変数やメソッドの有効範囲のことです。 (基本的に) 変数やメソッドは宣言されたブロックの中で有効で、その外では使えません。 例えば、サンプルの 8 行目で宣言されたint型の変数 c はメソッド gcd の中で有効です。

メソッドの引数として宣言された変数 (仮引数) のスコープはそのメソッドに限られます。 サンプルでは 3 行目と 7 行目でそれぞれ a, b が宣言されていますが、 そのスコープが重複していないので、問題となりません。