エンジニア成長日記 swaponQ

コンピュータサイエンス専攻の一般人のブログです。

新・明解 Java 入門 演習 6-9, 6-10, 6-11, 6-12 解答

Hello, Terminal!swaponQです!

今回は演習 6-9, 6-10, 6-11, 6-12 に取り組んでいこうと思います。

  • 演習 6-9

要素型がint型である配列を作り、全要素を1〜10の乱数で埋め尽くす(1以上10以下の値を代入する)プログラムを作成せよ。要素数はキーボードから読み込むこと。


ソースコード

import java.util.Random;
import java.util.Scanner;

class ex06_9 {
	public static void main(String[] args) {
		Random rand = new Random();
		Scanner stdIn = new Scanner(System.in);
		int n;
		do {
			System.out.print("要素数:");
			n = stdIn.nextInt();
		} while (n < 1);
		int[] a = new int[n];
		for (int i = 0; i < a.length; i++) {
			int r = rand.nextInt(10) + 1;
			a[i] = r;
			System.out.printf("a[%d] = %d\n", i, a[i]);
		}
	}
}

・実行結果

要素数:10
a[0] = 6
a[1] = 4
a[2] = 10
a[3] = 8
a[4] = 4
a[5] = 8
a[6] = 8
a[7] = 8
a[8] = 6
a[9] = 8
  • 演習 6-10

連続する要素が同じ値をもつことのないように6-9のプログラムを改良したプログラムを作成せよ。

ソースコード

import java.util.Random;
import java.util.Scanner;

class ex06_10 {
	public static void main(String[] args) {
		Random rand = new Random();
		Scanner stdIn = new Scanner(System.in);
		int n;
		do {
			System.out.print("要素数:");
			n = stdIn.nextInt();
		} while (n < 1 || n > 10);
		int[] a = new int[n];
		int r = 0;
		for (int i = 0; i < a.length; i++) {
			if (i == 0) {
				r = rand.nextInt(10) + 1;
				a[i] = r;
			}
			else if (i > 0) {
				do {
					r = rand.nextInt(10) + 1;
					a[i] = r;
				} while (a[i] == a[i - 1]);
			}
			System.out.printf("a[%d] = %d\n", i, a[i]);
		}
	}
}

・実行結果

要素数:10
a[0] = 5
a[1] = 2
a[2] = 9
a[3] = 7
a[4] = 8
a[5] = 4
a[6] = 7
a[7] = 1
a[8] = 9
a[9] = 2
  • 演習 6-11

異なる要素が同じ値をもつことのないように6-9のプログラムを改良したプログラムを作成せよ。配列の要素数は10以下とする。

ソースコード

import java.util.Random;
import java.util.Scanner;

class ex06_11 {
	public static void main(String[] args) {
		Random rand = new Random();
		Scanner stdIn = new Scanner(System.in);
    System.out.print("要素数:");
		int n = stdIn.nextInt();
		int[] a = new int[n];
		int buf = 0;
		for (int i = 0; i < n; i++) {
			if (i == 0) {
				a[i] = rand.nextInt(10) + 1;
			} else {
				CHECK: while (true) {
					buf = rand.nextInt(10) + 1;
					for (int j = 0; j < i; j++) {
						if (a[j] == buf) {
							continue CHECK;
						}
					}
					a[i] = buf;
					break;
				}
			}
			System.out.printf("a[%d] = %d\n", i, a[i]);
		}
	}
}

・実行結果

要素数:10
a[0] = 8
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 10
a[5] = 7
a[6] = 9
a[7] = 5
a[8] = 1
a[9] = 6
  • 演習 6-12

配列の要素の並びをシャッフルする(ランダムな順と、なるようにかき混ぜる)プログラムを作成せよ。

ソースコード

import java.util.Random;
import java.util.Scanner;

class ex06_12 {
	public static void main(String[] args) {
		Random rand = new Random();
    Scanner stdIn = new Scanner(System.in);
    System.out.print("Number : ");
		int n = stdIn.nextInt();
		String[] s = new String[n];
    String[] ans = new String[n];
    for (int i = 0; i < n; i++) {
      if (i == 0){
        s[i] = "*";
      } else {
        s[i] = s[i - 1] + "*";
      }
      if (i < 10) {
        System.out.printf("s[ %d] = %s\n", i, s[i]);
      } else {
        System.out.printf("s[%d] = %s\n", i, s[i]);
      }
    }
    System.out.println("---------- shuffle ----------");
		int[] a = new int[n];
		int buf = 0;
		for (int i = 0; i < n; i++) {
			if (i == 0) {
				a[i] = rand.nextInt(n);
			} else {
				CHECK: while (true) {
					buf = rand.nextInt(n);
					for (int j = 0; j < i; j++) {
						if (a[j] == buf) {
							continue CHECK;
						}
					}
					a[i] = buf;
					break;
				}
			}
		}
		for (int i = 0; i < n; i++) {
			ans[i] = s[a[i]];
		}
    for (int i = 0; i < n; i++) {
      if (i < 10) {
        System.out.printf("s[ %d] = %s\n", i, ans[i]);
      } else {
        System.out.printf("s[%d] = %s\n", i, ans[i]);
      }
    }
	}
}

今回は可視化を目的に'*'で配列の中身を表現した。

・実行結果

Number : 10
s[ 0] = *
s[ 1] = **
s[ 2] = ***
s[ 3] = ****
s[ 4] = *****
s[ 5] = ******
s[ 6] = *******
s[ 7] = ********
s[ 8] = *********
s[ 9] = **********
---------- shuffle ----------
s[ 0] = *******
s[ 1] = **********
s[ 2] = *****
s[ 3] = **
s[ 4] = *
s[ 5] = ****
s[ 6] = *********
s[ 7] = ********
s[ 8] = ******
s[ 9] = ***

今回は以上です。お疲れ様でした!
次回は演習 6-13, 6-14, 6-15 です。

Goodbye, Terminal… swaponQでした!