• ベストアンサー

配列の初期化に関する問題で・・・

Javaのプログラミングの問題で、下記のような問題が出ました。 要素数が10のint型配列aの各要素を順に3,12,7,20,15,5,8,18,10,16で初期化し、 キーボードから入力された値が配列の何番目に格納されているかを表示するプログラムを作成してください。 ただし、データが配列の中に存在しない場合は「○○は見つかりませんでした」と表示してください。 「if文を使って場合分けする」というヒントがありましたが よくわかりません。 下記のように考えてみたのですが、思うようになりません。 教えて頂けたらと思います。 import java.io.*; public class renshu { public static void main(String[] args)throws IOException { int a[]={3,12,7,20,15,5,8,18,10,16}; int n; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("探索する数字を入力してください>"); n=Integer.parseInt(br.readLine()); a=Integer.parseInt(br.readLine()); switch(a){ case 3: System.out.print(a+"はa[1]に格納されています。"); break; case 12: System.out.print(a+"はa[2]に格納されています。"); break; case 7: ~~~~~(省略) break; default; System.out.print(a+"は見つかりませんでした。") } } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

public static void main(String[] args)throws IOException{ int a[]={3,12,7,20,15,5,8,18,10,16}; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("探索する数字を入力してください>"); int n = Integer.parseInt(br.readLine()); boolean isFind = false; for ( int i = 0 ; i < [配列の要素数] ; i ++ ){ if ( a[i] == n ){ System.out.print(n + "はa[" + [ループの回数] + "]に格納されています。"); [見つけた場合] break; } } if ( [見つからなかった] ){ System.out.print(n + "は見つかりませんでした。"); } } ヒントだけ。 []の中身を考えましょう。

gatetsu38
質問者

お礼

早速のご回答ありがとうございます。 for(int n=0 ; i<10 ; i++){ if(a[i]=n){ System.out.print(n+"は"a["+10]+")に格納されています。"); break; else{ System.out.print(n+"は見つかりませんでした。"); } } でしょうか? まだイマイチわかりません・・・ 宜しければまた教えて頂ければ幸いです。

その他の回答 (4)

回答No.5

#3氏がすべて補足してますけど。 for ( int i = 0 ; i<10 ; i ++ ){ if ( a[i] == n ){ System.out.print(n + "はa["+i+"]に格納されています。"); if(???) →ここに来る時点で配列内に入力された数字と同じものが存在してるのは理解していますか? break; } } if (a[i]!=n){ →やってることが前回のelseの場合と同じなので無意味です System.out.print(n + "は見つかりませんでした。"); } } ループ中比較して不一致の場合毎回「System.out.print(n + "は見つかりませんでした。"); 」と表示されますけど、これは意図した動作でしょうか?もしそうだとしたら私の指摘している内容は忘れてください。 私の出したサンプルは回答の1例なので、別の回答もあります。 (例えばループの回数を数えておいて配列の要素数とループ回数が一致する場合は全部調べたけど存在しない、途中でループを終了した場合配列の要素数とループ回数が不一致になるので見つかった、という考え方もあります、この場合見つかったかどうかの判別用のフラグが必要ない、そのかわりループ回数を保持する変数が必要)

  • zionic
  • ベストアンサー率39% (31/79)
回答No.4

ループの中でelseをつかってしまうとたとえ配列aに数字があっても、それが見つかるまで出てしまいます。 たとえば入力が10だった場合は  a[0]にない→elseの処理をする。  a[1]にない→elseの処理をする。 という感じで、10が見つかるまで「見つかりません」というメッセージがでてしまいます。 それは、意図したことじゃないですよね? なので考え方としては、  ・ループ処理で入力値が配列の中にあるかチェックする。  ・見つかったら、ループを抜ける。   そのときに、「見つかった」という印をつける(フラグ)  ・配列をすべてチェックして見つからなくてもループを抜ける。  ・このときフラグは「見つからない」とする。  ・ループ処理の後に「フラグ」の内容を確認する。  ・フラグの内容が「見つからない」だったら「見つからない」というメッセージを表示する。 という考え方でもう一度No.2さんのコードを見直してみるといいですよ。

gatetsu38
質問者

お礼

ご丁寧な解説、ありがとうございます。 教えて頂いたヒントと、教科書を参考に下記のように組んでみたところ、 問題に沿う結果が出ました。 import java.io.*; public class renshu { public static void main(String[] args) throws IOException { int a={3, 12, 7, 20, 15, 5, 8, 18, 10, 16}; int i,n; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("探索する数を入力してください>"); n=Integer.parseInt(br.readLine()); for(i=0 ; i<a.length ; i++) { if(a[i]==n) break; } if(i!=a.length){ System.out.println(n + "はa[" + i + "]に格納されています。"); } else{ System.out.println(n + "は見つかりませんでした。"); } } } ありがとうございました。

回答No.3

for ( int i = 0 ; i < [配列の要素数] ; i ++ ){ if ( a[i] = n ){ //if ( a[i] == n ){ 正確に書き写そう System.out.print(n + "はa[" + [ループの回数] + "]に格納されています。"); /*ちょい言葉がわかりにくかったかもですね。 [ループの現在の値]で考え直してみてください。 [見つけた場合] →ここにも何か処理が必要 */ break; } } ちなみに if ( a[i] == n ){ //省略 } else { System.out.print(n+"は見つかりませんでした。"); } 質問者さんのコードの↑の部分、elseで「nが見つかりませんでした」と出力されちゃうのでここ間違ってますよ。

gatetsu38
質問者

お礼

考えてみたのですがよくわかりません・・・ 見つけた場合の処理は「~に格納されています」だけではないのでしょうか。 又、elseで見つからなかった場合を表せるのかと思ったのですが・・・ for ( int i = 0 ; i<10 ; i ++ ){ if ( a[i] == n ){ System.out.print(n + "はa["+i+"]に格納されています。"); if(???) break; } } if (a[i]!=n){ System.out.print(n + "は見つかりませんでした。"); } } 度々申し訳ありません。

回答No.1

ヒントにif文ってあるのにswitch文を使うの?

gatetsu38
質問者

お礼

if文でどのように書いていいのかわからずにこうなってしまいました・・・

関連するQ&A