import java.util.Random;
import java.util.Scanner;
import java.util.Arrays;
class MyClass {
// 乱数を全体で共有
static Random rnd;
// 整数乱数(0-19)配列を作成
static int[] make_ints_r(int n) {
int[] x = new int[n];
for(int i = 0; i < n; i++) {
x[i] = (int)(rnd.nextDouble() * 20);
}
return x;
}
// ランダムな英数文字列(2文字)配列を作成
static String[] make_strs(int n) {
char[] c_map = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
int c_len = c_map.length;
String[] strs = new String[n];
for(int i = 0; i < n; i++) {
char[] c_tmp = new char[2];
for(int j = 0; j < c_tmp.length; j++) {
c_tmp[j] = c_map[(int)(rnd.nextDouble() * c_len)];
}
strs[i] = new String(c_tmp);
}
return strs;
}
// 整数配列を表示
static void print_value(int[] x) {
for(int i = 0; i < x.length; i++) {
System.out.printf("%2d,", x[i]);
}
System.out.println();
}
// 文字列配列を表示
static void print_value(String[] x) {
for(int i = 0; i < x.length; i++) {
System.out.printf("%s,", x[i]);
}
System.out.println();
}
// 目盛を表示
static void print_index(int n) {
// 分かりやすさのため色付け(コンソールのみ)
System.out.print("index\033[4;103m|");
for(int i = 0; i < n; i++) {
System.out.printf("%2d|", i);
}
// 色付けをリセット
System.out.println("\033[0m");
}
// 探索位置の前までを空白で表示
static void print_presp(int n) {
for(int i = 0; i < n; i++) {
System.out.print(" ");
}
}
/* 線形探索(複数の結果に対応)
- 探索する値の配列中の位置を返す(途中経過も出力)
- sv: 探索する値(整数)
- x: 配列(整数)
/
/ 指示1ここから
- 探索値がデータ列中に複数あっても全てを列挙できるよう
- メソッド linearSearch2() を修正しなさい.
*/
static int[] linearSearch2(int sv, int[] x) {
int cnt = 1;
int j = 0;
int[] fi = new int[x.length+1];
Arrays.fill(fi, -1);
for(int i = 0; i < x.length; i++) {
System.out.printf("[%03d] ", cnt++);
print_presp(i);
if(x[i] == sv) { // 発見したら
System.out.println("++ ");
fi[j++] = i;
}
else{
System.out.println("-- ");
}
}
return fi;
}
// 指示1ここまで
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 乱数を準備
System.out.print("乱数の種(入力が整数以外なら自動設定):");
// 整数が入力された場合は,それを種とする
if(scan.hasNextLong()) {
rnd = new Random(scan.nextLong());
}
else {
rnd = new Random();
scan.nextLine(); // 入力を捨てる
}
// 各変数の宣言
int[] x = make_ints_r(30); // 整数データ列
String[] strs = make_strs(30); // 対応する文字列の列
int sv; // 探索値
int[] fi; // 探索結果
// 探索値を設定(0-9)
System.out.print("探索値(入力が整数以外なら自動設定):");
// 整数以外が入力された場合は乱数(0-9)
if(scan.hasNextInt()) {
sv = scan.nextInt();
}
else {
sv = (int)(rnd.nextDouble()*10);
scan.nextLine(); // 入力を捨てる
}
System.out.println(""); // 改行のみ
scan.close(); // データ読み込みの完了
// ヘッダー部を表示
System.out.println(sv + "を探します");
print_index(x.length);
System.out.print("val_1 ");
print_value(x);
System.out.print("val_2 ");
print_value(strs);
// 線形探索を実施
fi = linearSearch2(sv, x);
// 結果を表示
System.out.print("val_1 ");
print_value(x);
System.out.print("val_2 ");
print_value(strs);
print_index(x.length);
/* 指示2ここから
- 条件式を適切に補いなさい.
*/
if(fi[0] < 0) {
System.out.println(sv + "は見つかりませんでした");
}
else {
int i = 0;
while(fi[i] >= 0) {
System.out.println(sv + "は" + (fi[i] + 1) + "番目にあります");
System.out.println("対応する文字列は " + strs[fi[i]] + " です");
i++;
}
}
// 指示2ここまで
}
}
あなたの回答
tips
プレビュー