Java - 実習問題集


■ページ目次

  • このページにある問題は、当サイト内の問題を集めたもので、あたらしい問題ではありません。 Top

    ■Java アプリケーション問題


      Javaアプリケーションの作成・実行

    1. 以下の 2 つのアプリケーション"Print01.java""Print02.java"を入力・実行して、結果を比較してください。
    2. "Print01.java"

      1. public class Print01 {
      2. public static void main(String[] args) {
      3. System.out.println("Hello World!");
      4. System.out.println("みなさん、こんにちは。");
      5. }
      6. }

      □ 実行結果

      $ java Print01
      Hello World!
      みなさん、こんにちは。
      
      "Print02.java"
      1. public class Print02 {
      2. public static void main(String[] args) {
      3. System.out.print("Hello World!");
      4. System.out.print("みなさん、こんにちは。");
      5. }
      6. }

      □ 実行結果

      $ java Print02
      Hello World!みなさん、こんにちは。
      

    3. コマンドライン引数から文字列を受け取り、それを表示するアプリケーション "Print03.java" を入力・実行して、結果を比較してください。
      1. public class Print03 {
      2. public static void main(String[] args) {
      3. System.out.print("コマンドライン引数の値 = ");
      4. System.out.println(args[0]);
      5. }
      6. }

      □ 実行結果

      $ java Print03
      コマンドライン引数の値 = Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
              at Print03.main(Print03.java:4)
      
      $ java Print03 Hello
      コマンドライン引数の値 = Hello
      

    4. コマンドライン引数から double 型の数値を受け取り、それを表示するアプリケーション "Print04.java" を入力・実行して、結果を比較してください。
      1. public class Print04 {
      2. public static void main(String[] args) {
      3. System.out.print("コマンドライン引数の値 = ");
      4. System.out.println(Double.parseDouble(args[0]));
      5. }
      6. }

      □ 実行結果

      $ java Print04 Hello
      コマンドライン引数の値 = Exception in thread "main" java.lang.NumberFormatException: For input string: "Hello"
              at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
              at java.lang.Double.parseDouble(Double.java:482)
              at Print04.main(Print04.java:4)
      
      $ java Print04 3.14
      コマンドライン引数の値 = 3.14
      
      $ java Print04 -10
      コマンドライン引数の値 = -10.0
      

      基本データ型

    5. 以下の"Variable50.java"を入力して、実行してください。
      1. public class Variable50 {
      2. public static void main(String[] args) {
      3. byte b = 10;
      4. short s = -200;
      5. int i = 3000;
      6. long l = -40000;
      7. float f = 5.6f;
      8. double d = -78.901e23;
      9. char c = 'a';
      10. boolean bo = true;
      11. System.out.println("byte : " + b);
      12. System.out.println("short : " + s);
      13. System.out.println("int : " + i);
      14. System.out.println("long : " + l);
      15. System.out.println("float : " + f);
      16. System.out.println("double : " + d);
      17. System.out.println("char : " + c);
      18. System.out.println("boolean : " + bo);
      19. }
      20. }

      □ 実行結果

      $java Variable50
      byte    : 10
      short   : -200
      int     : 3000
      long    : -40000
      float   : 5.6
      double  : -7.8901E24
      char    : a
      boolean : true
      
    6. 上記アプリケーション"Variable50.java"中のリテラル値をいろいろ変えて、実行してみてください。
      例: b = 128; b = -128; s = 077; i = 0xFFFFFFFF; f = 123e456; など。
      エラーが出る場合には、その理由を考えてください。

    7. 基本データ型の演算

    8. コマンドライン引数から体重(kg)と身長(m)を指定し、BMI を計算し表示するアプリケーション"Bmi01.java"を入力して、実行してください。BMI は 体重 / 身長2 です。
      1. public class Bmi01 {
      2. public static void main(String[] args) {
      3. double weight = Double.parseDouble(args[0]);
      4. double hight = Double.parseDouble(args[1]);
      5. //
      6. // ここにコードを記述してください。
      7. //
      8. }
      9. }

      □ 実行結果

      $ java Bmi01 60 1.7
      BMI = 20.761245674740486
      

    9. (オプション)
      上記の"Bmi01.java"を、体重(kg)と身長(cm)を指定するようにしてください。このとき、引数と結果は、int 型とします。("Bmi02.java")
      1. public class Bmi02 {
      2. public static void main(String[] args) {
      3. int weight = Integer.parseInt(args[0]);
      4. int hight = Integer.parseInt(args[1]);
      5. //
      6. // ここにコードを記述してください。
      7. //
      8. }
      9. }

      □ 実行結果

      $ java Bmi02 60 170
      BMI = 20
      

    10. コマンドライン引数から double 型の値 2 つ (a, b とします) を受け取り、それをもとに、円の面積(a2 * 3.14)、三角形の面積(a * b / 2)、四角形の面積(a * b) を計算し表示するアプリケーション"Area01.java"を入力して、実行してください。
      1. public class Area01 {
      2. public static void main(String[] args) {
      3. double a = Double.parseDouble(args[0]);
      4. double b = Double.parseDouble(args[1]);
      5. //
      6. // ここにコードを記述してください。
      7. //
      8. }
      9. }

      □ 実行結果

      $ java Area01 10 20
      円の面積     = 314.0
      三角形の面積 = 100.0
      四角形の面積 = 200.0
      
      $ java Area01 1.1 2.2
      円の面積     = 3.7994000000000008
      三角形の面積 = 1.2100000000000002
      四角形の面積 = 2.4200000000000004
      

    11. (オプション)
      上記アプリケーション"Area01.java"で、計算を Math クラスの定数やメソッドを使うように修正してください。("Area02.java")
      1. public class Area02 {
      2. public static void main(String[] args) {
      3. double a = Double.parseDouble(args[0]);
      4. double b = Double.parseDouble(args[1]);
      5. //
      6. // ここにコードを記述してください。
      7. //
      8. }
      9. }

      □ 実行結果

      $ java Area01 1.1 2.2
      円の面積     = 4
      三角形の面積 = 1
      四角形の面積 = 2
      

    12. (オプション)
      コマンドライン引数から double 型の値 2 つ (a, b とします) を受け取り、それをもとに、円周の長さ(2 * a * 3.14)、二等辺三角形の周の長さ(√(a2 + 4 * b) + a)、四角形の周の長さ(2 * (a + b)) を計算し表示するアプリケーション"Length01.java"を入力して、実行してください。なお、平行根を計算するメソッドは、Math クラスにあります。
      1. public class Length01 {
      2. public static void main(String[] args) {
      3. double a = Double.parseDouble(args[0]);
      4. double b = Double.parseDouble(args[1]);
      5. //
      6. // ここにコードを記述してください。
      7. //
      8. }
      9. }

      □ 実行結果

      $ java Length01 1 1
      円周の長さ       = 6.283185307179586
      三角形の周の長さ = 3.23606797749979
      四角形の周の長さ = 4.0
      

    13. コマンドラインから指定した整数値が偶数のとき、"true"を、奇数のとき"false"をプリントするアプリケーション"EvenOdd01.java"を作成してください。
      1. public class EvenOdd01 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. System.out.println( /* ここにコードを記述してください */);
      5. }
      6. }

      □ 実行結果

      $ java EvenOdd01 4
      true
      
      $ java OddEven01 5
      false
      
    14. コマンドラインから入力した西暦年がうるう年か否かを判定するアプリケーション"LeapYear21.java"を作成してください。
      西暦年がつぎの条件を満たす場合、うるう年になります。
      • 4で割り切れる年はうるう年
      • ただし、100で割り切れる年はうるう年でない
      • さらに、400で割り切れる年はうるう年
      テストにはつぎの年を使用してください。
      • 2000 うるう年
      • 2002
      • 2004 うるう年
      • 2100
      1. public class LeapYear21 {
      2. public static void main(String[] args) {
      3. int year = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java LeapYear21 2004
      true
      
    15. コマンドラインから入力した 2 つの整数値の差が 10 以内であれば true を、そうでなければ false を表示するアプリケーション"Range21.java"を作成してください。
      1. public class Range21 {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]);
      4. int b = Integer.parseInt(args[1]);
      5. // ここにコードを記述してください。
      6. }
      7. }

      □ 実行結果

      $ java Range21 10 20
      true
      
    16. コマンドラインから入力した 3 つの正整数値を、3 角形の各辺の長さと考えて、その 3 つの値で三角形ができるとき true を、そうでなければ false を表示するアプリケーション"Triangle21.java"を作成してください。
      1. public class Triangle21 {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]);
      4. int b = Integer.parseInt(args[1]);
      5. int c = Integer.parseInt(args[2]);
      6. // ここにコードを記述してください。
      7. }
      8. }

      □ 実行結果

      $ java Triangle21 2 3 4
      true
      

      基本データ型の型変換

    17. 'a'の文字コードの値を画面に出力するアプリケーション"CodePrint01.java"を作成し、実行してください。
      1. public class CodePrint01 {
      2. public static void main(String[] args) {
      3. char c = 'a';
      4. System.out.println(???? + "'s code is " + ????);
      5. }
      6. }

      □ 実行結果

      a's code is 97
      

    18. (オプション)
      上記アプリケーションで、コマンドラインから文字を指定できるようにします。また、16進数のUnicodeで出力します。そのために、StringクラスのcharAt()メソッド(String#charAt())、IntegerクラスのtoHexString()メソッド(Integer#toHexString())をAPIドキュメントを使って調べてください。("CodePrint02.java")
      1. public class CodePrint02 {
      2. public static void main(String[] args) {
      3. char c = ????????????? ;
      4. System.out.println("'" + c + "': " + ???????????????????? );
      5. }
      6. }

      □ 実行結果

      $ java CodePrint02 a
      'a': 61
      

    19. 単項演算子マイナス"-"を使用せずに、コマンドラインからの引数のネガティブを計算し、結果を画面に出力するアプリケーション"NegativeNumber.java"を作成し、実行してください。
      1. public class NegativeNumber {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. int nn = ????;
      5. System.out.print("Decimal: ");
      6. System.out.println("-(" + n + ") = " + nn);
      7. System.out.print("HexDecimal: ");
      8. System.out.println("-(" + Integer.toHexString(n) + ") = " + Integer.toHexString(nn));
      9. }
      10. }

      □ 実行結果

      $ java NegativeNumber 1234
      Decimal:    -(1234) = -1234
      HexDecimal: -(4d2) = fffffb2e    
      

    20. (オプション)
      APIドキュメントを参照して、2進数による表示結果も出力してください。
    21. コマンドラインから指定された1文字を暗号化して、そのビット列を画面に出力するアプリケーション"Encoding01.java"を作成し、実行してください。ここで、暗号化はcharの下位2ビットをビット反転することで実現します。
      1. public class Encoding01 {
      2. public static void main(String[] args) {
      3. int a = args[0].charAt(0);
      4. int key = 0x3;
      5. int b = ?????? ;
      6. System.out.println((char)a + "(" + Integer.toBinaryString(a)
      7. + ") encode to: "
      8. + (char)b + "(" + Integer.toBinaryString(b) + ")");
      9. }
      10. }

      □ 実行結果

      $ java  Encoding01 a
      a(1100001) encode to: b(1100010)
      

      if 文

    22. コマンドラインから入力した 3 つの整数のうち、最小値を表示するアプリケーション"Min01.java"を作成してください。
      1. public class Min01 {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]);
      4. int b = Integer.parseInt(args[1]);
      5. int c = Integer.parseInt(args[2]);
      6. int min = a;
      7. // ここにコードを記述してください。
      8. System.out.println(a + ", " + b + ", " + c + " の最小値は " + min);
      9. }
      10. }

      □ 実行結果

      $ java Min01 1 2 3
      1, 2, 3 の最小値は 1
      

    23. コマンドラインから入力した3つの整数のうち、最小値と最大値を表示するアプリケーション"MinMax.java"を作成してください。
      1. public class MinMax {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]);
      4. int b = Integer.parseInt(args[1]);
      5. int c = Integer.parseInt(args[2]);
      6. int min = a;
      7. int max = a;
      8. // ここにコードを記述してください。
      9. System.out.println(a + ", " + b + ", " + c + " の最小値は " + min);
      10. System.out.println(a + ", " + b + ", " + c + " の最大値は " + max);
      11. }
      12. }

      □ 実行結果

      $ java MinMax 1 2 3
      1, 2, 3 の最小値は 1
      1, 2, 3 の最大値は 3
      
    24. コマンドラインから入力した2つの整数を、小さい順に表示するアプリケーション"Exchange02.java"を作成、実行してください。このとき、入力された値はプログラムの中で変更してもかまいません。
      1. public class Exchange02 {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]); // コマンドラインからの引数をint型に変換します。
      4. int b = Integer.parseInt(args[1]); // コマンドラインからの引数をint型に変換します。
      5. // ここにコードを記述してください。
      6. System.out.println("小さい順に表示: " + a + ", " + b);
      7. }
      8. }

      □ 実行結果

      $ java Exchange02 2 5
      小さい順に表示: 2, 5
      
      $ java Exchange02 2 -5
      小さい順に表示: -5, 2
      
    25. コマンドラインから入力した整数が奇数か偶数かを判定してメッセージを出すアプリケーション"EvenOdd02.java"を作成してください。
      1. public class EvenOdd02 {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java EvenOdd02 10
      10は偶数です。
      
      $ java EvenOdd02 11
      11は奇数です。
      
    26. コマンドラインから入力した整数が0から100の範囲に入っているか否かを表示するアプリケーション"Range11.java"を作成してください。
      1. public class Range11 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java Range11 50
      50は範囲内です
      
      $ java Range11 -1
      -1は範囲外です
      
      $ java Range11 101
      101は範囲外です
      
    27. 上記"Range11.java"を改良して、コマンドラインから入力した整数の値によって、つぎのメッセージをプリントするアプリケーション"Range12.java"を作成してください。
      1. public class Range12 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java Range12 50
      少し、がんばりましょう。
      
      $ java Range12 -1
      -1は範囲外です
      

    28. (オプション)
      コマンドライン引数から体重(kg)と身長(m)を指定し、BMI を計算し表示するアプリケーション"Bmi01.java"を、BMI の値により、以下のメッセージを表示するように改良してください。("Bmi03.java")
      • 18.5 未満 ... "やせ"
      • 18.5 - 25 未満 ... 標準"
      • 25 - 30 未満 ... 肥満"
      • 30 以上 ... "高度肥満"
      1. public class Bmi03 {
      2. public static void main(String[] args) {
      3. double weight = Double.parseDouble(args[0]);
      4. double hight = Double.parseDouble(args[1]);
      5. //
      6. // ここにコードを記述してください。
      7. //
      8. }
      9. }

      □ 実行結果

      $ java Bmi03 60 1.7
      BMI = 20.761245674740486 判定は 標準
      
    29. コマンドラインから入力した月の日数を出力するアプリケーション"Days00.java"を作成してください。
      1. public class Days00 {
      2. public static void main(String[] args) {
      3. int month = Integer.parseInt(args[0]);
      4. int days;
      5. // ここにコードを記述してください。
      6. System.out.println(month + " 月は " + days + " 日です。");
      7. }
      8. }

      □ 実行結果

      $ java Days00 2
      2 月は 28 日です。
      
    30. じゃんけんゲームをするアプリケーション"Janken10.java"を作成してください。ゲームは、コマンドラインからグー(0)、チョキ(1)、パー(2)のいずれかを入力します。
      1. public class Janken10 {
      2. public static void main(String[] args) {
      3. int user = Integer.parseInt(args[0]); // コマンドラインからの引数をint型に変換します。
      4. int computer = (int)(Math.random() * 3); // コンピューターの手
      5. // ここにコードを記述してください。
      6. System.out.print("あなた: " + user + ", コンピューター: " + computer);
      7. }
      8. }

      □ 実行結果

      $ java Janken10 0
      あなた: 0, コンピューター: 1 あなたの勝ちです。
      
    31. コマンドラインから入力した西暦年がうるう年か否かを判定するアプリケーション"LeapYear01.java"を作成してください。
      なお、複数のif文を使用してかまいません。 西暦年がつぎの条件を満たす場合、うるう年になります。
      • 4で割り切れる年はうるう年
      • ただし、100で割り切れる年はうるう年でない
      • さらに、400で割り切れる年はうるう年
      テストにはつぎの年を使用してください。
      • 2000 うるう年
      • 2002
      • 2004 うるう年
      • 2100
      1. public class LeapYear01 {
      2. public static void main(String[] args) {
      3. int year = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java LeapYear01 2004
      2004年はうるう年です。
      
    32. (オプション)
      上記アプリケーションで、論理演算子を使用してひとつのif文で判定できるように改造("LeapYear02.java")してください。

    33. switch 文

    34. コマンドラインから入力した 3 つの異なる数字が、アプリケーション内で設定されている 3 つの異なる数字といくつあっているかどうかを判定するアプリケーション"Match01.java"を作成してください。このとき、合っている数によって、つぎのようにメッセージを変えてください。
      1. public class Match01 {
      2. public static void main(String[] args) {
      3. int a0 = 3;
      4. int a1 = 5;
      5. int a2 = 8;
      6. int n0 = Integer.parseInt(args[0]);
      7. int n1 = Integer.parseInt(args[1]);
      8. int n2 = Integer.parseInt(args[2]);
      9. // ここにコードを記述してください。
      10. }
      11. }

      □ 実行結果

      $ java Match01 8 4 6
      やっと合いましたね。
      
    35. (オプション)
      上記アプリケーション"Match01.java"で、引数をつぎの項目について検査してください。("Match02.java")
      • 引数の個数が3つ
      • 各引数の範囲が0以上9以下
      • すべてことなる値
      1. public class Match02 {
      2. public static void main(String[] args) {
      3. // ここにコードを記述してください。
      4. int a0 = 3;
      5. int a1 = 5;
      6. int a2 = 8;
      7. int n0 = Integer.parseInt(args[0]);
      8. int n1 = Integer.parseInt(args[1]);
      9. int n2 = Integer.parseInt(args[2]);
      10. // ここにコードを記述してください。
      11. }
      12. }
      • 実行結果(引数エラーの場合のみ)
      $ java Match02
      引数は3個指定してください。
      
      $ java Match02 1 2 34
      34 は範囲外です。
      
      $ java Match02 1 2 2
      同じ数が指定されています。
      

      for 文

    36. コマンドラインから入力した数値の数だけ、星印(*)を横に並べるアプリケーション"StarPrint01.java"を作成してください。
      1. public class StarPrint01 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. System.out.println();
      6. }
      7. }

      □ 実行結果

      $ java StarPrint01 4
      ****
      
    37. コマンドラインから入力した数値の段の九九を表示するアプリケーション"Kuku01.java"を作成してください。
      1. public class Kuku01 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. System.out.println();
      6. }
      7. }

      □ 実行結果

      $ java Kuku01 4
      4 8 12 16 20 24 28 32 36
      
    38. 1+2+3+...のように、順に加算していき、コマンドラインで指定した数を超えたときの合計と、最後に加算した数を画面出力するアプリケーション"Sum01.java"を作成してください。
      1. public class Sum01 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. int s = 0;
      5. // ここにコードを記述してください。
      6. }
      7. }

      □ 実行結果

      $ java Sum01 1000
      合計 = 1035, 最後に加算した数 = 45
      
    39. コマンドラインから入力した数値を超えるまで、1から等比が2の等比級数を表示するアプリケーション"Progression01.java"を作成してください。
      1. public class Progression01 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. System.out.println();
      6. }
      7. }

      □ 実行結果

      $ java Progression01 1000
      1 2 4 8 16 32 64 128 256 512
      
    40. コマンドラインから入力した数値の数だけ、星印(*)を正方形に並べるアプリケーション"StarPrint02.java"を作成してください。
    41. □ 実行結果

      $ java StarPrint02 4
      ****
      ****
      ****
      ****
      
    42. 下の実行結果を参考にして、アプリケーションを改造("StarPrint03.java")してください。
    43. □ 実行結果

      $ java StarPrint03 4
      *
      **
      ***
      ****
      
    44. (オプション)
      さらに、下の実行結果を参考にして、アプリケーションを改造("StarPrint04.java")してください。
    45. □ 実行結果

      $ java StarPrint04 4
      ****
      ***
      **
      *
      
    46. 九九の表を表示するアプリケーション"Kuku02.java"を作成してください。
      1. public class Kuku02 {
      2. public static void main(String[] args) {
      3. // ここにコードを記述してください。
      4. }
      5. }

      □ 実行結果

      $ java Kuku02
      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
      
    47. コマンドラインから指定した数値の2のべき乗を求めるアプリケーション"Power01.java"を作成してください。なお、計算結果は、double型に収まる範囲内とします。
      1. public class Power01 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. double s = 1;
      5. // ここにコードを記述してください。
      6. System.out.println("s = " + s);
      7. }
      8. }

      □ 実行結果

      $ java Power01 10
      s = 1024.0
      
      $ java Power01 100
      s = 1.2676506002282294E30
      
    48. コマンドラインから指定したけた数分の9を2乗した数を求めるアプリケーション"All9.java"を作成してください。なお、計算結果は、long型に収まる範囲内とします。
      1. public class All9 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. long r = 1;
      5. // ここにコードを記述してください。
      6. System.out.println(r + " * " + r + " = " + r * r);
      7. }
      8. }

      □ 実行結果

      $ java All9 2
      99 * 99 = 9801
      
    49. コマンドラインから指定したけた数分の1を2乗した数を求めるアプリケーション"All1.java"を作成してください。なお、計算結果は、long型に収まる範囲内とします。
      1. public class All1 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. long r = 1;
      5. // ここにコードを記述してください。
      6. System.out.println(r + " * " + r + " = " + r * r);
      7. }
      8. }

      □ 実行結果

      $ java All1 4
      1111 * 1111 = 1234321
      
    50. コマンドラインから入力した数値が素数か否かを判定するアプリケーション"IsPrimeNumber.java"を作成してください。
      ただし、メッセージは素数でない場合のみの出力でかまいません。
      1. public class IsPrimeNumber {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java IsPrimeNumber 7 <-- 素数の場合、
                  <-- 何も出力されない。
      
      $ java IsPrimeNumber 8   <-- 素数でない場合、
      8 is not a prime number.  <-- メッセージが出力される。
      
    51. (オプション)
      上記アプリケーションで、素数の場合にも、メッセージが出力されるように改造("IsPrimeNumber2.java")してください。


    52. コマンドラインから2つの文字を指定し、最初の文字から2つ目の文字までのUnicodeをプリントするアプリケーション"CodePrint03.java"を作成してください。
      1. public class CodePrint03 {
      2. public static void main(String[] args) {
      3. // ここにコードを記述してください。
      4. for ( /* ここにコードを記述してください。*/ ) {
      5. System.out.println("'" + (char)i + "': " + Integer.toHexString(i));
      6. }
      7. }
      8. }

      □ 実行結果

      $ java CodePrint03 あ お
      'あ': 3042
      'ぃ': 3043
      'い': 3044
      'ぅ': 3045
      'う': 3046
      'ぇ': 3047
      'え': 3048
      'ぉ': 3049
      'お': 304a
      
    53. コマンドラインから2つの文字を指定し、最初の文字から2つ目の文字までの暗号化された文字をプリントするアプリケーション"Encoding02.java"を作成してください。ここで、暗号化はcharの下位2ビットをビット反転することで実現します。
      1. public class Encoding02 {
      2. public static void main(String[] args) {
      3. int a0 = args[0].charAt(0);
      4. int a1 = args[1].charAt(0);
      5. int key = 0x3;
      6. // ここにコードを記述してください。
      7. System.out.println((char)i + "(" + Integer.toBinaryString(i)
      8. + ") encode to: "
      9. + (char)b + "(" + Integer.toBinaryString(b) + ")");
      10. }
      11. }
      12. }

      □ 実行結果

      $ java  Encoding02 0 9
      0(110000) encode to: 3(110011)
      1(110001) encode to: 2(110010)
      2(110010) encode to: 1(110001)
      3(110011) encode to: 0(110000)
      4(110100) encode to: 7(110111)
      5(110101) encode to: 6(110110)
      6(110110) encode to: 5(110101)
      7(110111) encode to: 4(110100)
      8(111000) encode to: ;(111011)
      9(111001) encode to: :(111010)
      
    54. モンテカルロ法を用いて円周率πの値を求めるアプリケーション"MonteCarlo.java"を作成してください。なお、乱数の生成回数はコマンドラインから指定します。
      1. public class MonteCarlo {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. double x, y;
      5. double pi;
      6. int c = 0;
      7. // ここにコードを記述してください。
      8. pi = 4d * c / n;
      9. System.out.println("pi = " + pi);
      10. }
      11. }
      $ java MonteCarlo 1000
      pi = 3.184
      
      $ java MonteCarlo 10000
      pi = 3.1308
      
    55. 下の実行結果を参考にして、アプリケーション"StarPrint02.java"を改造("StarPrint05.java")してください。
    56. □ 実行結果

      $ java StarPrint05 4
      ****
       ***
        **
         *
      
    57. さらに、下の実行結果を参考にして、アプリケーション"StarPrint02.java"を改造("StarPrint06.java")してください。
    58. □ 実行結果

      $ java StarPrint06 4
         *
        **
       ***
      ****
      
    59. (オプション)
      さらに、下の実行結果を参考にして、アプリケーションを改造("StarPrint07.java")してください。
    60. □ 実行結果

      $ java StarPrint07 4
         **
        ****
       ******
      ********
       ******
        ****
         **
      
    61. 九九の表を画面出力するアプリケーション"Kuku02.java"の出力を、下記の実行結果のようになるようにしてください。("Kuku03.java")
    62. □ 実行結果

      $ java Kuku03
        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
      
    63. 0から999までの数字を画面出力するアプリケーション"For12.java"を作成してください。ただし、1行に出力する数値の数は、コマンドラインから指定するようにしてください。
      1. public class For12 {
      2. public static void main(String[] args) {
      3. int s = Integer.parseInt(args[0]);
      4. for (// ここにコードを記述してください。) {
      5. for (// ここにコードを記述してください。) {
      6. System.out.print(j + " ");
      7. }
      8. System.out.println();
      9. }
      10. }
      11. }

      □ 実行結果

      $ java For12 18
      0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
      36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
      54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
      72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
      90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
      108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
      126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
        : (中略)
      972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989
      990 991 992 993 994 995 996 997 998 999
      

    64. 上記アプリケーション"For12.java"で、2 重 for ループを使う条件を外して作成してください。("For121.java")
      1. public class For121 {
      2. public static void main(String[] args) {
      3. int s = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java For121 18
      0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
      36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
      54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
      72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
      90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
      108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
      126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
        : (中略)
      972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989
      990 991 992 993 994 995 996 997 998 999
      

      while 文

    65. コマンドラインから入力した数値の2つの整数の最大公約数を求めるアプリケーション"GCD01.java"を作成してください。
      1. public class GCD01 {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]);
      4. int b = Integer.parseInt(args[1]);
      5. int r;
      6. while ( /* ここにコードを記述してください。*/ ) {
      7. // ここにコードを記述してください。
      8. }
      9. System.out.println(args[0] + " と " + args[1] + " の最大公約数は, " + b + " です。" );
      10. }
      11. }

      □ 実行結果

      $ java GCD01 12 32
      12 と 32 の最大公約数は, 4 です。
      
    66. アプリケーション"kuku01.java"を、while文を使って作成してください。("kuku011.java")

    67. コマンドラインから指定した値までのフィボナッチ数列を表示するアプリケーション"Fibonacci01.java"を作成してください。なお、フィボナッチ数列は、つぎの性質を満たす数列です。
      1. public class Fibonacci01 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. int f = 1;
      5. int g = 1;
      6. int h = 0;
      7. System.out.print(f + " " + g + " ");
      8. // ここにコードを記述してください。
      9. System.out.println();
      10. }
      11. }

      □ 実行結果

      $ java Fibonacci01 1000
      1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
      

      break 文 / continue 文

    68. 九九の表を画面出力するアプリケーション"Kuku02.java"の出力を、コマンドラインから指定した数値までの出力になるようにしてください。("Kuku04.java")
    69. □ 実行結果

      $ java Kuku04 30
      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
      5 10 15 20 25 30
      6 12 18 24 30
      7 14 21 28
      8 16 24
      9 18 27
      
    70. 九九の表を画面出力するアプリケーション"Kuku02.java"の出力を、コマンドラインから指定した数値以上の出力になるようにしてください。("Kuku05.java")
      このとき、表示する数値は、左詰でかまいません。
    71. □ 実行結果

      $ java Kuku05 30
      
                           (空白行が出ます)
      
      32 36
      30 35 40 45
      30 36 42 48 54
      35 42 49 56 63
      32 40 48 56 64 72
      36 45 54 63 72 81
      
    72. コマンドラインの第1引数の文字列中に、第2引数の文字が何文字目にあるかを出力するアプリケーション"Search01.java"を作成してください。なお、何文字目かは最初に一致した文字の位置でかまいません。また、文字がない場合は、なにも出力する必要はありません。
      StringクラスのcharAt(int index)メソッドは、ゼロ相対で指定されたインデックス位置にある文字を返します。
      また、文字列の長さを戻すには、Stringクラスのlength()メソッドを使います。
      1. public class Search01 {
      2. public static void main(String[] args) {
      3. char c = args[1].charAt(0); // コマンドラインの第2引数の1文字目を取得
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java Search01 "Hello World" l
      'l' は 'Hello World' の 3 番目の文字です。
      
    73. "Search01.java"を改良して、すべての一致する文字の位置を出力するアプリケーション"Search02.java"を作成してください。
      1. public class Search02 {
      2. public static void main(String[] args) {
      3. char c = args[1].charAt(0); // コマンドラインの第2引数の1文字目を取得
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java Search02 "Hello World" l
      'l' は 'Hello World' の 3 番目の文字です。
      'l' は 'Hello World' の 4 番目の文字です。
      'l' は 'Hello World' の 10 番目の文字です。
      
    74. (オプション)
      "Search02.java"を改良して、一致する回数が第3引数で指定した数値と一致する文字の位置を出力するアプリケーション"Search03.java"を作成してください。
      1. public class Search03 {
      2. public static void main(String[] args) {
      3. char c = args[1].charAt(0); // コマンドラインの第2引数の1文字目を取得
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java Search03 "Hello World" l 2
      'l' は 'Hello World' の 4 番目の文字です。
      

      基本データ型の配列

    75. コマンドラインから入力した月の日数を出力するアプリケーション"Days00.java"を、配列を使用して作成してください。("Days10.java") (注) この問題は例題からとっています。
      1. public class Days10 {
      2. public static void main(String[] args) {
      3. int month = Integer.parseInt(args[0]); // コマンドラインからの引数をint型に変換します。
      4. // 月 1 2 3 4 5 6 7 8 9 10 11 12
      5. int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 日数
      6. // 索引 0 1 2 3 4 5 6 7 8 9 10 11
      7. System.out.println(month + " 月は " + days[month - 1] + " 日です。");
      8. }
      9. }

      □ 実行結果

      $ java Days10 2
      2 月は 28 日です。
      
    76. つぎのアプリケーション"Array71.java"をコンパイル・実行してください。
      1. public class Array71 {
      2. public static void main(String[] args) {
      3. int[] a = new int[4];
      4. a[0] = 100;
      5. a[1] = -100;
      6. a[2] = 0;
      7. a[3] = 0xffff;
      8. System.out.println(ArrayUtil.toString(a));
      9. }
      10. }

      □ 実行結果

      $java Array71
      [100, -100, 0, 65535]
      
    77. 上記アプリケーション"Array71.java"で、要素の値を配列初期化子を利用して設定するアプリケーション"Array72.java"です。
      1. public class Array72 {
      2. public static void main(String[] args) {
      3. int[] a = {100, -100, 0, 0xffff};
      4. System.out.println(ArrayUtil.toString(a));
      5. }
      6. }

      □ 実行結果

      $java Array72
      [100, -100, 0, 65535]
      

    78. 配列の要素の合計を表示するアプリケーション"Sum11.java"を作成・実行してください。
      1. public class Sum11 {
      2. public static void main(String[] args) {
      3. int[] a = {100, -100, 0, 0xff, -077};
      4. // ここにコードを記述してください。
      5. System.out.println("a[] = " + ArrayUtil.toString(a));
      6. System.out.println("sum = " + sum);
      7. }
      8. }

      □ 実行結果

      $ java Sum11
      a[] = [100, -100, 0, 255, -63]
      sum = 192
      

    79. 配列(要素数 > 0)の要素の最小値と最大値を表示するアプリケーション"MinMax11.java"を作成・実行してください。
      1. public class MinMax11 {
      2. public static void main(String[] args) {
      3. int[] a = {100, -100, 0, 0xff, -077};
      4. // ここにコードを記述してください。
      5. System.out.println("a[] = " + ArrayUtil.toString(a));
      6. System.out.println("min = " + min + ", max = " + max);
      7. }
      8. }

      □ 実行結果

      $ java MinMax11
      a[] = [100, -100, 0, 255, -63]
      min = -100, max = 255
      

    80. (オプション)
      配列の要素の最小値と最大値を表示するアプリケーション"MinMax12.java"を作成・実行してください。このとき、配列の要素数が 0 のときは、最小値は Integer.MAX_VALUE(2147483647), 最大値は Integer.MIN_VALUE(-2147483648) になるようにしてください。
      1. public class MinMax12 {
      2. public static void main(String[] args) {
      3. int[] a = new int[0];
      4. // ここにコードを記述してください。
      5. System.out.println("a[] = " + ArrayUtil.toString(a));
      6. System.out.println("min = " + min + ", max = " + max);
      7. }
      8. }

      □ 実行結果

      $ java MinMax12
      a[] = []
      min = 2147483647, max = -2147483648
      
      a[] = [100]
      min = 100, max = 100
      
      a[] = [100, -100, 0, 255, -63]
      min = -100, max = 255
      
    81. 10個の要素を持つint型配列を宣言・作成し、その各要素に添え字と同じ値を設定するアプリケーション"Array53.java"を作成してください。
      なお、配列の確認には、上記のユーティリティ・クラス"ArrayUtil.java"を使用します。
      1. public class Array53 {
      2. public static void main(String[] args) {
      3. int[] a = new int[10];
      4. for (int i = 0; i < a.length; i++) {
      5. a[i] = i; // 配列要素に値を設定
      6. }
      7. System.out.println(ArrayUtil.toString(a));
      8. }
      9. }

      □ 実行結果

      $java Array53
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      
    82. コマンドラインのから指定した引数の数と、値をすべて表示するアプリケーション"ArgsPrint01.java"を作成してください。
      1. public class ArgsPrint01 {
      2. public static void main(String[] args) {
      3. System.out.println("args.length = " + args.length);
      4. for (int i = 0; i < args.length; i++) {
      5. System.out.println(i + " : " + args[i]);
      6. }
      7. }
      8. }

      □ 実行結果

      $ java ArgsPrint01
      args.length = 0
      
      $ java ArgsPrint01 Hello Java World
      args.length = 3
      0 : Hello
      1 : Java
      2 : World
      
      $ java ArgsPrint01 "Hello Java World"
      args.length = 1
      0 : Hello Java World
      
    83. 10個の要素からなる配列aに対し、つぎのことを行うアプリケーション"Array31.java"を作成してください。
      1. 要素の正順に配列bにコピーします。
      2. 要素の逆順に配列cにコピーします。
      3. aの要素を逆にします。このとき、作業用の変数をひとつ使用してもかまいません。
      4. aの要素を2つずらします。このとき、要素数が2つの配列は作業用として使用してもかまいません。
      5. (オプション)さらにaの要素を2つずらす。このとき、作業用の変数をひとつ使用してもかまいません。
      なお、配列の確認には、上記のユーティリティ・クラス"ArrayUtil.java"を使用します。
      1. public class Array31 {
      2. public static void main(String[] args) {
      3. int[] a = new int[10];
      4. for (int i = 0; i < a.length; i++) {
      5. a[i] = i;
      6. }
      7. System.out.println("a[] = " + ArrayUtil.toString(a));
      8. System.out.println();
      9. // 要素の正順に配列bにコピーする。
      10. int[] b = new int[a.length];
      11. // コードを記述してください。
      12. // 要素の逆順に配列cにコピーする。
      13. int[] c = new int[a.length];
      14. // コードを記述してください。
      15. // 要素を逆にする。
      16. int w;
      17. // コードを記述してください。
      18. // 要素を2つずらす。このとき、要素数が2つの配列は作業用として使用してもよい。
      19. int[] t = new int[2];
      20. // コードを記述してください。
      21. // a, b, cのプリント
      22. System.out.println("** a, b, cのプリント **");
      23. System.out.println("a[] = " + ArrayUtil.toString(a));
      24. System.out.println("b[] = " + ArrayUtil.toString(b));
      25. System.out.println("c[] = " + ArrayUtil.toString(c));
      26. System.out.println();
      27. // さらに要素を2つずらす。このとき、作業用の変数をひとつ使用してもよい。
      28. int u;
      29. // コードを記述してください。
      30. System.out.println("** 要素ずれのプリント **");
      31. System.out.println("a[] = " + ArrayUtil.toString(a));
      32. }
      33. }

      □ 実行結果

      $java Array31
      a[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      
      ** a, b, cのプリント **
      a[] = [7, 6, 5, 4, 3, 2, 1, 0, 9, 8]
      b[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      c[] = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      
      ** 要素ずれのプリント **
      a[] = [5, 4, 3, 2, 1, 0, 9, 8, 7, 6]
      

    84. 線形探索
      コマンドラインから入れた整数が、アプリケーション中のint型配列の要素(10,20,30,40,50の5つ)と一致しているか否かを検査し、一致する場合はそのときの添字をプリントするアプリケーション"SequentialSearch.java"を作成してください。ただし、配列の要素は昇順に並んでいるとは限りません。
      1. public class SequentialSearch {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. int[] a = {50, 30, 40, 10, 20};
      5. int i = search(a, n);
      6. if (i >= 0) {
      7. System.out.println(n + " was found.(index = " + i + ")");
      8. } else {
      9. System.out.println(n + " was not found.");
      10. }
      11. }
      12. public static int search(int[] a, int n) {
      13. for (int i = 0; i < a.length; i++) {
      14. //
      15. // ここにコードを記述してください。
      16. //
      17. }
      18. return -1;
      19. }
      20. }

      □ 実行結果

      $java SequentialSearch 50
      50 was found.(index = 0)
      
      $java SequentialSearch 51
      51 was not found.
      

    85. 2分探索
      コマンドラインから入れた整数が、アプリケーション中のint型配列の要素(10,20,30,40,50の5つ)と一致しているか否かを検査し、一致する場合はそのときの添字をプリントするアプリケーション"BinarySearch.java"を作成してください。ただし、配列の要素は昇順に並んでいます。
      1. public class BinarySearch {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. int[] a = {10, 20, 30, 40, 50};
      5. int i = search(a, n);
      6. if (i >= 0) {
      7. System.out.println(n + " was found.(index = " + i + ")");
      8. } else {
      9. System.out.println(n + " was not found.");
      10. }
      11. }
      12. public static int search(int[] a, int n) {
      13. int l = 0;
      14. int h = a.length - 1;
      15. int m;
      16. while (/* ここにコードを記述してください。*/) {
      17. m = (l + h) / 2;
      18. if (a[m] < n) {
      19. l = m + 1;
      20. } else if (a[m] > n) {
      21. h = m - 1;
      22. } else {
      23. return m;
      24. }
      25. }
      26. return -1;
      27. }
      28. }

      □ 実行結果

      $java BinarySearch 50
      50 was found.(index = 4)
      
      $java BinarySearch 51
      51 was not found.
      

    86. コントロール・ブレーク
      配列の各要素の降順の順位をプリントするアプリケーション"Rank01.java"を作成してください。
      1. public class Rank01 {
      2. public static void main(String[] args) {
      3. int[] a = {5, 3, 6, 5, 8, 6, 9, 1, 3, 3};
      4. int[] rank = new int[a.length];
      5. for (int i = 0; i < a.length; i++) {
      6. rank[i] = 1;
      7. for (int j = 0; j < a.length; j++) {
      8. //
      9. // ここにコードを記述してください。
      10. //
      11. }
      12. }
      13. for (int i = 0; i < a.length; i++) {
      14. System.out.println(a[i] + " - " + rank[i]);
      15. }
      16. }
      17. }

      □ 実行結果

      $java Rank01
      5 - 5
      3 - 7
      6 - 3
      5 - 5
      8 - 2
      6 - 3
      9 - 1
      1 - 10
      3 - 7
      3 - 7
      

    87. コントロール・ブレーク
      昇順に並んでいるint配列aがあります。配列aの中の同じ要素の数をカウントするアプリケーション"Count01.java"を作成してください。
      1. public class Count01 {
      2. public static void main(String[] args) {
      3. int[] a = {2, 2, 3, 5, 5, 5, 7, 8, 8};
      4. int prevValue = a[0];
      5. int count = 0;
      6. for (int i = 0; i < a.length; i++) {
      7. if (prevValue == a[i]) {
      8. //
      9. // ここにコードを記述してください。
      10. //
      11. } else {
      12. System.out.println(prevValue + " : " + count);
      13. //
      14. // ここにコードを記述してください。
      15. //
      16. }
      17. }
      18. System.out.println(prevValue + " : " + count);
      19. }
      20. }

      □ 実行結果

      $java Count01
      2 : 2
      3 : 1
      5 : 3
      7 : 1
      8 : 2
      

    88. 併合
      昇順に並んでいる2つのint配列a,bがあります。配列aとbをまとめて、新しい配列cをつくるアプリケーション"Matching01.java"を作成してください。このとき、つぎのような条件を前提とします。
      1. public class Matching01 {
      2. public static void main(String[] args) {
      3. int[] a = {10, 20, 30, 40, 50, Integer.MAX_VALUE};
      4. int[] b = {15, 20, 30, 35, 50, 60, Integer.MAX_VALUE};
      5. System.out.println(ArrayUtil.toString(match(a, b)));
      6. }
      7. public static int[] match(int[] a, int[] b) {
      8. int[] c = new int[a.length + b.length];
      9. int i = 0, j = 0, k = 0;
      10. while (a[i] < Integer.MAX_VALUE || b[j] < Integer.MAX_VALUE) {
      11. if (a[i] < b[j]) {
      12. //
      13. // ここにコードを記述してください。
      14. //
      15. } else if (a[i] == b[j]) {
      16. //
      17. // ここにコードを記述してください。
      18. //
      19. } else {
      20. //
      21. // ここにコードを記述してください。
      22. //
      23. }
      24. }
      25. c[k] = Integer.MAX_VALUE;
      26. return c;
      27. }
      28. }

      □ 実行結果

      $java Matching01
      [10, 15, 20, 30, 35, 40, 50, 60, 2147483647, 0, 0, 0, 0]
      

    89. 整列
      コマンドラインから入れた整数を昇順に並べ替えるアプリケーション"Sort01.java"を作成してください。(解答例は選択ソートです)
      1. public class Sort01 {
      2. public static void main(String[] args) {
      3. int n = args.length;
      4. int[] a = new int[n];
      5. for (int i = 0; i < n; i++) {
      6. a[i] = Integer.parseInt(args[i]);
      7. }
      8. for (int i = 0; i < n - 1; i++) {
      9. for (int j = i + 1; j < n; j++) {
      10. //
      11. // ここにコードを記述してください。
      12. //
      13. }
      14. }
      15. System.out.println(ArrayUtil.toString(a));
      16. }
      17. }

      □ 実行結果

      $java Sort01 6 3 5 1
      [1, 3, 5, 6]
      
    90. (オプション)
      引数で指定された配列に、0以上・要素数未満の整数の乱数を設定して戻すメソッドgetRandomElement(int[])を、ユーティリティ・クラス"ArrayUtil.java"に作成してください。
      また、これを確認するアプリケーション"Array73.java"を作成・実行してください。
      乱数の設定には、Mathクラスのrandom()メソッドを利用します。このメソッドは、double型の0以上1未満の戻り値を返します。
      1. // 0703
      2. public class ArrayUtil {
      3. // 途中省略
      4. // 乱数設定
      5. public static int[] getRandomElement(int[] a) {
      6. // コードを記述してください。
      7. return a;
      8. }
      9. }
      1. public class Array73 {
      2. public static void main(String[] args) {
      3. int[] a = new int[Integer.parseInt(args[0])];
      4. System.out.println(ArrayUtil.toString(ArrayUtil.getRandomElement(a)));
      5. }
      6. }

      □ 実行結果

      $java Array73 10
      [3, 3, 0, 7, 5, 8, 9, 5, 7, 4]
      
    91. 九九の結果を2次元配列に設定して、その配列を表示するアプリケーション"kuku11.java"を作成してください。
      1. public class Kuku11 {
      2. public static void main(String[] args) {
      3. int[][] a = new int[9][9];
      4. // コードを記述してください。
      5. }
      6. }

      □ 実行結果

      $java Kuku11
      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
      
    92. 上記アプリケーション"kuku11.java"に対して、ArrayUtil#toString(int[])メソッドを利用するように改良してください。("Kuku12.java")
      1. public class Kuku12 {
      2. public static void main(String[] args) {
      3. int[][] a = new int[9][9];
      4. // コードを記述してください。
      5. }
      6. }

      □ 実行結果

      $java Kuku12
      [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]
      

    93. じゃんけんゲームをするアプリケーション"Janken10.java"を、2 次元配列を使うように改良します("Janken11.java")。ゲームは、コマンドラインからグー(0)、チョキ(1)、パー(2)のいずれかを入力します。
      1. public class Janken11 {
      2. public static void main(String[] args) {
      3. int user = Integer.parseInt(args[0]); // コマンドラインからの引数をint型に変換します。
      4. int computer = (int)(Math.random() * 3); // コンピューターの手
      5. String[] te = {"ぐー", "ちょき", "ぱー"};
      6. char[][] kekka = {{'分', '勝', '負'} // ぐー
      7. , {'負', '分', '勝'} // ちょき
      8. , {'勝', '負', '分'}}; // ぱー
      9. //コンピューター ぐー ちょき ぱー
      10. System.out.print("あなた: " + te[user] + ", コンピューター: " + te[computer]);
      11. System.out.println(" --> 結果: " + kekka[user][computer]);
      12. }
      13. }

      □ 実行結果

      $ java Janken11 0
      あなた: ぐー, コンピューター: ちょき --> 結果: 勝
      

    94. (オプション)
      2 次元配列を使ってじゃんけんゲームをするアプリケーション"Janken11.java"を、コマンドラインから実行結果のように複数の手(グー(0)、チョキ(1)、パー(2))を入れて、その結果を表示するアプリケーション"Janken12.java"としてください。
      1. public class Janken12 {
      2. public static void main(String[] args) {
      3. String[] te = {"ぐー", "ちょき", "ぱー"};
      4. char[][] kekka = {{'分', '勝', '負'} // ぐー
      5. , {'負', '分', '勝'} // ちょき
      6. , {'勝', '負', '分'}}; // ぱー
      7. //コンピューター ぐー ちょき ぱー
      8. int win = 0;
      9. int lose = 0;
      10. int draw = 0;
      11. for (int i = 0; i < args.length; i++) {
      12. // ここにコードを記述してください。
      13. }
      14. System.out.println(win + " 勝 " + lose + " 負 " + draw + " 分 ");
      15. }
      16. }

      □ 実行結果

      $ java Janken12 0 1 2 0 1 2
      あなた: ぐー, コンピューター: ぐー --> 結果: 分
      あなた: ちょき, コンピューター: ぱー --> 結果: 勝
      あなた: ぱー, コンピューター: ぱー --> 結果: 分
      あなた: ぐー, コンピューター: ちょき --> 結果: 勝
      あなた: ちょき, コンピューター: ぐー --> 結果: 負
      あなた: ぱー, コンピューター: ぐー --> 結果: 勝
      3 勝 1 負 2 分
      
    95. コマンドラインから入力した3つの数字(同じ数字でも可)が、アプリケーション内で設定されている3つの数字といくつあっているかどうかを判定するアプリケーション"Match03.java"を作成してください。このとき、合っている数によって、つぎのようにメッセージを変えてください。
    96. また、ソース中で使用している"ArrayUtil.java"クラスのsort()メソッドは、前の実習問題で組み込んでいます。
      1. public class Match03 {
      2. public static void main(String[] args) {
      3. int[] a = {(int)(Math.random() * 10), (int)(Math.random() * 10), (int)(Math.random() * 10)};
      4. int[] n = {Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])};
      5. int s = 0;
      6. System.out.println("コンピューターの数字 = " + ArrayUtil.toString(ArrayUtil.sort(a)));
      7. System.out.println(" あなたの数字 = " + ArrayUtil.toString(ArrayUtil.sort(n)));
      8. // ここにコードを記述してください。
      9. switch (s) {
      10. case 0:
      11. System.out.println("まったく違います。");
      12. break;
      13. case 1:
      14. System.out.println("やっと合いましたね。");
      15. break;
      16. case 2:
      17. System.out.println("もう少しです。");
      18. break;
      19. default:
      20. System.out.println("おめでとうございます。");
      21. break;
      22. }
      23. }
      24. }

      □ 実行結果

      $ java Match03 2 4 4
      コンピューターの数字 = [4, 5, 7]
              あなたの数字 = [2, 4, 4]
      やっと合いましたね。
      
      $ java Match03 2 4 4
      コンピューターの数字 = [1, 1, 7]
              あなたの数字 = [2, 4, 4]
      まったく違います。
      
    97. 乱数を利用して、模擬的に囲碁の結果をプリントするアプリケーション"Igo01.java"を作成してください。なお、乱数の計算には、java.lang.MathクラスのMath#random()メソッドを利用することができます。
      このとき、char型の2次元配列を下記の実行結果のようにプリントするメソッドArrayUtil#printArray(char[][])を"ArrayUtil.java"クラスに作り、それを利用してください。
      1. public class Igo01 {
      2. public static void main(String[] args) {
      3. int n = 19;
      4. char[][] ban = new char[n][n];
      5. char[] ishi = {'\u3000'/*日本語の空白文字*/, '●', '○'};
      6. // コードを記述してください。
      7. ArrayUtil.printArray(ban);
      8. }
      9. }
      1. // 0712
      2. public class ArrayUtil {
      3. :
      4. static void printArray(char[][] a) {
      5. // コードを記述してください。
      6. }
      7. }

      □ 実行結果

      $java Igo01
           ● ◯ ●   ◯     ● ●   ◯ ●   ● ●   ●
       ● ◯ ● ◯ ◯ ● ◯   ● ◯     ●       ●   ●
         ◯ ● ●   ◯ ● ●   ◯ ◯     ◯   ◯ ◯    
         ◯ ◯ ● ◯ ◯ ◯ ● ◯ ●   ◯ ◯ ◯ ◯ ◯ ◯ ●  
       ◯     ● ◯   ◯ ● ● ◯ ●   ◯ ◯   ●   ●  
       ● ● ◯ ● ◯ ◯ ●     ● ● ◯ ◯ ◯   ● ◯ ●  
         ◯ ● ● ◯     ◯ ●   ◯   ◯     ● ●   ◯
       ◯ ◯ ◯     ◯ ●   ●   ● ◯     ● ◯   ● ●
         ● ◯ ● ●   ●   ●   ◯ ◯     ● ◯ ●   ◯
           ◯ ●       ◯ ◯   ◯ ◯ ● ◯   ◯ ◯ ● ●
         ● ● ◯ ● ●   ◯         ◯ ●     ◯   ◯
       ● ● ● ● ◯ ◯ ◯ ● ●   ● ◯ ● ◯ ●   ◯ ●  
         ◯ ● ◯   ◯ ● ◯ ◯ ◯ ◯ ●           ●  
             ◯ ● ◯   ●     ● ◯   ◯   ● ●    
       ● ● ● ● ● ◯ ◯ ● ●         ◯ ◯     ◯ ●
       ◯ ● ◯ ●   ◯ ◯ ◯ ◯ ◯ ◯   ◯ ● ● ◯   ● ●
             ●   ● ◯ ●   ● ◯   ◯   ◯ ●   ◯  
       ◯ ● ● ● ◯     ◯ ● ● ◯       ● ●   ●  
       ◯   ●   ◯ ◯     ●   ●   ●   ● ◯ ●   ●
      
    98. コマンドラインから平文(文字列)を指定し、それの暗号文をプリントするアプリケーション"Encoding03.java"を作成してください。ここで、暗号化はcharの下位2ビットをビット反転することで実現します。
      1. public class Encoding03 {
      2. public static void main(String[] args) {
      3. char[] a = args[0].toCharArray();
      4. int key = 0x3;
      5. // ここにコードを記述してください。
      6. System.out.println("'" + args[0] + "' encode to: '" + e + "'");
      7. }
      8. }

      □ 実行結果

      $ java Encoding03 "Hello World"
      'Hello World' encode to: 'Kfool#Tlqog'
      
    99. コマンドラインから逆ポーランド記法の式を指定し、その演算結果をプリントするアプリケーション"ReversePolishNotation.java"を作成してください。
      1. public class ReversePolishNotation {
      2. int[] stack = new int[2];
      3. int sp;
      4. public int calc(String str) {
      5. int d1, d2;
      6. String s;
      7. sp = 0;
      8. for (int i = 0; i < str.length(); i++) {
      9. switch (str.charAt(i)) {
      10. case '+':
      11. d1 = pop();
      12. d2 = pop();
      13. push(d2 + d1);
      14. break;
      15. // ここにコードを記述してください。
      16. default:
      17. push(Integer.parseInt(str.substring(i, i+1)));
      18. }
      19. }
      20. return pop();
      21. }
      22. private void push(int d) {
      23. stack[sp++] = d;
      24. }
      25. private int pop() {
      26. return stack[--sp];
      27. }
      28. public static void main(String[] args) {
      29. System.out.println("計算式 = " + args[0]);
      30. ReversePolishNotation rpn = new ReversePolishNotation();
      31. System.out.println("結果 = " + rpn.calc(args[0]));
      32. }
      33. }

      □ 実行結果

      $ java ReversePolishNotation 98+7%6*5/4-
      計算式 = 98+7%6*5/4-  <-- この式は、((((9+8)%7)*6)/5)-4 を意味します。
      結果 = -1
      
    100. エラトステネスのふるいを利用して、コマンドラインから指定された数までの素数をすべてプリントするアプリケーション"Eratosthenes.java"を作ってください。
      1. public class Eratosthenes {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. boolean[] prime = new boolean[n];
      5. for (int i = 0; i < n; i++) {
      6. prime[i] = true;
      7. }
      8. // ここにコードを記述してください。
      9. for (int i = 2; i < n; i++) {
      10. if (prime[i]) {
      11. System.out.print(" " + i);
      12. }
      13. }
      14. System.out.println();
      15. }
      16. }

      □ 実行結果

      $ java Eratosthenes 100
       2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
      
    101. コマンドラインから指定された5桁の数に対してチェック・ディジットをつける、または、6桁の数に対しては、正しい数かどうかを判定するアプリケーション"CheckDigit01.java"を作ってください。
      1. public class CheckDigit01 {
      2. final static int[] weight = {19, 17, 13, 11, 7, 1};
      3. final static int n = weight.length;
      4. public static void main(String[] args) {
      5. int[] digit = new int[n];
      6. int len = args[0].length();
      7. if (len != n - 1 && len != n) {
      8. System.out.println("5桁または6桁の数字を指定してください。");
      9. System.exit(1);
      10. }
      11. for (int i = 0; i < Math.min(n, len); i++) {
      12. digit[i] = Integer.parseInt(args[0].substring(i, i+1));
      13. }
      14. if (len == n - 1) {
      15. System.out.println("チェック・ディジットつきの数は "
      16. + setCheckDigit(digit) + " です。");
      17. } else if (isValidDigit(digit)) {
      18. System.out.println(args[0] + "は正しい数です。");
      19. } else {
      20. System.out.println(args[0] + "は正しくありません。");
      21. }
      22. }
      23. public static String setCheckDigit(int[] d) {
      24. // ここにコードを記述してください。
      25. return sb.toString();
      26. }
      27. public static boolean isValidDigit(int[] d) {
      28. // ここにコードを記述してください。
      29. return((s % 10) == 0);
      30. }
      31. }

      □ 実行結果

      $ java CheckDigit01 01234
      チェック・ディジットつきの数は 012346 です。
      
      $ java CheckDigit01 012346
      012346は正しい数です。
      
      $ java CheckDigit01 012345
      012345は正しくありません。
      

      クラスの定義

    102. つぎの本(Book)クラスを作成してください。(Book.java)  本(Book)クラスには、つぎのフィールドがあります。
      • 書名(title) String
      • 著作者名(author) String

      Book.java

      1. public class Book {
      2. // ここにコードを記述してください。
      3. }

      Book.javaクラスをテストするアプリケーションBookTest.java

      1. public class BookTest {
      2. public static void main(String[] args) {
      3. Book b1 = new Book();
      4. b1.title =args[0];
      5. b1.author = args[1];
      6. System.out.println(" Title:" + b1.title);
      7. System.out.println("Author:" + b1.author);
      8. }
      9. }

      □ 実行結果

      $ java BookTest JavaBook Maruno
       Title:JavaBook
      Author:Maruno
      

    103. コマンドライン引数をチェックするクラス"Args01.java"を一般化して、コマンドライン引数をチェックするメソッドisValid()を持つクラス"ArgsUtil.java"を作成してください。
      • クラス: "ArgsUtil.java"
      • static boolean isValid(int count, String[] args, String message)
        • 戻り値: OKのとき、true; NGのとき、false
        • count: 必要な引数の数
        • args: コマンドライン引数
        • message: NGのときのメッセージ(標準エラー出力"err" に出力)

      "ArgsUtil.java"

      1. public class ArgsUtil {
      2. public static boolean isValid(int count, String[] args, String message) {
      3. //
      4. // ここにコードを記述してください。
      5. //
      6. }
      7. }

      "ArgsTest.java"

      1. public class ArgsTest {
      2. public static void main(String[] args) {
      3. if (!ArgsUtil.isValid(1, args, "引数をひとつ指定してください。")) {
      4. System.exit(1); // アプリケーションを終了します
      5. }
      6. System.out.println("引数: " + args[0]);
      7. }
      8. }

      □ 実行結果

      $ java ArgsTest
      引数をひとつ指定してください。
      
      $ java ArgsTest Hello
      引数: Hello
      
      $ java ArgsTest Hello World
      引数をひとつ指定してください。
      
      $ java ArgsTest "Hello World"
      引数: Hello World
      
    104. コマンドラインから入力した数値の数だけ、星印(*)を横に並べるアプリケーション"StarPrint01.java"を改造し、int型の引数から数値の数だけ、星印(*)を並べた文字列を返すメソッド toStarString() をクラス("Graph.java")の中に作成してください。
      1. public class Graph {
      2. public static String getStars(int n) {
      3. //
      4. // ここにコードを記述してください。
      5. //
      6. }
      7. }
    105. 上記メソッド"TestGraph#toStarString()"を利用するアプリケーション"TestGraph.java"を作ってください。
      1. public class TestGraph {
      2. public static void main(String[] args) {
      3. System.out.println(Graph.toStarString(Integer.parseInt(args[0])));
      4. }
      5. }

      □ 実行結果

      $ java TestGraph 5
      *****
      
    106. 最大公約数を計算するアプリケーション"GCD.java"を改造し、2つの引数から最大公約数を計算してint型で戻すクラス("GCD.java")を作成してください。
      1. public class GCD {
      2. public static int getGCD(int a, int b) {
      3. int r;
      4. while ((r = a % b) != 0) {
      5. a = b;
      6. b = r;
      7. }
      8. // ここにコードを記述してください。
      9. }
      10. }
    107. 上記メソッド"GCD#getGCD()"を利用するアプリケーション"TestGCD.java"を作ってください。
      1. public class TestGCD {
      2. public static void main(String[] args) {
      3. System.out.println(args[0] + " と " + args[1] + " の最大公約数は, " +
      4. GCD.getGCD(Integer.parseInt(args[0]), Integer.parseInt(args[1])) + " です。" );
      5. }
      6. }

      □ 実行結果

      $ java TestGCD 12 32
      12 と 32 の最大公約数は, 4 です。
      
    108. 素数か否かを判定するアプリケーション"IsPrimeNumber.java"を改造し、引数が素数か否かを判定してboolean型で戻すメソッド isPrimeNumber() を持つクラス("PrimeNumber.java")を作成してください。
      1. public class PrimeNumber {
      2. public static boolean isPrimeNumber(int n) {
      3. //
      4. // ここにコードを記述してください。
      5. //
      6. return true;
      7. }
      8. }
    109. 上記メソッド"PrimeNumber#isPrimeNumber()"を利用するアプリケーション"TestPrimeNumber.java"を作ってください。
      1. public class TestPrimeNumber {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. if (PrimeNumber.isPrimeNumber(n)) {
      5. System.out.println(n + " is a prime number.");
      6. } else {
      7. System.out.println(n + " is not a prime number.");
      8. }
      9. }
      10. }

      □ 実行結果

      $ java TestPrimeNumber 7 <-- 素数の場合、
      7 is a prime number.
      
      $ java TestPrimeNumber 8 <-- 素数でない場合、
      8 is not a prime number.
      

    110. 上記メソッド"PrimeNumber#isPrimeNumber()"を利用して、コマンドラインから指定された数までの素数をすべてプリントするアプリケーション"PrimeNumber10.java"を作ってください。
      1. public class PrimeNumber10 {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. System.out.println();
      6. }
      7. }

      □ 実行結果

      $ java PrimeNumber10 100
      2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
      
    111. つぎの本(Book)クラスをカプセル化してください。(Book.java)  本(Book)クラスには、つぎのフィールドがあります。
      • 書名(title) String
      • 著作者名(author) String

      □ カプセル化前のBook.java

      1. public class Book {
      2. String title; // 書名
      3. String author; // 著作者
      4. }

      □ カプセル化後のBook.javaクラスをテストするアプリケーションBookTest.java

      1. public class BookTest {
      2. public static void main(String[] args) {
      3. Book b1 = new Book();
      4. b1.setTitle(args[0]);
      5. b1.setAuthor(args[1]);
      6. System.out.println(" Title:" + b1.getTitle());
      7. System.out.println("Author:" + b1.getAuthor());
      8. }
      9. }

      □ 実行結果

      $ java BookTest JavaBook Maruno
       Title:JavaBook
      Author:Maruno
      

    112. じゃんけんの手をあらわすJankenTeクラスを作成してください。 このクラスには、つぎのフィールドがあります。なお、カプセル化し、フィールド te には、0, 1, 2 しか入らないものとします。これ以外の値のときは、0 が指定されたものとします。
      • 手(te): int

      JankenTe.java

      1. public class JankenTe {
      2. // ここにコードを記述してください。
      3. }

      JankenTe.javaクラスをテストするアプリケーションJankenAppl.java

      1. public class JankenAppl {
      2. public static void main(String[] args) {
      3. JankenTe te = new JankenTe();
      4. te.setTe(Integer.parseInt(args[0]));
      5. System.out.println("手: " + te.getTe());
      6. }
      7. }

      □ 実行結果

      $ java JankenAppl 0
      手: 0
      
      $ java JankenAppl 1
      手: 1
      
      $ java JankenAppl 2
      手: 2
      
      $ java JankenAppl 3
      手: 0
      

    113. じゃんけんの手をあらわすJankenTeクラスを、日本語の "ぐー", "ちょき", "ぱー" も設定できるようにしたクラスJankenTeにしてください。

      JankenTe.java

      1. public class JankenTe {
      2. // ここにコードを記述してください。
      3. }

      JankenTe.javaクラスをテストするアプリケーションJankenAppl.java

      1. public class JankenAppl {
      2. public static void main(String[] args) {
      3. JankenTe te = new JankenTe();
      4. te.setTe(args[0]);
      5. System.out.println("手: " + te.getTe());
      6. }
      7. }

      □ 実行結果

      $ java JankenAppl ぐー
      手: 0
      
      $ java JankenAppl ちょき
      手: 1
      
      $ java JankenAppl ぱー
      手: 2
      
      $ java JankenAppl ちゃー
      手: 0
      
    114. つぎの四角形を処理するクラス"Shikaku.java"を作ります。コンストラクターはつぎのとおりです。なお、図形の座標の原点は左上にあるものとします。
      Shikaku(int x0, int y0, int x1, int y1) 左上の座標(x0, y0)と右下の座標(x1, y1)。デフォルトの名前は、"四角形"とします。
      Shikaku(String name, int x0, int y0, int x1, int y1) 四角形の名前と左上の座標(x0, y0)、右下の座標(x1, y1)

      このクラスには、四角形の周の長さを戻すメソッドlength()を作成してください。周の長さは、つぎの式によります。

         四角形  2 * (x1 - x0 + y1 - y0)
        

      "Shikaku.java"

      1. public class Shikaku {
      2. private int x0, y0; // 左上の頂点の座標
      3. private int x1, y1; // 左上の頂点の座標
      4. private int w, h; // 幅と高さ
      5. private String name; // 名前
      6. public Shikaku(String name, int x0, int y0, int x1, int y1) { // コンストラクター
      7. setName(name);
      8. this.x0 = x0;
      9. this.y0 = y0;
      10. this.x1 = x1;
      11. this.y1 = y1;
      12. w = Math.abs(x0 - x1);
      13. h = Math.abs(y0 - y1);
      14. }
      15. public Shikaku(int x0, int y0, int x1, int y1) { // コンストラクター
      16. this("四角形", x0, y0, x1, y1);
      17. }
      18. public String getName() { // 名前の取得
      19. return name;
      20. }
      21. public void setName(String name) { // 名前の設定
      22. this.name = name;
      23. }
      24. public double length() { // 周の長さ
      25. // ここにコードを記述してください。
      26. }
      27. }

      なお、これらをテストするアプリケーション"ZukeiTest01.java"は、以下のとおりです。

      "ZukeiTest01.java"

      1. public class ZukeiTest01 {
      2. public static void main(String[] args) {
      3. int x0 = Integer.parseInt(args[0]);
      4. int y0 = Integer.parseInt(args[1]);
      5. int x1 = Integer.parseInt(args[2]);
      6. int y1 = Integer.parseInt(args[3]);
      7. Shikaku s0 = new Shikaku(x0, y0, x1, y1);
      8. System.out.println(s0.getName() + " の周の長さ = " + (int)(s0.length()));
      9. Shikaku s1 = new Shikaku("しかく", x0, y0, x1, y1);
      10. System.out.println(s1.getName() + " の周の長さ = " + (int)(s1.length()));
      11. }
      12. }

      □ 実行結果

      $ java ZukeiTest01 0 0 100 100
      四角形 の周の長さ = 400
      しかく の周の長さ = 400
      

      コンストラクター

    115. コマンドライン引数をチェックするクラス"ArgsUtil.java"を改造し、コマンドラインで指定する数を範囲で指定できるようにしてください。
      • クラス: "ArgsUtil.java"
      • static boolean isValid(int lcount, int hcount, String[] args, String message)
        • 戻り値: OKのとき、true; NGのとき、false
        • lcount: 必要な引数の下限数
        • hcount: 必要な引数の上限数
        • args: コマンドライン引数
        • message: NGのときのメッセージ

      "ArgsUtil.java"

      1. public class ArgsUtil {
      2. public static boolean isValid(int count, String[] args, String message) {
      3. // ここにコードを記述してください。
      4. }
      5. public static boolean isValid(int lcount, int hcount, String[] args, String message) {
      6. if (args.length < lcount || args.length > hcount) {
      7. System.err.println(message);
      8. return false;
      9. }
      10. return true;
      11. }
      12. }

      "ArgsTest.java"

      1. public class ArgsTest {
      2. public static void main(String[] args) {
      3. System.out.println("args.length=1: " +
      4. ArgsUtil.isValid(1, args, "引数をひとつ指定してください。"));
      5. System.out.println("1<=args.length<=3: " +
      6. ArgsUtil.isValid(1, 3, args, "ひとつ以上3つ以下の引数を指定してください。"));
      7. for (int i = 0; i < args.length; i++) {
      8. System.out.println("引数: " + args[i]);
      9. }
      10. }
      11. }

      □ 実行結果

      $ java Args
      java ArgsTest
      引数をひとつ指定してください。
      args.length=1:     false
      ひとつ以上3つ以下の引数を指定してください。
      1<=args.length<=3: false
      
      $ java ArgsTest Hello
      args.length=1:     true
      1<=args.length<=3: true
      引数: Hello
      
      $ java ArgsTest Hello Java World
      引数をひとつ指定してください。
      args.length=1:     false
      1<=args.length<=3: true
      引数: Hello
      引数: Java
      引数: World
      
      $ java ArgsTest Hello Java Java World
      引数をひとつ指定してください。
      args.length=1:     false
      ひとつ以上3つ以下の引数を指定してください。
      1<=args.length<=3: false
      引数: Hello
      引数: Java
      引数: Java
      引数: World
      
    116. 作成したクラス"Graph.java"を利用して、下記のようなヒストグラムを横にプリントするアプリケーション"Histogram.java"を作成してください。
      このとき、星印は横に、0から9までの乱数で算出します。乱数は、java.lang.MathクラスのメソッドMath#random()を使います。詳細はAPIドキュメントを参照してください。
      1. public class Histogram {
      2. public static void main(String[] args) {
      3. Graph g = new Graph();
      4. for (int i = 0; i < 10; i++) {
      5. // コードを記述してください。
      6. }
      7. }
      8. }

      □ 実行結果

      $ java Histogram
      9|*********
      4|****
      8|********
      7|*******
      0|
      8|********
      6|******
      8|********
      5|*****
      4|****
      
    117. 第7回の最大公約数を計算するクラス"GCD.java"を改造し、String型の2つの引数から最大公約数を計算してint型で戻すメソッドGCD#getGCD()をクラス("GCD.java")の中に作成してください。
      1. public class GCD {
      2. public int getGCD(String a, String b) {
      3. // コードを記述してください。
      4. }
      5. public int getGCD(int a, int b) {
      6. int r;
      7. while ((r = a % b) != 0) {
      8. a = b;
      9. b = r;
      10. }
      11. return b;
      12. }
      13. }
    118. 上記メソッド"GCD#getGCD()"を利用するアプリケーション"TestGCD.java"を作ってください。
      1. public class TestGCD {
      2. public static void main(String[] args) {
      3. GCD gcd = new GCD();
      4. System.out.println(args[0] + " と " + args[1] + " の最大公約数は, " + gcd.getGCD(args[0], args[1]) + " です。" );
      5. }
      6. }

      □ 実行結果

      $ java TestGCD 12 32
      12 と 32 の最大公約数は, 4 です。
      

    119. 本(Book)クラスを、書名と作者名をコンストラクターで指定するクラスBook.javaにしてください。

      Book.java

      1. public class Book {
      2. private String title; // 書名
      3. private String author; // 著作者
      4. // コンストラクター
      5. // コードを記述してください。
      6. // title のゲッター
      7. public String getTitle() {
      8. return this.title;
      9. }
      10. // author のゲッター
      11. public String getAuthor() {
      12. return this.author;
      13. }
      14. // title のセッター
      15. public void setTitle(String title) {
      16. this.title = title;
      17. }
      18. // author のセッター
      19. public void setAuthor(String author) {
      20. this.author = author;
      21. }
      22. }

      Book.javaクラスをテストするアプリケーションBookTest.java

      1. public class BookTest {
      2. public static void main(String[] args) {
      3. Book b1 = new Book(args[0], args[1]);
      4. System.out.println(" Title:" + b1.getTitle());
      5. System.out.println("Author:" + b1.getAuthor());
      6. }
      7. }

      □ 実行結果

      $ java BookTest JavaBook Maruno
       Title:JavaBook
      Author:Maruno
      

    120. じゃんけんの手をあらわすJankenTeクラスを、手を設定してインスタンスを生成できるようなコンストラクターを作成したクラスJankenTeにしてください。

      JankenTe.java

      1. public class JankenTe {
      2. private int te; // 手
      3. static final String[] TE_NAMAE = {"ぐー", "ちょき", "ぱー"};
      4. // コンストラクター
      5. // コードを記述してください。
      6. // te のセッター
      7. public void setTe(String te) {
      8. for (int i = 0; i < TE_NAMAE.length; i++) {
      9. if (TE_NAMAE[i].equals(te)) {
      10. this.te = i;
      11. return;
      12. }
      13. }
      14. this.te = 0;
      15. }
      16. // te のセッター
      17. public void setTe(int te) {
      18. if (!(te == 0 || te == 1 || te == 2)) {
      19. this.te = 0;
      20. return;
      21. }
      22. this.te = te;
      23. }
      24. // te のゲッター
      25. public int getTe() {
      26. return this.te;
      27. }
      28. }

      JankenTe.javaクラスをテストするアプリケーションJankenAppl.java

      1. public class JankenAppl {
      2. public static void main(String[] args) {
      3. int n = Integer.parseInt(args[0]);
      4. JankenTe te1 = new JankenTe(n);
      5. JankenTe te2 = new JankenTe(JankenTe.TE_NAMAE[n]);
      6. System.out.println("手1: " + te1.getTe());
      7. System.out.println("手2: " + te2.getTe());
      8. }
      9. }

      □ 実行結果

      $ java JankenAppl 0
      手1: 0
      手2: 0
      
      $ java JankenAppl 1
      手1: 1
      手2: 1
      
      $ java JankenAppl 2
      手1: 2
      手2: 2
      

    121. じゃんけんの手をあらわすJankenTeクラスを、勝敗がわかるメソッド janken(JankenTe) と、オブジェクトを文字列化するメソッド toString() を追加したクラスJankenTeにしてください。

      JankenTe.java

      1. public class JankenTe {
      2. private int te; // 手
      3. static final String[] TE_NAMAE = {"ぐー", "ちょき", "ぱー"};
      4. // コンストラクター
      5. public JankenTe(String te) {
      6. setTe(te);
      7. }
      8. public JankenTe(int te) {
      9. setTe(te);
      10. }
      11. // te のセッター
      12. public void setTe(String te) {
      13. for (int i = 0; i < TE_NAMAE.length; i++) {
      14. if (TE_NAMAE[i].equals(te)) {
      15. this.te = i;
      16. return;
      17. }
      18. }
      19. this.te = 0;
      20. }
      21. // te のセッター
      22. public void setTe(int te) {
      23. if (!(te == 0 || te == 1 || te == 2)) {
      24. this.te = 0;
      25. return;
      26. }
      27. this.te = te;
      28. }
      29. // te のゲッター
      30. public int getTe() {
      31. return this.te;
      32. }
      33. // オブジェクトの文字列化
      34. public String toString() {
      35. // コードを記述してください。
      36. }
      37. // じゃんけん
      38. public char janken(JankenTe te) {
      39. final char[][] KEKKA = {{'分', '勝', '負'} // ぐー
      40. , {'負', '分', '勝'} // ちょき
      41. , {'勝', '負', '分'}}; // ぱー
      42. //コンピューター ぐー ちょき ぱー
      43. // コードを記述してください。
      44. }
      45. }

      JankenTe.javaクラスをテストするアプリケーションJankenAppl.java

      1. public class JankenAppl {
      2. public static void main(String[] args) {
      3. JankenTe user = new JankenTe(args[0]);
      4. JankenTe computer = new JankenTe((int)(Math.random() * 3));
      5. System.out.print("結果: " + user.janken(computer));
      6. System.out.print(", user = " + user.toString());
      7. System.out.println(", computer = " + computer.toString());
      8. }
      9. }

      □ 実行結果

      $ java JankenAppl ぐー
      結果: 分, user = ぐー, computer = ぐー
      
      $ java JankenAppl ぐー
      結果: 勝, user = ぐー, computer = ちょき
      
      $ java JankenAppl ぐー
      結果: 負, user = ぐー, computer = ぱー
      

      クラスの継承

    122. 本(Book)クラスを継承して、シリーズ名(String)と通番(int)を持つクラスSeriesBook.javaと、発行日時(date)を持つクラスMagazine.javaを作成してください。

      Book.java

      1. public class Book {
      2. private String title; // 書名
      3. private String author; // 著作者
      4. // コンストラクター
      5. public Book(String title, String author) {
      6. setTitle(title);
      7. setAuthor(author);
      8. }
      9. // title のゲッター
      10. public String getTitle() {
      11. return this.title;
      12. }
      13. // author のゲッター
      14. public String getAuthor() {
      15. return this.author;
      16. }
      17. // title のセッター
      18. public void setTitle(String title) {
      19. this.title = title;
      20. }
      21. // author のセッター
      22. public void setAuthor(String author) {
      23. this.author = author;
      24. }
      25. }

      SeriesBook.java

      1. public class SeriesBook extends Book {
      2. // コードを記述してください。
      3. }

      Magazine.java

      1. public class Magazine extends Book {
      2. // コードを記述してください。
      3. }

      SeriesBook.javaクラス、Magazine.java クラスをテストするアプリケーションBookTest.java

      1. public class BookTest {
      2. public static void main(String[] args) {
      3. Book b1 = new Book(args[0], args[1]);
      4. System.out.println("Book1 = [" + b1.getTitle() + ", " + b1.getAuthor() + "]");
      5. SeriesBook b2 = new SeriesBook(args[0], args[1], args[2], Integer.parseInt(args[3]));
      6. System.out.print("Book2 = [" + b2.getTitle() + ", " + b2.getAuthor());
      7. System.out.println(", " + b2.getSeries() + ", " + b2.getVolume() + "]");
      8. Magazine b3 = new Magazine(args[0], args[1], new java.util.Date().toString()(*));
      9. System.out.print("Book3 = [" + b3.getTitle() + ", " + b3.getAuthor());
      10. System.out.println(", " + b3.getDate() + "]");
      11. }
      12. }
      (*) new java.util.Date().toString() は、現在日時の文字列表現をあらわします。

      □ 実行結果

      $ java BookTest JavaBook Maruno Java 3
      Book1 = [JavaBook, Maruno]
      Book2 = [JavaBook, Maruno, Java, 3]
      Book3 = [JavaBook, Maruno, Wed Jun 22 21:28:12 JST 2005]
      

    123. 上記クラスSeriesBook.javaと、クラスMagazine.javaで、getTitle() メソッドの戻り値をつぎのようになるようにオーバーライドしてください。(SeriesBook.java, Magazine.java)。
        SeriesBook.java ... "シリーズ名 - 書名 (通番)"
        Magazine.java   ... "書名 (日付)"
      

      □ 実行結果

      $ java BookTest JavaBook Maruno Java 3
      Book1 = [JavaBook, Maruno]
      Book2 = [JavaBasic - JavaBook (3), Maruno, JavaBasic, 3]
      Book3 = [JavaBook (Thu Jun 23 12:41:09 JST 2005), Maruno, Thu Jun 23 12:41:09 JST 2005]
      

    124. つぎの図形クラス"Zukei.java"があります。

      図形クラス階層
      図 図形クラス階層

      1. public class Zukei {
      2. private String name; // 名前
      3. public String getName() { // 名前の取得
      4. return name;
      5. }
      6. public void setName(String name) { // 名前の設定
      7. this.name = name;
      8. }
      9. public double length() { // 周の長さ
      10. return 0.0;
      11. }
      12. }
      この図形クラスを継承して円、三角形、四角形の図形を処理するクラスを作ります。コンストラクターはつぎのとおりです。なお、図形の座標の原点は左上にあるものとします。
    125. "Maru.java"
    126. Maru(String name, int x, int y, int r) 中心(x, y)と半径r
      Maru(int x, int y, int r) 中心(x, y)と半径r
    127. "Sankaku.java"
    128. Sankaku(String name, int[][] p) 頂点の座標(x0, y0),(x1, y1), (x2, y2)の組
      Sankaku(int[][] p) 頂点の座標(x0, y0),(x1, y1), (x2, y2)の組
    129. "Shikaku.java"
    130. Shikaku(String name, int x0, int y0, int x1, int y1) 左上の座標(x0, y0)と右下の座標(x1, y1)
      Shikaku(int x0, int y0, int x1, int y1) 左上の座標(x0, y0)と右下の座標(x1, y1)

      また、図形の周の長さを戻すメソッドlength()をオーバーライドしてください。周の長さは、つぎの式によります。Math.PIは、Mathクラスのdouble型定数で、円周率をあらわします。

         円    2 * Math.PI * r
        
         四角形  2 * (x1 - x0 + y1 - y0)
        

      なお、これらをテストするアプリケーション"ZukeiTest01.java"と、三角形クラス"Sankaku.java"のサンプル・ソース・ファイルをつけます。

      "ZukeiTest01.java"

      1. public class ZukeiTest01 {
      2. public static void main(String[] args) {
      3. Zukei[] z = {
      4. new Shikaku("基準四角", 0, 0, 100, 100)
      5. , new Sankaku("基準三角", new int[][]{{0, 0}, {0, 100}, {100, 0}})
      6. , new Maru("基準丸", 0, 0, 100)
      7. , new Sankaku(new int[][]{{100, 100}, {10, 250}, {300, 300}})
      8. , new Maru(150, 170, 60)
      9. , new Shikaku(120, 130, 300, 190)
      10. };
      11. for (int i = 0; i < z.length; i++) {
      12. System.out.println(z[i].getName() + " の周の長さ = " + Math.round(z[i].length()));
      13. }
      14. }
      15. }

      "Maru.java"

      1. public class Maru extends Zukei {
      2. private int x0, y0; // 中心
      3. private int r; // 半径
      4. public Maru(String name, int x0, int y0, int r) {
      5. setName(name);
      6. this.x0 = x0;
      7. this.y0 = y0;
      8. this.r = r;
      9. }
      10. public Maru(int x0, int y0, int r) {
      11. this("丸", x0, y0, r);
      12. }
      13. public double length() { // 周の長さ
      14. // ここにコードを記述してください。
      15. }
      16. }

      "Sankaku.java"

      1. public class Sankaku extends Zukei {
      2. private int[][] p; // 頂点
      3. private double[] l = new double[3]; // 辺の長さ
      4. public Sankaku(int[][] p) {
      5. this("三角形", p);
      6. }
      7. public Sankaku(String name, int[][] p) {
      8. setName(name);
      9. this.p = p;
      10. for (int i = 0; i < l.length; i++) {
      11. l[i] = distance(p[i], p[(i + 1) % l.length]);
      12. }
      13. }
      14. public double length() { // 周の長さ
      15. return sum(l);
      16. }
      17. private double sum(double[] x) { // 要素値の合計
      18. double s = 0;
      19. for (int i = 0; i < l.length; i++) {
      20. s += l[i];
      21. }
      22. return s;
      23. }
      24. private double distance(int[] x, int[] y) { // 頂点間の距離
      25. return Math.sqrt(sq(diff(x[0], y[0])) + sq(diff(x[1], y[1])));
      26. }
      27. private int sq(int x) { // 2乗
      28. return x * x;
      29. }
      30. private int diff(int x, int y) { // 差
      31. return Math.abs(y - x);
      32. }
      33. }

      "Shikaku.java"

      1. public class Shikaku extends Zukei {
      2. private int x0, y0; // 左上の頂点の座標
      3. private int x1, y1; // 左上の頂点の座標
      4. private int w, h; // 幅と高さ
      5. public Shikaku(String name, int x0, int y0, int x1, int y1) { // コンストラクター
      6. setName(name);
      7. this.x0 = x0;
      8. this.y0 = y0;
      9. this.x1 = x1;
      10. this.y1 = y1;
      11. w = Math.abs(x0 - x1);
      12. h = Math.abs(y0 - y1);
      13. }
      14. public Shikaku(int x0, int y0, int x1, int y1) { // コンストラクター
      15. this("四角形", x0, y0, x1, y1);
      16. }
      17. public double length() { // 周の長さ
      18. // ここにコードを記述してください。
      19. }
      20. }

      □ 実行結果

      $ java ZukeiTest01
      基準四角 の周の長さ = 400
      基準三角 の周の長さ = 341
      基準丸 の周の長さ = 628
      三角形 の周の長さ = 752
      丸 の周の長さ = 377
      四角形 の周の長さ = 480
      

      参照型の配列

    131. コマンドラインから入力した整数が奇数か偶数かを判定してメッセージを出すアプリケーション"EvenOdd03.java"を作成してください。このとき、if文を使わないで作成してください。
      1. public class EvenOdd03 {
      2. public static void main(String[] args) {
      3. int a = Integer.parseInt(args[0]);
      4. // ここにコードを記述してください。
      5. }
      6. }

      □ 実行結果

      $ java EvenOdd03 10
      10は偶数です。
      
      $ java EvenOdd03 11
      11は奇数です。
      

      抽象クラス

    132. "クラスの継承"で実習した図形クラス"Zukei.java"を抽象クラス"Zukei.java"にしてください。

      図形クラス階層
      図 図形クラス階層

      "Zukei.java"

      1. public abstract class Zukei {
      2. private String name; // 名前
      3. public String getName() { // 名前の取得
      4. return name;
      5. }
      6. public void setName(String name) { // 名前の設定
      7. this.name = name;
      8. }
      9. public abstract double length() ; // 周の長さ
      10. }

      □ 実行結果

      $ java ZukeiTest01
      基準四角 の周の長さ = 400
      基準三角 の周の長さ = 341
      基準丸 の周の長さ = 628
      三角形 の周の長さ = 752
      丸 の周の長さ = 377
      四角形 の周の長さ = 480
      

      インターフェース

    133. 図形クラス"Zukei.java"をインターフェース"Zukei.java"にしてください。また、いままでの図形クラス"Zukei.java"は、抽象図形クラス"AbstractZukei.java"にします。

      図形クラス階層
      図 図形クラス階層

      インターフェースが実装するのは、以下のメソッドです。

      • double length() ... 図形の長さを戻す。
      • String getName() ... 図形の名前を戻す。

      上記インターフェースを利用して、図形を描画するクラスを作成してください。
    134. "Maru.java"
    135. Maru(int x, int y, int r) 中心(x, y)と半径r
    136. "Sankaku.java"
    137. Sankaku(int[][] p) 頂点の座標(x0, y0),(x1, y1), (x2, y2)の組
    138. "Shikaku.java"
    139. Shikaku(int x0, int y0, int x1, int y1) 左上の座標(x0, y0)と右下の座標(x1, y1)

      "AbstractZukei.java"

      "ZukeiTest01.java"は、変更ありません。

      "Sankaku.java"

      1. public class Sankaku extends AbstractZukei {
      2. private int[][] p;
      3. private double[] l = new double[3]; // 辺の長さ
      4. public Sankaku(int[][] p) {
      5. this("三角形", p);
      6. }
      7. public Sankaku(String name, int[][] p) {
      8. setName(name);
      9. this.p = p;
      10. for (int i = 0; i < l.length; i++) {
      11. l[i] = distance(p[i], p[(i + 1) % l.length]);
      12. }
      13. }
      14. public double length() {
      15. return distance(p[0], p[1]) + distance(p[1], p[2]) + distance(p[2], p[0]);
      16. }
      17. private double distance(int[] x, int[] y) {
      18. return Math.sqrt(diff(x[0], y[0]) * diff(x[0], y[0]) + diff(x[1], y[1]) * diff(x[1], y[1]));
      19. }
      20. private double diff(int x, int y) {
      21. return Math.abs(y - x);
      22. }
      23. }

      □ 実行結果

      $ java ZukeiTest01
      基準四角 の周の長さ = 400
      基準三角 の周の長さ = 341
      基準丸 の周の長さ = 628
      三角形 の周の長さ = 752
      丸 の周の長さ = 377
      四角形 の周の長さ = 480
      
      

      パッケージ

    140. ディレクトリー"~/basic/"の下にディレクトリー"maruno/classes"と"maruno/sources"を作成してください。
      $ mkdir -p maruno/classes maruno/sources
      
    141. ディレクトリー"maruno/sources"にソースファイルを作ります。
      テキストの"Pack01.java"をコンパイルしてください。
      1. package com.maruno.mypack;
      2. public class Pack01 {
      3. public void printData() {
      4. System.out.println( "Pack01" );
      5. }
      6. }

      □ コンパイル

      $ javac -d ../classes Pack01.java
      
    142. テキストの"Pack02.java"をコンパイルして実行ください。
      1. import com.maruno.mypack.Pack01;
      2. public class Pack02 {
      3. public static void main( String[] args ) {
      4. Pack01 pack01;
      5. pack01 = new Pack01();
      6. pack01.printData();
      7. }
      8. }

      □ コンパイル

      $ javac -classpath ../classes Pack02.java
      

      □ 実行結果

      $java -cp .:../classes com.maruno.mypack.Pack02
      Pack01
      

      例外処理

    143. つぎの"Exception30.java"をコンパイル・実行してください。実行するとき、つぎのような条件をつけてください。
      1. 引数を指定しない
      2. 引数に文字を指定
      3. 引数に0を指定
      4. 引数に0以外の整数を指定
      1. public class Exception30 {
      2. public static void main(String[] args) {
      3. System.out.println("*** start ***");
      4. int a = Integer.parseInt(args[0]);
      5. System.out.println(100 / a);
      6. System.out.println("*** end ***");
      7. }
      8. }

      □ 実行結果

      $ java Exception30
      *** start ***
      Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
              at Exception30.main(Exception30.java:4)
      
      $ java Exception30 Hello
      *** start ***
      Exception in thread "main" java.lang.NumberFormatException: For input string: "Hello"
              at java.lang.NumberFormatException.forInputString(Unknown Source)
              at java.lang.Integer.parseInt(Unknown Source)
              at java.lang.Integer.parseInt(Unknown Source)
              at Exception30.main(Exception30.java:4)
      
      $ java Exception30 0
      *** start ***
      Exception in thread "main" java.lang.ArithmeticException: / by zero
              at Exception30.main(Exception30.java:5)
      
      $ java Exception30 20
      *** start ***
      5
      *** end ***
      

      java.lang.String

    144. つぎのようにStringが定義されています。
      この4つの文字列の参照先が同じか否か、また、内容が同じか否かを判定するアプリケーション"String50.java"を作成し、実行してください。
      1. String s1 = "Hello";
      2. String s2 = "Hello";
      3. String s3 = new String("Hello");
      4. String s4 = new String("Hello");
      1. public class String50 {
      2. public static void main(String[] args) {
      3. String s1 = "Hello";
      4. String s2 = "Hello";
      5. String s3 = new String("Hello");
      6. String s4 = new String("Hello");
      7. System.out.println("s1 == s2: " + (s1 == s2));
      8. System.out.println("s1 == s3: " + (s1 == s3));
      9. System.out.println("s1 == s4: " + (s1 == s4));
      10. System.out.println("s3 == s4: " + (s3 == s4));
      11. System.out.println("s1.equals(s2): " + (s1.equals(s2)));
      12. System.out.println("s1.equals(s3): " + (s1.equals(s3)));
      13. System.out.println("s1.equals(s4): " + (s1.equals(s4)));
      14. System.out.println("s3.equals(s4): " + (s3.equals(s4)));
      15. }
      16. }

      □ 実行結果

      $ java String50
      s1 == s2: true
      s1 == s3: false
      s1 == s4: false
      s3 == s4: false
      s1.equals(s2): true
      s1.equals(s3): true
      s1.equals(s4): true
      s3.equals(s4): true
      

    145. Stringクラスのつぎのメソッドを確認するアプリケーション"String52.java"を作成し、実行してください。
      • char charAt(int index)
      • int indexOf(String str)
      • int length()
      • boolean matches(String regex)
      • String replaceAll(String regex, String replacement)
      • String[] split(String regex)
      • String substring(int beginIndex)
      • String substring(int beginIndex, int endIndex)
      • String toLowerCase()
      • String toUpperCase()
      1. public class String52 {
      2. public static void main(String[] args) {
      3. String s = "Hello Java World";
      4. System.out.println(" 0123456789012345");
      5. System.out.println("s = " + s );
      6. System.out.println("s.length() = " + s.length() );
      7. System.out.println("s.charAt(6) = " + s.charAt(6) );
      8. System.out.println("s.indexOf(\"x\") = " + s.indexOf("x") );
      9. System.out.println("s.indexOf(\"l\") = " + s.indexOf("l") );
      10. System.out.println("s.indexOf(\"l\", 6) = " + s.indexOf("l", 6) );
      11. System.out.println("s.matches(\".*Java.*\") = " + s.matches(".*Java.*") );
      12. System.out.println("s.substring(2, 5) = " + s.substring(2, 5) );
      13. System.out.println("s.substring(11, 15) = " + s.substring(11, 15));
      14. System.out.println("s.substring(11, 16) = " + s.substring(11, 16));
      15. System.out.println("s.substring(11) = " + s.substring(11) );
      16. System.out.println("s.toLowerCase() = " + s.toLowerCase() );
      17. System.out.println("s.toUpperCase() = " + s.toUpperCase() );
      18. System.out.println("s.replaceAll(\"Hello\", \"Hi\") = " + s.replaceAll("Hello", "Hi"));
      19. String[] sa = s.split(" ");
      20. for (int i = 0; i < sa.length; i++) {
      21. System.out.println("s.split(\" \")[" + i + "] = " + sa[i]);
      22. }
      23. }
      24. }

      □ 実行結果

      $ java String52
                                    0123456789012345
      s                           = Hello Java World
      s.length()                  = 16
      s.charAt(6)                 = J
      s.indexOf("x")              = -1
      s.indexOf("l")              = 2
      s.indexOf("l", 6)           = 14
      s.matches(".*Java.*")       = true
      s.substring(2, 5)           = llo
      s.substring(11, 15)         = Worl
      s.substring(11, 16)         = World
      s.substring(11)             = World
      s.toLowerCase()             = hello java world
      s.toUpperCase()             = HELLO JAVA WORLD
      s.replaceAll("Hello", "Hi") = Hi Java World
      s.split(" ")[0]             = Hello
      s.split(" ")[1]             = Java
      s.split(" ")[2]             = World
      

    146. コマンドラインから2つの文字列を受け取り、第1引数の文字列中に含まれる第2引数の文字列の位置をすべてプリントするアプリケーション"String60.java"を作成し、実行してください。
      1. public class String60 {
      2. public static void main(String[] args) {
      3. int i = -1;
      4. while (/* ここにコードを書いてください。*/) {
      5. System.out.println(i);
      6. }
      7. }
      8. }

      □ 実行結果

      $ java String60 "hello world" l
      2
      3
      9
      
    147. (オプション)
      上記アプリケーション
      "String60.java"で、大文字小文字を意識しないで位置を表示するアプリケーション"String601.java"を作成し、実行してください。
    148. □ 実行結果

      $ java String601 "HELLO world" l
      2
      3
      9
      
    149. コマンドラインから文字列と文字を受け取り、第1引数の文字列中に含まれる第2引数の文字の位置で文字列を3つに分割してプリントするアプリケーション"String61.java"を作成し、実行してください。
      1. public class String61 {
      2. public static void main(String[] args) {
      3. int i = -1;
      4. while ( /* ここにコードを書いてください。*/ ) {
      5. // ここにコードを書いてください。
      6. }
      7. }
      8. }

      □ 実行結果

      $ java String61 "Hello World" l
      He l lo World
      Hel l o World
      Hello Wor l d
      

      java.lang.StringBuffer

    150. StringBuffer オブジェクトに文字列を加えても、参照が変わらないことを確認してください。("StringBuffer50.java")
      1. public class StringBuffer50 {
      2. public static void main(String[] args) {
      3. StringBuffer sb1 = new StringBuffer("Hello");
      4. StringBuffer sb2 = sb1;
      5. sb1.append(" World!");
      6. System.out.println("sb1 == sb2 ? " + (sb1 == sb2));
      7. }
      8. }

      □ 実行結果

      $ java StringBuffer50
      sb1 == sb2 ? true
      

    151. StringBufferクラスのつぎのメソッドを確認するアプリケーション"StringBuffer51.java"を作成し、実行してください。
      • StringBuffer append(String str)
      • StringBuffer insert(int offset, String str)
      • StringBuffer replace(int start, int end, String str)
      • StringBuffer reverse()
      1. public class StringBuffer51 {
      2. public static void main(String[] args) {
      3. StringBuffer sb1 = new StringBuffer("Hello");
      4. System.out.println(" sb1 = " + sb1);
      5. sb1.append(" World!");
      6. System.out.println(" sb1.append(\" World!\") = " + sb1);
      7. sb1.insert(5, " Java");
      8. System.out.println(" sb1.insert(5, \" Java\") = " + sb1);
      9. sb1.replace(6, 10, "Servlet");
      10. System.out.println("sb1.replace(6, 10, \"Servlet\") = " + sb1);
      11. sb1.reverse();
      12. System.out.println(" sb1.reverse() = " + sb1);
      13. }
      14. }

      □ 実行結果

      $ java StringBuffer51
                                sb1 = Hello
              sb1.append(" World!") = Hello World!
             sb1.insert(5, " Java") = Hello Java World!
      sb1.replace(6, 10, "Servlet") = Hello Servlet World!
                      sb1.reverse() = !dlroW telvreS olleH
      

    152. コマンドラインからデータを受取り、受け取った並び順の逆順に連結してプリントするアプリケーション"StringBuffer10.java"を作成し、実行してください。
      1. public class StringBuffer10 {
      2. public static void main(String[] args) {
      3. StringBuffer sb = new StringBuffer();
      4. for (int i = 0; i < args.length; i++) {
      5. // ここにコードを書いてください。
      6. }
      7. System.out.println(sb);
      8. }
      9. }

      □ 実行結果

      $ java StringBuffer10 Hello Java World 
      World Java Hello
      
    153. (オプション)
      上記アプリケーションで、それぞれの引数の文字列も逆転するようにしてください。(
      "StringBuffer11.java")

      □ 実行結果

      実行結果
      $ java StringBuffer11 Hello Java World 
      dlroW avaJ olleH
      
    154. コマンドラインから3つの文字列を受取り、第1引数の文字列中にある第2引数と同じ文字列をすべて第3引数の文字列に変換するアプリケーション"StringBuffer20.java"を作成し、実行してください。
      1. public class StringBuffer20 {
      2. public static void main(String[] args) {
      3. StringBuffer sb = new StringBuffer(args[0]);
      4. int i;
      5. while ((i = sb.indexOf(args[1])) > -1) {
      6. // ここにコードを書いてください。
      7. }
      8. System.out.println(sb);
      9. }
      10. }

      □ 実行結果

      $ java StringBuffer20 "hello world, java, and hello to you all" hello hi
      hi world, java, and hi to you all
      

      ラッパー・クラス

    155. コマンドラインからbyte型の整数を2つ指定して、それの積をbyte型に入れるアプリケーション"Wrapper51.java"を作成してください。このとき、byte型に収まるか否かも判断してください。
      1. public class Wrapper51 {
      2. public static void main(String[] args) {
      3. byte a = /* ここにコードを記述してください。*/ (args[0]);
      4. byte b = /* ここにコードを記述してください。*/ (args[1]);
      5. // ここにコードを記述してください。
      6. }
      7. }

      □ 実行結果

      $ java Wrapper51 10 2
      20はbyte型の範囲内です。
      
      $ java Wrapper51 10 20
      200はbyte型に収まりません。結果は、-56
      

      コレクション

    156. 上記"ArrayList001.java"を、コマンドラインからDoubleクラスのオブジェクトとして格納できるように改造して、コンパイル・実行してください。("ArrayList002.java")
      1. import java.util.*;
      2. public class ArrayList002 {
      3. public static void main(String[] args) {
      4. List al = new ArrayList();
      5. for (int i = 0; i < args.length; i++) {
      6. al.add(new Double(args[i]));
      7. }
      8. System.out.println(al);
      9. }
      10. }

      □ 実行結果

      $ >java ArrayList002 5 -3 1 -2 4
      [5.0, -3.0, 1.0, -2.0, 4.0]
      
    157. 10個のInteger型の要素からなるArrayListがあります。この要素を前に2つずらすアプリケーション"ArrayList13.java"をコンパイル・実行してください。
      1. import java.util.*;
      2. public class ArrayList13 {
      3. public static void main( String[] args ) {
      4. List al = new ArrayList();
      5. for ( int i = 0; i < 10; i++ ) {
      6. al.add(new Integer(i));
      7. }
      8. System.out.println("before: " + al);
      9. for ( int i = 0; i < 2; i++ ) {
      10. // ここにコードを追加してください。
      11. }
      12. System.out.println("after: " + al);
      13. }
      14. }

      □ 実行結果

      $ java ArrayList13
      before: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      after: [2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
      
    158. email名簿クラス("EmailList.java")があります。これを管理するためのクラス"EmailManage01.java"をMapを利用して作成してください。ここでは、コマンドラインから指定した文字列で、そのemail名簿を検索します。
      名簿はつぎのように設定します。
    159. 0101丸野maruno@abc.co.jp
      0201山田yamada@def.com
      0202鈴木suzuki@def.com
      0102佐藤sato@abc.co.jp

      "EmailList.java"

      1. public class EmailList {
      2. String id;
      3. String name;
      4. String email;
      5. EmailList(String id, String name, String email) {
      6. this.id = id;
      7. this.name = name;
      8. this.email = email;
      9. }
      10. }

      "EmailManage01.java"

      1. import java.util.*;
      2. public class EmailManage01 {
      3. public static void main(String[] args) {
      4. Map emailObject = new HashMap();
      5. // emailObject の設定
      6. final String[][] EMAIL_LIST = {
      7. {"0101", "丸野", "maruno@abc.co.jp"}
      8. , {"0201", "山田", "yamada@def.com"}
      9. , {"0202", "鈴木", "suzuki@def.com"}
      10. , {"0102", "佐藤", "sato@abc.co.jp"}
      11. };
      12. for (int i = 0; i < EMAIL_LIST.length; i++) {
      13. emailObject.put(EMAIL_LIST[i][0],
      14. new EmailList(EMAIL_LIST[i][0], EMAIL_LIST[i][1], EMAIL_LIST[i][2]));
      15. }
      16. // emailObject の検索
      17. if (/* ここにコードを記述してください */) {
      18. EmailList el = (EmailList)emailObject.get(args[0]);
      19. System.out.println("id = " + args[0]);
      20. System.out.println("name = " + el.name);
      21. System.out.println("email = " + el.email);
      22. } else {
      23. System.out.println("id = " + args[0] + " はありませんでした。");
      24. }
      25. }
      26. }

      □ 実行結果

      $ java EmailManage01 0102
      id    = 0102
      name  = 佐藤
      email = sato@abc.co.jp
      
      $ java EmailManage01 0203
      id = 0203 はありませんでした。
      
    160. (オプション)
      上記問題のemail名簿クラス("EmailList.java")をカプセル化してください。

    161. (オプション)
      上記問題のemail管理クラス("EmailManage01.java" は、id による照会ですが、name による照会に変更してください。

      □ email名簿クラス("EmailList.java", 変更ありません)

      1. public class EmailList {
      2. String id;
      3. String name;
      4. String email;
      5. public EmailList(String id, String name, String email) {
      6. this.id = id;
      7. this.name = name;
      8. this.email = email;
      9. }
      10. public String toString() {
      11. return "[" + id + ", " + name + ", " + email + "]";
      12. }
      13. }

      □ email管理クラス("EmailManage03.java")

      1. import java.util.*;
      2. public class EmailManage03 {
      3. public static void main(String[] args) {
      4. Map emailObject = new HashMap(); // email リスト
      5. Map emailIndex = new HashMap(); // name と id を対応づける Map
      6. /*
      7. * emailIndex emailObject
      8. * name id id name email
      9. * ---- ---- ---- ---- -----------------
      10. * 丸野 0101 0101 丸野 maruno@abc.co.jp
      11. * 山田 0201 0201 山田 yamada@def.com
      12. * 鈴木 0202 0202 鈴木 suzuki@def.com
      13. * 佐藤 0102 0102 佐藤 sato@abc.co.jp
      14. */
      15. // emailObject の設定
      16. final String[][] EMAIL_LIST = { { "0101", "丸野", "maruno@abc.co.jp" },
      17. { "0201", "山田", "yamada@def.com" },
      18. { "0202", "鈴木", "suzuki@def.com" },
      19. { "0102", "佐藤", "sato@abc.co.jp" } };
      20. for (int i = 0; i < EMAIL_LIST.length; i++) {
      21. emailObject.put(EMAIL_LIST[i][0], new EmailList(EMAIL_LIST[i][0],
      22. EMAIL_LIST[i][1], EMAIL_LIST[i][2]));
      23. emailIndex.put(EMAIL_LIST[i][1], EMAIL_LIST[i][0]); // インデックスの設定
      24. }
      25. // emailObject の検索
      26. if (emailObject.containsKey(emailIndex.get(args[0]))) {
      27. // ここにコードを追加してください。
      28. System.out.println("id = " + el.id);
      29. System.out.println("name = " + el.name);
      30. System.out.println("email = " + el.email);
      31. } else {
      32. System.out.println("name = " + args[0] + " はありませんでした。");
      33. }
      34. }
      35. }

      □ 実行結果

      $ java EmailManage03 山田
      id    = 0201
      name  = 山田
      email = yamada@def.com
      
      $ java EmailManage03 山本
      name = 山本 はありませんでした。
      

    162. (オプション)
      上記問題のemail管理クラス("EmailManage01.java" では、現在、idによる照会しかできません。これを変更して、つぎの操作もできるようにしてください。このときの、コマンドライン引数も決めてください。
      照会なし または Q
      java EmailManage02 0101  または
      java EmailManage02 Q 0101
      
      追加 / 変更A / U
      java EmailManage02 A 0109 田中 tanaka@ghi.co.jp
      
      削除D
      java EmailManage02 D 0101
      

      □ email名簿クラス("EmailList.java")

      1. public class EmailList {
      2. String id;
      3. String name;
      4. String email;
      5. public EmailList(String id, String name, String email) {
      6. this.id = id;
      7. this.name = name;
      8. this.email = email;
      9. }
      10. public String toString() {
      11. return "[" + id + ", " + name + ", " + email + "]";
      12. }
      13. }

      □ email管理クラス("EmailManage02.java")

      1. import java.util.*;
      2. public class EmailManage02 {
      3. static Map emailObject = new HashMap();
      4. public static void main(String[] args) {
      5. // emailObject の設定
      6. final String[][] EMAIL_LIST = {
      7. {"0101", "丸野", "maruno@abc.co.jp"}
      8. , {"0201", "山田", "yamada@def.com"}
      9. , {"0202", "鈴木", "suzuki@def.com"}
      10. , {"0102", "佐藤", "sato@abc.co.jp"}
      11. };
      12. for (int i = 0; i < EMAIL_LIST.length; i++) {
      13. emailObject.put(EMAIL_LIST[i][0],
      14. new EmailList(EMAIL_LIST[i][0], EMAIL_LIST[i][1], EMAIL_LIST[i][2]));
      15. }
      16. System.out.println("emailObject = " + emailObject);
      17. // 処理の切り分け
      18. switch (args[0].charAt(0)) {
      19. case 'q':
      20. case 'Q':
      21. queryEmailObject(args[1]);
      22. break;
      23. case 'd':
      24. case 'D':
      25. deleteEmailObject(args[1]);
      26. break;
      27. case 'a':
      28. case 'A':
      29. case 'u':
      30. case 'U':
      31. addEmailObject(args[1], args[2], args[3]);
      32. break;
      33. default:
      34. queryEmailObject(args[0]);
      35. break;
      36. }
      37. System.out.println("emailObject = " + emailObject);
      38. }
      39. // emailObject の照会
      40. static void queryEmailObject(String id) {
      41. // ここにコードを追加してください。
      42. }
      43. // emailObject の削除
      44. static void deleteEmailObject(String id) {
      45. // ここにコードを追加してください。
      46. }
      47. // emailObject の追加 / 変更
      48. static void addEmailObject(String id, String name, String email) {
      49. // ここにコードを追加してください。
      50. }
      51. }

      □ 実行結果

      $ java EmailManage02 0101
      emailObject = {0101=[0101, 丸野, maruno@abc.co.jp], 0202=[0202, 鈴木, suzuki@def
      .com], 0102=[0102, 佐藤, sato@abc.co.jp], 0201=[0201, 山田, yamada@def.com]}
      id    = 0101
      name  = 丸野
      email = maruno@abc.co.jp
      emailObject = {0101=[0101, 丸野, maruno@abc.co.jp], 0202=[0202, 鈴木, suzuki@def
      .com], 0102=[0102, 佐藤, sato@abc.co.jp], 0201=[0201, 山田, yamada@def.com]}
      
      $ java EmailManage02 q 0101
      emailObject = {0101=[0101, 丸野, maruno@abc.co.jp], 0202=[0202, 鈴木, suzuki@def
      .com], 0102=[0102, 佐藤, sato@abc.co.jp], 0201=[0201, 山田, yamada@def.com]}
      id    = 0101
      name  = 丸野
      email = maruno@abc.co.jp
      emailObject = {0101=[0101, 丸野, maruno@abc.co.jp], 0202=[0202, 鈴木, suzuki@def
      .com], 0102=[0102, 佐藤, sato@abc.co.jp], 0201=[0201, 山田, yamada@def.com]}
      
      $ java EmailManage02 d 0101
      emailObject = {0101=[0101, 丸野, maruno@abc.co.jp], 0202=[0202, 鈴木, suzuki@def
      .com], 0102=[0102, 佐藤, sato@abc.co.jp], 0201=[0201, 山田, yamada@def.com]}
      id = 0101 を削除しました。
      emailObject = {0202=[0202, 鈴木, suzuki@def.com], 0102=[0102, 佐藤, sato@abc.co.
      jp], 0201=[0201, 山田, yamada@def.com]}
      
      $ java EmailManage02 a 0901 田中 tanaka@ghi.co.jp
      emailObject = {0101=[0101, 丸野, maruno@abc.co.jp], 0202=[0202, 鈴木, suzuki@def
      .com], 0102=[0102, 佐藤, sato@abc.co.jp], 0201=[0201, 山田, yamada@def.com]}
      id = 0901 を追加しました。
      emailObject = {0101=[0101, 丸野, maruno@abc.co.jp], 0202=[0202, 鈴木, suzuki@def
      .com], 0102=[0102, 佐藤, sato@abc.co.jp], 0201=[0201, 山田, yamada@def.com], 090
      1=[0901, 田中, tanaka@ghi.co.jp]}
      

      バイト・ストリーム

    163. つぎの"FileIO011.java"を作成ください。
      1. import java.io.*;
      2. public class FileIO011 {
      3. public static void main( String[] args ) {
      4. int b;
      5. FileInputStream fis = null;
      6. FileOutputStream fos = null;
      7. // ここにコードを記述してください。
      8. }
      9. }
      $ java FileIO11 Stream.dat Stream.copy
                A      A-- 出力ファイル名
                +-- 入力ファイル名
      $ diff Stream.dat Stream.copy  <-- 差があるか否かの確認(なければメッセージなし)
      
      $ java FileIO11 Stream.dat Stream.copy
                A      A-- 出力ファイル名
                +-- 入力ファイル名
      $ dir Stream.*  <-- 差があるか否かの確認(サイズで確認)
      
    164. コマンドラインから入力ファイル名、出力ファイル名、暗号化キーを指定し、入力ファイルを暗号化キーにしたがって、暗号化(または復号化)するアプリケーション"Encoding04.java"を作成してください。ここで、暗号化はcharの下位何ビットをビット反転するかは、暗号化キーによります。
      1. import java.io.*;
      2. public class Encoding04 {
      3. public static void main(String[] args) {
      4. FileInputStream fis;
      5. FileOutputStream fos;
      6. int key = Integer.parseInt(args[2]);
      7. int b;
      8. try {
      9. fis = new FileInputStream(args[0]);
      10. fos = new FileOutputStream(args[1]);
      11. while ((b = fis.read()) != -1) {
      12. // ここにコードを記述してください。
      13. }
      14. fos.close();
      15. fis.close();
      16. } catch (IOException e) {
      17. }
      18. }
      19. }

      □ 実行結果

      $ java Encoding04 sample.txt sample.out 3
      

      文字ストリーム

    165. ファイルをコピーするアプリケーション"FileCopy.java"を作成ください。このとき、ファイルのコピー部分は、FileCopy#copyFile()メソッドを使います。(この問題は例題からとっています。)
      1. import java.io.*;
      2. public class FileCopy {
      3. public static void main(String[] args) {
      4. if (copyFile(args[0], args[1])) {
      5. System.err.println("File '" + args[0] + "' copied to '" + args[1] + "'.");
      6. } else {
      7. System.err.println("File '" + args[0] + "' does not copied.");
      8. }
      9. }
      10. public static boolean copyFile(String inFileName, String outFileName) {
      11. try {
      12. // 文字ストリームの獲得(ファイルのオープン)
      13. BufferedReader br = new BufferedReader(new FileReader(inFileName));
      14. BufferedWriter bw = new BufferedWriter(new FileWriter(outFileName));
      15. String str;
      16. // データの読み込み(入力)
      17. while ((str = br.readLine()) != null) {
      18. // 読み込んだデータの書き込み(出力)
      19. bw.write(str);
      20. bw.newLine();
      21. }
      22. // ストリームのクローズ(ファイルのクローズ)
      23. bw.flush();
      24. bw.close();
      25. br.close();
      26. } catch (FileNotFoundException e) {
      27. return false;
      28. } catch (IOException e) {
      29. e.printStackTrace();
      30. return false;
      31. }
      32. return true;
      33. }
      34. }

      □ 実行結果

      $ java FileCopy FileCopy.java a.txt
      File 'FileCopy.java' copied to 'a.txt'.
      

    166. (オプション)
      上記のファイルをコピーするアプリケーション"FileCopy.java"につぎのオプションを加えてください。("FileCopy.java")
      1. import java.io.*;
      2. public class FileCopy {
      3. public static void main(String[] args) {
      4. FileCopy fc = new FileCopy();
      5. String inf = "", outf = "";
      6. String ie = // コードを記述してください。
      7. String oe = // コードを記述してください。
      8. for (int i = 0; i < args.length; i++) {
      9. if (args[i].equals("-ie")) {
      10. ie = args[++i];
      11. } else if (args[i].equals("-oe")) {
      12. oe = args[++i];
      13. } else {
      14. if (inf.equals("")) {
      15. inf = args[i];
      16. } else {
      17. outf = args[i];
      18. }
      19. }
      20. }
      21. if (fc.copyFile(ie, oe, inf, outf)) {
      22. System.err.println("File '" + inf + "(" + ie
      23. + ")' copied to '" + outf + "(" + oe + ")'.");
      24. } else {
      25. System.err.println("File '" + inf + "' does not copied.");
      26. }
      27. }
      28. public boolean copyFile(String inFileEncoding,
      29. String outFileEncoding,
      30. String inFileName,
      31. String outFileName) {
      32. try {
      33. // 文字ストリームの獲得(ファイルのオープン)
      34. BufferedReader br =
      35. // コードを記述してください。
      36. BufferedWriter bw =
      37. // コードを記述してください。
      38. String str;
      39. // データの読み込み(入力)
      40. while ((str = br.readLine()) != null) {
      41. // 読み込んだデータの書き込み(出力)
      42. bw.write(str);
      43. bw.newLine();
      44. }
      45. // ストリームのクローズ(ファイルのクローズ)
      46. bw.flush();
      47. bw.close();
      48. br.close();
      49. } catch (FileNotFoundException e) {
      50. return false;
      51. } catch (IOException e) {
      52. e.printStackTrace();
      53. return false;
      54. }
      55. return true;
      56. }

      □ 実行結果

      $ java FileCopy FileCopy.java a.txt
      File 'Stream.dat(JISAutoDetect)' copied to 'aaa.dat(MS932)'.
      
      $ java FileCopy -ie MS932 Stream.dat aaa.dat
      File 'Stream.dat(JISAutoDetect)' copied to 'aaa.dat(MS932)'.
      
    167. (オプション)
      さらに、上記のファイルをコピーするアプリケーション"FileCopy.java"につぎのオプションを加えてください。("FileCopy.java")
      1. import java.io.*;
      2. public class FileCopy {
      3. public static void main(String[] args) {
      4. // 前問と同じ。
      5. if (outf.equals("")) {
      6. if (fc.encodeFile(ie, oe, inf)) {
      7. System.err.println("File '" + inf + "(" + ie
      8. + ")' encoded to '" + oe + "'.");
      9. } else {
      10. System.err.println("File '" + inf
      11. + "' does not encorded.");
      12. }
      13. } else {
      14. if (fc.copyFile(ie, oe, inf, outf)) {
      15. // 前問と同じ。
      16. }
      17. }
      18. }
      19. public boolean encodeFile(String inFileEncoding,
      20. String outFileEncoding,
      21. String fileName) {
      22. String tmpFileName = fileName + ".tmp";
      23. // コードを記述してください。
      24. return deleteFile(tmpFileName);
      25. }
      26. public boolean deleteFile(String fileName) {
      27. // コードを記述してください。
      28. }
      29. public boolean copyFile(String inFileEncoding,
      30. String outFileEncoding,
      31. String inFileName,
      32. String outFileName) {
      33. // 前問と同じ。
      34. }
      35. }

      □ 実行結果

      $ java FileCopy -ie EUC_JP aaaa.txt
      File 'aaaa.txt(EUC_JP)' encoded to 'MS932'.
      
    168. (オプション)
      さらに、上記のファイルをコピーするアプリケーション"FileCopy.java"をパッケージ化(パッケージ名maruno)して、どのディレクトリーからでも使えるようにしてください。("FileCopy.java")
    169. $ javac -d . FileCopy.java
      $ jar -cf maruno.jar maruno/*.class
      $ cp maruno.jar $JAVA_HOME/jre/lib/ext/
      

      □ 実行結果

      $ java -cp $JAVA_HOME/jre/lib/ext/maruno.jar maruno.FileCopy -ie EUC_JP aaaa.txt
      File 'aaaa.txt(EUC_JP)' encoded to 'MS932'.
      

      標準入出力

    170. 標準入力から入力した 1 バイトずつのデータを標準出力に出力するアプリケーション"Sysin2Sysout.java"を作成ください。入力の終了は"Ctrl+C"キーの押下によります。(この問題は例題からとっています。)
      1. import java.io.*;
      2. public class Sysin2Sysout {
      3. public static void main (String[] args) {
      4. int b;
      5. try {
      6. while ((b = System.in.read()) != -1) {
      7. System.out.println("char = " + (char)b + ", hex = " +
      8. Integer.toHexString(b));
      9. }
      10. } catch (IOException e) {
      11. e.printStackTrace();
      12. }
      13. }
      14. }

      □ 実行結果

      $ java Sysin2Sysout
      Hello                  <-- 入力したデータ  
      char = H, hex = 48
      char = e, hex = 65
      char = l, hex = 6c
      char = l, hex = 6c
      char = o, hex = 6f
      , hex = d
      char =
      , hex = a
      あいうえお             <-- 入力したデータ  
      char = ?, hex = 82
      char = ?, hex = a0
      char = ?, hex = 82
      char = ¢, hex = a2
      char = ?, hex = 82
      char = ?, hex = a4
      char = ?, hex = 82
      char = ?, hex = a6
      char = ?, hex = 82
      char = ¨, hex = a8
      , hex = d
      char =
      , hex = a
      
    171. 標準入力からの入力に、日本語が使用できるようにするアプリケーション"Sysin2SysoutWithJp.java"を作成ください。入力の終了は"Ctrl+C"キーの押下によります。(この問題は例題からとっています。)
      1. import java.io.*;
      2. public class Sysin2SysoutWithJp {
      3. public static void main (String[] args) {
      4. BufferedReader sysin
      5. = new BufferedReader(new InputStreamReader(System.in));
      6. String str = null;
      7. try {
      8. while ((str = sysin.readLine()) != null) {
      9. System.out.println(str);
      10. }
      11. } catch (Exception e) {
      12. e.printStackTrace();
      13. }
      14. }
      15. }

      □ 実行結果

      $ java Sysin2Sysout
      入力データ <-- 入力したデータ  
      入力データ <-- 出力されたデータ
      出力データ <-- 入力したデータ  
      出力データ <-- 出力されたデータ
      

    172. 上記アプリケーション"Sysin2Sysout.java"をつぎのように改造してください。("Sysin2Sysout02.java")
    173. □ 実行結果

      $ java Sysin2Sysout02
      Hello
      out: Hello
      err: Hello
      Java
      out: Java
      err: Java
      World!
      out: World!
      err: World!
      
    174. 標準入力から数字(整数)を入力して、その合計を標準出力に出すアプリケーション"Sum11.java"を作成してください。
      入力の終了は、"q" または "Q" キーの押下によることとします。
      1. import java.io.*;
      2. public class Sum11 {
      3. public static void main (String[] args) {
      4. BufferedReader sysin = /* コードを記述してください。*/ ;
      5. String str = null;
      6. int sum = 0;
      7. try {
      8. while (/* コードを記述してください。*/) {
      9. if (/* コードを記述してください。*/) {
      10. break;
      11. }
      12. // コードを記述してください。
      13. }
      14. } catch (IOException e) {
      15. System.out.println("IOException");
      16. } catch (Exception e) {
      17. e.printStackTrace();
      18. }
      19. System.out.println("sum = " + sum);
      20. }
      21. }

      □ 実行結果

      $ java Sum11
      22
      44
      66
      -99
      q
      sum = 33
      
    175. (オプション)
      上記"Sum11.java"を改造して、入力に数字以外が入力されたら、標準エラー出力にメッセージを出力するアプリケーション"Sum12.java"を作成してください。
      入力の終了は、"q" または "Q" キーの押下によることとします。
      1. import java.io.*;
      2. public class Sum12 {
      3. public static void main (String[] args) {
      4. BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
      5. String str = null;
      6. int sum = 0;
      7. try {
      8. // コードを記述してください。
      9. } catch (IOException e) {
      10. System.err.println("IOException");
      11. } catch (Exception e) {
      12. e.printStackTrace();
      13. }
      14. System.out.println("sum = " + sum);
      15. }
      16. }

      □ 実行結果

      $ java Sum12
      22
      44
      rr
      NumberFormatException for input rr
      66
      ii
      NumberFormatException for input ii
      -99
      qq
      NumberFormatException for input qq
      q
      sum = 33
      
    176. Linuxのgrepコマンドのように、標準入力から入れたテキスト・データから、コマンドラインで指定した文字列が含まれている行を標準出力に出力するアプリケーション"Grep01.java"をを作成してください。
      1. import java.io.*;
      2. public class Grep01 {
      3. public static void main (String[] args) {
      4. BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
      5. String str = null;
      6. try {
      7. // コードを記述してください。
      8. } catch (Exception e) {
      9. e.printStackTrace();
      10. }
      11. }
      12. }

      □ 実行結果

      $ cat Grep01.java | java Grep01 str
                      String str = null;
                              while ((str = sysin.readLine()) != null) {
                                      if (str.matches(".*" + args[0] + ".*")) {
                                              System.out.println(str);
      
    177. (オプション)
      じゃんけんゲームをするアプリケーション"Janken01.java"を作成してください。ゲームは、標準入力からグー(g)、チョキ(c)、パー(p)のいずれかを入力します。ゲームをやめるときには、xを入力します。そのとき、何勝何敗何分かを画面出力してください。
      1. import java.io.*;
      2. public class Janken01 {
      3. static BufferedReader br = null;
      4. public static void main(String[] args) {
      5. int draw = 0;
      6. int win = 0;
      7. int lose = 0;
      8. try {
      9. int user = -1;
      10. br = new BufferedReader(new InputStreamReader(System.in));
      11. while ((user = read()) != -1) {
      12. int computer = (int)(Math.random() * 3);
      13. // コードを記述してください。
      14. System.err.println(win + " 勝 " + lose + " 敗 " + draw + " 分 ");
      15. }
      16. System.out.println();
      17. System.out.println(win + " 勝 " + lose + " 敗 " + draw + " 分 ");
      18. }
      19. catch (IOException e) {
      20. e.printStackTrace();
      21. } finally {
      22. try {
      23. br.close();
      24. } catch (Exception e) {
      25. }
      26. }
      27. }
      28. public static int read() throws IOException {
      29. int user = -1;
      30. while ((user = read("グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> ")) != -1) {
      31. if (user >= 0 && user <= 3) {
      32. break;
      33. }
      34. }
      35. return user;
      36. }
      37. public static int read(String message) throws IOException {
      38. System.out.print(message);
      39. String str = br.readLine();
      40. if (str == null) {
      41. return -1;
      42. }
      43. int user = -1;
      44. // コードを記述してください。
      45. }
      46. }

      □ 実行結果

      $ java Janken01
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> g
      あなたの勝
      1 勝 0 敗 0 分
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> g
      あなたの敗け
      1 勝 1 敗 0 分
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> c
      引き分け
      1 勝 1 敗 1 分
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> c
      引き分け
      1 勝 1 敗 2 分
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> p
      あなたの勝
      2 勝 1 敗 2 分
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> p
      あなたの勝
      3 勝 1 敗 2 分
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> d
      グー(g), チョキ(c), パー(p), 終了(x)を入力してください。==> x
      
      3 勝 1 敗 2 分
      
    178. (オプション)
      数あてゲームをするアプリケーション"NumberGuess01.java"を作成してください。
      ゲームは、コンピューターが選んだ3桁の数字に対して、標準入力から3桁の数字を入力します。なお、3桁の数字には同じ数字はないものとします。アプリケーションは、桁は間違っているが、一致している数字の数と、桁もあっている数字の数を画面出力します。3桁の数字があえばゲーム終了です。このとき、何回で当てたかを画面出力します。 ださい。
      1. import java.io.*;
      2. public class NumberGuess01 {
      3. private static BufferedReader br = null;
      4. public static void main(String[] args) {
      5. int computer = getNumber();
      6. System.err.println("computer = " + computer);
      7. int[] n = new int[2];
      8. try {
      9. br = new BufferedReader(new InputStreamReader(System.in));
      10. int user;
      11. int count = 0;
      12. while ((user = read()) != -1) {
      13. n = checkNumbers(user, computer);
      14. if (user == computer) {
      15. System.out.println("ビンゴ! " + count);
      16. break;
      17. }
      18. System.out.println("桁違いの同じ数 = " + n[0]);
      19. System.out.println("  一致した数 = " + n[1]);
      20. System.out.println();
      21. }
      22. }
      23. catch (IOException e) {
      24. e.printStackTrace();
      25. } finally {
      26. try {
      27. br.close();
      28. } catch (Exception e) {
      29. }
      30. }
      31. }
      32. public static int[] checkNumbers(int u, int c) {
      33. // コードを記述してください。
      34. return n;
      35. }
      36. public static int getNumber() {
      37. // コードを記述してください。
      38. }
      39. public static int read() throws IOException {
      40. int user = -1;
      41. while ((user = read("2桁-3桁の正整数をを入力してください。==> ")) != -1) {
      42. if (user >= 10 && user <= 999) {
      43. break;
      44. }
      45. }
      46. return user;
      47. }
      48. public static int read(String message) throws IOException {
      49. System.out.print(message);
      50. String str = br.readLine();
      51. if (str == null) {
      52. return 0;
      53. }
      54. int user = 0;
      55. try {
      56. user = Integer.parseInt(str);
      57. } catch (NumberFormatException e) {
      58. }
      59. return user;
      60. }
      61. }

      □ 実行結果

      $ java NumberGuess01 2> null
      2桁-3桁の正整数をを入力してください。==> 123
      桁違いの同じ数 = 1
        一致した数 = 0
      
      2桁-3桁の正整数をを入力してください。==> 124
      桁違いの同じ数 = 0
        一致した数 = 0
      
      2桁-3桁の正整数をを入力してください。==> 345
      桁違いの同じ数 = 0
        一致した数 = 1
      
      2桁-3桁の正整数をを入力してください。==> 367
      桁違いの同じ数 = 1
        一致した数 = 1
      
      2桁-3桁の正整数をを入力してください。==> 378
      桁違いの同じ数 = 0
        一致した数 = 2
      
      2桁-3桁の正整数をを入力してください。==> 379
      ビンゴ! 6
      
    Top

    inserted by FC2 system