復習 (2)
今回の内容
今回は「関数」から「複合データ」までの復習を行います。知識に抜けがないかチェックしておきましょう。
復習
メソッド
「関数」の回では、「手続き」の回で紹介したメソッドが、さらに値を返せるようにする方法を紹介しました。
package j1.review02; import javax.swing.JOptionPane; public class Add { public static void main(String[] args) { new Add().start(); } void start() { String input1 = JOptionPane.showInputDialog("1つ目の整数を入力"); String input2 = JOptionPane.showInputDialog("2つ目の整数を入力"); int a = Integer.parseInt(input1); int b = Integer.parseInt(input2); int result = add(a, b); JOptionPane.showMessageDialog(null, "合計は" + result); } int add(int a, int b) { return a + b; } }
値を返すメソッドは、メソッドの宣言時に返す値の型を指定し、メソッドのブロックでreturn文を使って起動元に返す値を指定します。
<命令>
return <起動元に渡す値>;
}
return文はメソッドのどこに書いてもかまいませんが、return文が処理された瞬間にそのメソッドは処理を終了して指定された値を起動元に返します。このため、値を返すメソッドではif文などで分岐してもかならずreturn文を通るようにプログラミングする必要があります。
値を返すメソッドは、プログラムの中でリテラルの代わりに使用できます。
int score = add(50, 70) / 2;
…
int add(int a, int b) {
return a + b;
}
戻り値の種類については、整数 (int)、実数 (double)、文字列 (String)に加え、論理値 (boolean)などを指定できます。それぞれのメソッドでは、return文を利用して対応する値を起動元に返してやります。
<命令>
return <整数>;
}
double <メソッドの名前>(<仮引数の一覧>) {
<命令>
return <実数>;
}
String <メソッドの名前>(<仮引数の一覧>) {
<命令>
return <文字列>;
}
boolean <メソッドの名前>(<仮引数の一覧>) {
<命令>
return <trueまたはfalse>;
}
論理値を返すメソッドは、if文の条件式を書くところで起動できます。起動先のメソッドがtrueを返せば条件が成立したとみなされ、falseを返せば条件が成立しなかったとみなされます。また、先頭に ! をつけることでtrueとfalseを反転させられます。
<成立する場合の命令>
}
if (!<メソッドの名前>(<実引数の一覧>)) {
<成立しない場合の命令>
}
値の列
「値の列」の回では、プログラムで多数の値を取り扱うための仕組みとして、「配列」というものを紹介しました。
package j1.review02; import javax.swing.JOptionPane; public class FirstArray { public static void main(String[] args) { new FirstArray().start(); } void start() { String[] messages = new String[3]; messages[0] = "おはよう"; messages[1] = "こんにちは"; messages[2] = "こんばんは"; String input = JOptionPane.showInputDialog("表示するメッセージは?(0-2)"); int number = Integer.parseInt(input); JOptionPane.showMessageDialog(null, messages[number]); } }
配列にはこれまでに紹介した整数や実数、または文字列などの値を複数記憶させられます。
int[] array = new int[10]; array[0] = 100; array[1] = 200; ...
配列をプログラムから利用するには、まず配列を生成して変数に記憶させます。配列を生成する際には、配列が記憶できる値の種類と、長さ(記憶できる値の個数)を指定します。
double[] <変数の名前> = new double[<配列の長さ>];
String[] <変数の名前> = new String[<配列の長さ>];
配列に記憶させた個々の値を利用するには、変数名の後に角かっこでインデックスを指定します。
int element = array[5];
インデックスは整数で指定し、配列の最初の要素を参照する場合には0、最後の要素を参照する場合には(配列の長さ – 1)を指定します。この配列の長さは、変数名の後に「.length」と指定すればプログラム中から利用できます。
生成した配列を他のメソッドで利用する場合、メソッドの引数として受け渡せます。このとき、仮引数の型には配列型を指定します。
void show(int[] array) { JOptionPane.showMessageDialog(null, array[0]); }
同様に、生成した配列を起動元に返すこともできます。こちらは戻り値の型に配列型を指定します。
String[] create() { String[] array = new String[10]; ... return array; }
つまり、int[], double[], String[]などの配列を表す型は、int, double, Stringなどのこれまでの型と同様に取り合え使えます。
繰り返し
「繰り返し」の回では、for文を利用して特定の処理を繰り返し行う方法について紹介しました。また、繰り返しと配列を組み合わせて、配列の内容を集計するようなプログラムについても紹介しました。
package j1.review02; import javax.swing.JOptionPane; public class Sum { public static void main(String[] args) { new Sum().start(); } void start() { int[] values = getValues(); int total = 0; for (int i = 0; i < values.length; i++) { total = total + values[i]; } JOptionPane.showMessageDialog(null, total); } int[] getValues() { int[] values = new int[5]; values[0] = 10; values[1] = 20; values[2] = 30; values[3] = 40; values[4] = 50; return values; } }
Javaのfor文は次の形式で書きます。ここで宣言した繰り返し変数はfor文のブロック内で利用でき、ブロック内の命令を処理するたびに繰り返し変数が更新されます。また、毎回のブロックを処理する前には繰り返し条件が判定され、条件が成立しない場合には繰り返しが終了します。
<命令>
}
図: for文の構造多くの場合、for文は次のような形式で書きます。これは指定した繰り返し回数だけ処理を繰り返します。このとき、変数iに記憶させる値は、順に0, 1, …, (繰り返し回数 – 1)です。
<命令>
}
この繰り返しを配列と組み合わせると、配列に記憶させた要素を順番に取り出して処理できます。配列の長さにかかわらず同じ書き方ができるので、データの列に対して柔軟に処理を行えます。講義では、配列の中身を合計するプログラムについて紹介しました。
int[] values = getValues(); int total = 0; for (int i = 0; i < values.length; i++) { total = total + values[i]; }
複合データ
「複合データ」の回では、複数のデータを組み合わせた複合データをプログラムで利用するために、「クラス」と「インスタンス」について紹介しました。
package j1.review02; import javax.swing.JOptionPane; public class Quiz { public static void main(String[] args) { new Quiz().start(); } void start() { Question question = new Question(); question.statement = "10 + 20 = ?"; question.correct = 30; String input = JOptionPane.showInputDialog(question.statement); int answer = Integer.parseInt(input); if (answer == question.correct) { JOptionPane.showMessageDialog(null, "正解です"); } else { JOptionPane.showMessageDialog(null, "不正解です"); } } } class Question { String statement; int correct; }
クラスはプログラムの末尾に次のような形式で宣言します。
<フィールドの宣言>
}
クラスは複合データがどのようなデータの組合せであるかという「形式」を表すもので、組み合わせるデータはフィールドとして宣言します。
クラスはあくまで形式であり、プログラムから使える具体的なデータではありません。複合データをプログラムから利用するには、クラスからその具体例である「インスタンス」を生成して使います。生成したインスタンスを変数に記憶させる場合には、クラスと同じ名前の型で変数を宣言します。
クラスからインスタンスを生成したら、それぞれのフィールドに値を代入します。また、同じ形式でフィールドを参照することもできます。
生成したインスタンスを配列に記憶させることもできます。配列は整数(int)や実数(double)、文字列(String)などのほかに、クラスと同じ名前の型を要素の型の指定できます。クラスと同じ名前の型を指定した場合、その配列に記憶させられるのは同じクラスのインスタンスです。
達成度の確認
以下それぞれの項目について、問題ないか確認してみましょう。不安な要素があればそれぞれの回をさらに復習してください。
- 入出力処理を含むプログラムを作成できる
- 受講にあたって必要な手順を実践できる
- Eclipseを利用してプログラムを作成し、実行して挙動を確認できる
- 一般的なプログラムの構造を説明できる
- ダイアログに入力された文字列を簡単に修飾し、ダイアログ上に表示するプログラムを書ける
- 式と変数を利用するプログラムを作成できる
- int, double, String型のリテラルを利用したプログラムを書ける
- int, doubleの四則演算、Stringの結合を利用したプログラムを書ける
- int, double, String型の変数を宣言および初期化し、値を参照するプログラムを書ける
- 文字列をint, doubleに変換して利用するプログラムを書ける
- int, double, String型の変数に値を代入するプログラムを書ける
- 条件分岐を利用するプログラムを作成できる
- 3種の制御構造のうち、順次と分岐について説明できる
- 場合分けを行うプログラムを書ける
- 論理演算 (&&, ||) を利用したプログラムを書ける
- 一連の手続きをメソッドにまとめて、命令として利用するプログラムを作成できる
- 引数を伴う値を返さないメソッドを宣言し、任意のメソッドから起動するプログラムを書ける
- それぞれの変数の有効範囲(スコープ)を説明できる
- 一連の手続きをメソッドにまとめて、命令の中で利用するプログラムを作成できる
- 引数と戻り値を伴うメソッドを宣言し、命令の中で利用するプログラムを書ける
- 論理型、論理リテラルを利用したプログラムを書ける
- 配列を利用するプログラムを作成できる
- 配列変数を利用したプログラムを書ける
- 配列を引数に取るメソッドを宣言し、それを起動するプログラムを書ける
- 配列を返すメソッドを宣言し、それを起動するプログラムを書ける
- 配列の要素を繰り返しにより集計するプログラムを作成できる
- 3種の制御構造について説明できる
- 任意の回数だけ同じ処理を繰り返すプログラムを書ける
- 繰り返し変数を利用するプログラムを書ける
- 配列要素を反復し、集計するプログラムを書ける
- インスタンスとインスタンスフィールドを利用するプログラムを作成できる
- クラスを宣言し、インスタンス変数を利用するプログラムを書ける
- インスタンスを引数に取るメソッドを宣言し、それを起動するプログラムを書ける
- インスタンスを返すメソッドを宣言し、それを起動するプログラムを書ける
- インスタンスの配列型を利用するプログラムを書ける