import java.util.Random;
import java.util.Scanner;
public class MyClass {
// 乱数を全体で共有 static Random rnd; // 整数の単調増加配列を作成(増分0-2) static int[] make_ints_s(int n) { int[] x = new int[n]; int sum = 0; for(int i = 0; i < n; i++) { sum += (int)(Math.pow(rnd.nextDouble(), 2) * 3); x[i] = sum; } 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ここから * 探索値がデータ列中に複数あっても全てを列挙できるよう * メソッド binarySearch2() を修正しなさい. */ static int[] binarySearch2(int sv, int[] x) { int cnt = 1; int[] fi = new int[x.length+1]; int li = 0; int ri = x.length - 1; while(li <= ri) { // 左端と右端が入れ替わったら終了 int i = (int)((li + ri) / 2); System.out.printf("[%03d] ", cnt++); print_presp(i); if(x[i] == sv) { // 発見したら System.out.println("++ "); while() { System.out.printf("[%03d] ", cnt++); print_presp(i); System.out.println("++ "); } break; } else { System.out.println("-- "); } if(x[i] < sv){ li = i + 1; // 右に絞る } else { ri = i - 1; // 左に絞る } } 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_s(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 = binarySearch2(sv, x); // 結果を表示 System.out.print("val_1 "); print_value(x); System.out.print("val_2 "); print_value(strs); print_index(x.length); /* 指示2ここから * 条件式を適切に補いなさい. */ if() { System.out.println(sv + "は見つかりませんでした"); } else { int i = 0; while(fi[i] >= 0) { System.out.println(sv + "は" + fi[i] + "番目にあります"); System.out.println("対応する文字列は " + strs[fi[i]] + " です"); i++; } } // 指示2ここまで }
}
「わからない」と先生に素直に言いましょう。
タイトルに情報がありません。
コードはコードブロック記法で読みやすいようにしましょう。
なにより、質問がどこにも書いてありません。
https://teratail.com/help/question-tips には一通り目を通しましょう。
一個ずつ読んでいけばさほど難しいことは書いてないですよ。
解ける事より自分で考える事が一番大事。
脳の訓練は本人の意思だけが頼りなので、悩めば悩むほど良いってもんです。
あなたが何がわからないのかわかりません(w
あなたの回答
tips
プレビュー