[ Java練習問題 ] 練習問題 第7回 『配列 ②』

目次

配列応用

Java練習問題 第7回では「配列」についての問題を用意してあります。
「配列」の解説はこちら

問題 5 難易度 ★★★★

① 以下の二つの配列を用いてじゃんけんゲームプログラムを作成してください。
配列をうまく使うと、トータル 25 行ほどのコードで完成できます。

実行例

じゃんけんゲーム始めるよー
PC と勝負です!
あなたの手を数字で選んでください
0:ぐー 1:ちょき 2:ぱー
0
あなたの手は「ぐー」、PC の手は「ちょき」。
あなたの勝ちです。

問題 5 解答

正解は、、、
public class Main_0405 {
  public static void main(String[] args) {
    String[] results = { "あいこ", "PC の勝ち", "あなたの勝ち" };
    String[] hands = { "ぐー", "ちょき", "ぱー" };
    
    System.out.println("じゃんけんゲーム始めるよー");
    System.out.println("PC と勝負です!");
    System.out.println("あなたの手を数字で選んでください");
    
    for (int i = 0; i < hands.length; i++) {
      System.out.print(i + ":" + hands[i] + "\t ");
    }
    
    System.out.println();
    int userHand = new java.util.Scanner(System.in).nextInt();
    int pcHand = new java.util.Random().nextInt(3);
    System.out.println("あなたの手は「" + hands[userHand] + "」、"
      + "PC の手は「" + hands[pcHand] + "」。");
    System.out.println(results[(userHand - pcHand + 3) % 3] + "です。");
  }
}

多次元配列

問題 6 難易度 ★★★

「国語」、「数学」、「英語」の三科目の試験結果集計プログラムの作成です。
人数入力、点数入力、一覧表の表示、生徒毎の合計点表示、科目ごとの平均点表示を行います。

① 以下の実行結果例となるようにプログラムを完成させてください。
平均点は小数点以下切り捨て表示、点数入力は 0~100 の整数のみとします。

実行例

生徒の人数を整数で入力してください
2
1 番目の生徒の国語の点数を入力してください。
22
1 番目の生徒の数学の点数を入力してください。
33
1 番目の生徒の英語の点数を入力してください。
44
2 番目の生徒の国語の点数を入力してください。
552 番目の生徒の数学の点数を入力してください。
66
2 番目の生徒の英語の点数を入力してください。
77
成績一覧表国語 数学 英語
1 人目 22 33 44
2 人目 55 66 77
表示したい内容を数値で入力してください
1. 生徒ごとの合計点
2. 科目ごとの平均点
プログラム終了は、0 を入力してください
1
1 番目の生徒の合計点は 99 点です。
2 番目の生徒の合計点は 198 点です。
表示したい内容を数値で入力してください
1. 生徒ごとの合計点
2. 科目ごとの平均点
プログラム終了は、0 を入力してください
2
国語の平均点は 38 点です。
数学の平均点は 49 点です。
英語の平均点は 60 点です。

表示したい内容を数値で入力してください
1. 生徒ごとの合計点
2. 科目ごとの平均点
プログラム終了は、0 を入力してください
0
プログラムを終了しました

問題 6 解答

正解は、、、
public class Main_0406 {
  public static void main(String[] args) {
    String[] subjects = { "国語", "数学", "英語" };
    System.out.println("生徒の人数を整数で入力してください");
    int num = new java.util.Scanner(System.in).nextInt();
    int[][] scores = new int[num][subjects.length];
    
    for (int i = 0; i < scores.length; i++) {
      System.out.println();
      for (int j = 0; j < scores[i].length; j++) {
        System.out.println(
          (i + 1) + "番目の生徒の" + subjects[j] + "の点数を入力してください。");
        int score = new java.util.Scanner(System.in).nextInt();
        scores[i][j] = score;
      }
    }
    System.out.println();
    System.out.println("**成績一覧表**");
    //見出し行「 国語 数学 英語」を出力
    for (int i = 0; i < subjects.length; i++) {
      System.out.print("\t\t" + subjects[i]);
    }
    System.out.println();
    
    //点数一覧を表示
    for (int i = 0; i < scores.length; i++) {
      System.out.print((i + 1) + "人目 \t");
      for (int j = 0; j < scores[i].length; j++) {
        System.out.print(scores[i][j] + "\t\t");
      }
      System.out.println();
    }
    
    while (true) {
      System.out.println("\n 表示したい内容を数値で入力してください");
      System.out.println("1. 生徒ごとの合計点");
      System.out.println("2. 科目ごとの平均点");
      System.out.println("プログラム終了は、0 を入力してください");
      
      int n = new java.util.Scanner(System.in).nextInt();
      if (n == 1) {
        //生徒ごとの合計点計算と表示
        for (int i = 0; i < scores.length; i++) {
          int sum = 0;
          for (int j = 0; j < scores[i].length; j++) {
            sum += scores[i][j];
          }
          System.out.println((i + 1) + "番目の生徒の合計点は" + sum + "点です。");
        }
  
      } else if (n == 2) {
        //科目ごとの平均点計算と表示
        for (int i = 0; i < subjects.length; i++) {
          int sum = 0;
          for (int j = 0; j < scores.length; j++) {
            sum += scores[j][i];
          }
          System.out.println(
            subjects[i] + "の平均点は" + sum / num + "点です。");
        }
      } else if (n == 0) {
        break;
      }
    }
    System.out.println("プログラムを終了しました");
  }
}

問題 7 難易度 ★★★

① 下記のような座席表出力プログラムがあります。
前後左右を反転させて、講師席から見てわかりやすい出力をしてください。

public class Main_0407 {
  public static void main(String[] args) {
    String[][] positionAry = { //
      { "佐藤", "鈴木", "高橋", "田中" }, //
      { "伊藤", "渡辺", "山本", "中村" }, //
      { "小林", "加藤", "吉田", "山田" }, //
      { "山口", "松本", "井上", "木村" }, //
    };
    System.out.println(" 講師席");
    for (int i = 0; i < positionAry.length; i++) {
    for (int j = 0; j < positionAry[i].length; j++) {
    System.out.print(positionAry[i][j] + " ");
    }
    System.out.println();
    }
  }
}

実行例

講師席
佐藤 鈴木 高橋 田中
伊藤 渡辺 山本 中村
小林 加藤 吉田 山田
山口 松本 井上 木村
木村 井上 松本 山口

山田 吉田 加藤 小林
中村 山本 渡辺 伊藤
田中 高橋 鈴木 佐藤
講師席

問題 7 解答

正解は、、、
public class Main_0407 {
  public static void main(String[] args) {
    String[][] positionAry = { //
      { "佐藤", "鈴木", "高橋", "田中" }, //
      { "伊藤", "渡辺", "山本", "中村" }, //
      { "小林", "加藤", "吉田", "山田" }, //
      { "山口", "松本", "井上", "木村" }, //
    };
    System.out.println(" 講師席");
    
    for (int i = 0; i < positionAry.length; i++) {
      for (int j = 0; j < positionAry[i].length; j++) {
        System.out.print(positionAry[i][j] + " ");
      }
      System.out.println();
    }
    System.out.println();
    for (int i = positionAry.length - 1; i >= 0; i--) {
      for (int j = positionAry[i].length - 1; j >= 0; j--) {
        System.out.print(positionAry[i][j] + " ");
      }
      System.out.println();
    }
    System.out.println(" 講師席");
  }
}

問題 8 難易度 ★★★★

① マインスイーパのマップ準備プログラムを作成してください。
ユーザーの指定した数値を元にランダムに地雷(*)を配置してください。
地雷の数の上限は(マスの総数-1)としてください。

実行例

一辺のマス数を、2 以上かつ 26 以下の整数で入力してください
10
地雷の数を、99 以下の整数で入力してください
30
a b c d e f g h i j
+—+—+—+—+—+—+—+—+—+—+
1 | | | | | * | * | * | | | |
+—+—+—+—+—+—+—+—+—+—+
2 | | * | | | * | | | | | * |
+—+—+—+—+—+—+—+—+—+—+
3 | * | | | | | | | | * | * |
+—+—+—+—+—+—+—+—+—+—+
4 | | * | | | * | | | | | |
+—+—+—+—+—+—+—+—+—+—+
5 | * | * | | | | | | | | |
+—+—+—+—+—+—+—+—+—+—+
6 | * | | | | | * | * | * | * | * |
+—+—+—+—+—+—+—+—+—+—+
7 | | | * | | | | | | | |
+—+—+—+—+—+—+—+—+—+—+
8 | | | | * | | | | | | * |
+—+—+—+—+—+—+—+—+—+—+
9 | * | * | | * | * | * | * | | | * |
+—+—+—+—+—+—+—+—+—+—+
10 | | | | | | * | | | | |
+—+—+—+—+—+—+—+—+—+—+

問題 8 解答

正解は、、、
public class Main_0408 {
  public static void main(String[] args) {
    System.out.println("一辺のマス数を、2 以上かつ 26 以下の整数で入力してください");
    //一辺のマスの数
    int size = new java.util.Scanner(System.in).nextInt();
    System.out.println("地雷の数を、"+(size * size -1)+"以下の整数で入力してください");
    //地雷の数
    int numMine = new java.util.Scanner(System.in).nextInt();
    
    //ユーザー指定サイズの二次元配列をマスとする
    String[][] map = new String[size][size];
    //各マスの中身を半角スペースで初期化
    for (int i = 0; i < map.length; i++) {
      for (int j = 0; j < map[i].length; j++) {
        map[i][j] = " ";
      }
    }
    while (numMine > 0) {
      int x = new java.util.Random().nextInt(size);
      int y = new java.util.Random().nextInt(size);
      //ランダムに抽出した座標が半角スペースだったら地雷を配置し、
      //未配置の地雷数をデクリメントする
      if (map[x][y].equals(" ")) {
        map[x][y] = "*";
        numMine--;
      }
    }
    System.out.println();
    System.out.print(" ");
    //列名の表示
    char colName = 'a';
    for (int j = 0; j < size; j++) {
      System.out.print(" " + colName);
      colName++;
    }
    System.out.println();
    //罫線を交えながら二次元配列の中身を表示
    for (int i = 0; i < map.length; i++) {
      System.out.print(" ");
      for (int j = 0; j < size; j++) {
        System.out.print("+---");
      }
      System.out.println("+");
      if (i + 1 < 10) {
        System.out.print(" ");
      }
      System.out.print(i + 1 + " ");
      for (int j = 0; j < map[i].length; j++) {
        System.out.print("| " + map[i][j] + " ");
      }
      System.out.println("|");
    }
    System.out.print(" ");
    for (int j = 0; j < size; j++) {
      System.out.print("+---");
    }
    System.out.println("+");
  }
}

Java練習問題 第8回では「メソッド」から出題します。

(Visited 278 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次