Javaプログラミング基礎

演習問題

解答は

に提出しなさい。ソースファイル (〜.java) のみを提出。 提出は gFTP 等の ftp ソフトを用いて行ってください。

問題1 (Basic)

引数に与えられた数が奇数か偶数か判定し、 結果を表示するメソッド evenOrOdd を書きなさい。 さらに、このメソッドを実行するメソッド main を書きなさい。 プログラム名は EvenFinder とする。

このプログラムの概略は次のとおり。

class EvenFinder {
    public static void main(String[] args) {
        evenOrOdd(6);
        evenOrOdd(11);
        evenOrOdd(32);
    }

    static void evenOrOdd( ............ ) {

        引数の値が奇数か偶数か判定し、結果を表示するプログラムをここに書く

    }
}

このプログラムの実行結果は次のようになれば良い。

6は偶数です。
11は奇数です。
32は偶数です。

問題2 (Basic)

メソッドを用い、九九の表を表示するプログラム書きなさい。 このプログラムではメソッドkukuLineを用意し、 このメソッドでは引数に指定された段の1〜9までをかけた結果を表示するようにする。 メソッドmainでは1〜9を順に引数に与え kukuLineを実行すれば良い。 プログラム名は Kuku2 とする。

このプログラムの実行結果は次のようになれば良い。

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

このプログラムの概略は次のようになる。

class Kuku2 {
    public static void main(String[] args) {

        // ↓1から9まで順に引数を与えメソッド kukuLine を実行
        for ( .... ; .... ; .... ) 
            kukuLine( .... );

    }

    static void kukuLine( ........ ) {

        引数に与えられた段を表示
        (引数が2だった場合「2 4 6 8 10 12 14 16 18」を表示)

    }
}

問題3 (Standard)

メソッドmain中に、 int型の配列を用意し適当な値を複数用意しておく。
(例 int[] a = {15, 9, 12, 10, 6, 8, 16, 5, 13, 14})

この配列とint型の値を引数として受けとり、 配列要素のなかから指定された値以下のものを表示する メソッド printLess を書きなさい。 プログラム名は LessFinder とする。

class LessFinder {
    public static void main(String[] args) {
        int[] a = {15, 9, 12, 10, 6, 8, 16, 5, 13, 14};
        printLess(a, 10); // 配列aの要素のうち10以下のものを表示
    }

    static void printLess( .... , .... ) {

        1つめの引数に与えられた配列の要素のうち、
        2つめの引数に与えられた値以下のものを表示するプログラムをここに書く

    }
}

問題4 (Standard)

次のような半径10の円を表示するプログラムを作成しなさい。 プログラム名は PaintedCircle とする。

          *
      *********
    *************
   ***************
  *****************
  *****************
 *******************
 *******************
 *******************
 *******************
*********************
 *******************
 *******************
 *******************
 *******************
  *****************
  *****************
   ***************
    *************
      *********
          *

このプログラムは次の方針で作成すること。

メソッド main で、 y 座標の値を -10 から 10 まで変化させる繰り返しを行う。 そしてこの繰り返しの内側で、x座標の値を -10 から 10 まで変化させる繰り返しを行う。

メソッド printAsteriskInCircle を定義する。 このメソッドは、 x 座標と y 座標の 2 つの int 型の値を受け取り、 その座標が円の内側か外側かを判定し、 内側であれば「*」を表示し、外側であれば空白を表示するように作る。

メソッド main では、 二重の繰り返しの内側で x 座標と y 座標を引数に与え、 メソッド printAsteriskInCircle を実行すれば、 円を表示することができる。

以下に、メソッド printAsteriskInCircle において、 その座標が円内にあるか外にあるか判定する方法を示す。

点 (x, y) が、原点中心で半径 r の円に含まれているかどうかは、 原点からの距離を比較すればよい。 原点からの距離が r 以下であれば、点は円内にある。

両辺を2乗しても成り立つので

点(x,y)が上記の条件を満たすか調べ、 満たしていれば '*' を表示し、満たしていなければ空白を表示すればよい。

問題5 (Advanced)

配列を用い、可変個数のint型のデータの集合を扱えるような メソッド群を作成しなさい。 具体的には、int型の配列に対して値の追加、削除、検索、要素の表示など さまざまな操作を行うメソッドを作成しなさい。 具体的には次のとおり。

さらに、メソッド main に、 これらのメソッドを使い集合にいろいろな操作を行うプログラムを書きなさい。

例えば、新たな集合を作り、1, 9, 6 を追加すると、 集合の内容は次のようになる。

1 9 6

次に 10 を追加すると、集合の内容は次のようになる。

1 9 6 10

また、6 を検索すると 2 番目 (配列は 0 から始まるので) であることがわかるようにする。

そして、集合から 6 を削除すると次のようになる。

1 9 10

このプログラムでは、可変個のデータを扱うことから、 配列の何番目まで意味のあるデータが入っているかを管理する必要がある。 それを行う一つの方法として、 最初に配列全体を「空」を表わす特別な値 (たとえば -1) を決めて初期化し、 先頭から順番に値を入れていくことが考えられる。値を順に取り出すときには -1 が見つかったら、 取り出しを終了すれば良い。

次に、値が削除されたとき、削除済のデータを配列内で管理する必要がある。 一つの方法として次のような処理が考えられる。 削除済みを示す特別な値 (たとえば -2) を決めて、 値が削除されたときに配列要素にその値を書き込むようにする。 データを取り出すときは -2 があったらその要素を読み飛ばすようにする。

プログラム名は CollectionByArray とする。

問題6 (Advanced)

メソッドに関する理解を深めるために、 メソッドの中身からメソッド自分自身を実行するようなプログラムを考えてみよう。

次のプログラムは、5 から順に 1 までカウントダウンを行うプログラムである。

class CountDown {
    public static void main(String[] args) {
	countDown(5);
    }

    static void countDown(int number) {
	System.out.println(number);
	if (number > 1)
	    countDown(number - 1);
    }
}

このプログラムの注目すべき点は、 メソッド countDown のなかで、 さらに自分自身を呼び出していることである。 プログラムの実行時には次のようなメソッドの実行が行われる。

countDown(5) の実行: 「5」を表示し CountDown(5-1) を実行
  countDown(4) の実行: 「4」を表示し CountDown(4-1) を実行
    countDown(3) の実行: 「3」を表示し CountDown(3-1) を実行
      countDown(2) の実行: 「2」を表示し CountDown(2-1) を実行
        countDown(1) の実行: 「1」を表示する
        coundDown(1) の実行は終了
      coundDown(2) の実行は終了
    coundDown(3) の実行は終了
  coundDown(4) の実行は終了
coundDown(5) の実行は終了
「5 4 3 2 1」が表示できた めでたし

このように、メソッド内でメソッド自分自身を再度実行するようなプログラミング手法を、 メソッドの「再帰呼び出し (recursive call) 」と呼ぶ。

再帰呼び出しの考え方を用いて、 次のような図形を表示するプログラムを作成しなさい。 5, 4, 3, 2, 1 と順に数える部分に繰り返し (for を while 文) を使わないこと。 プログラム名は TriangleRecursively とする。

*****
****
***
**
*

問題7 (Advanced)

再帰呼び出しの考え方を用いて、 次のような図形を表示するプログラムを作成しなさい。 1, 2, 3, ..., 10, ..., 3, 2, 1 と順に数える部分に繰り返し (for を while 文) を使わないこと。 プログラム名は TriangleRecursively2 とする。

*
**
***
****
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
****
***
**
*