ループが機能しない理由

このQ&Aのポイント
  • Javaのソースコードを使って、ループが機能しない理由について説明します。
  • 例外処理もなくエラーも返ってこないため、一度しか学生名が出力されない現象が発生します。
  • 問題の原因は、ループ内でkeyとIDの比較が誤って行われていることです。正しい比較を行うように修正する必要があります。
回答を見る
  • ベストアンサー

何故ループがしてくれないんですか?

口でいうよりもソースコード載せた方が早いので載せます import java.util.Scanner; class StudentsList2 { public static void main(String[] args){ System.out.println("学生番号(23,45,78,51,9)を入力してください>"); Scanner sc=new Scanner(System.in); StList list=new StList(); list.ID=new int[]{23,45,78,51,9}; list.name=new String[]{"荒川","神田","吉田","渡辺","木村"}; int key=Integer.parseInt(sc.next()); list.getName(key); } static class StList{ public String[] name; public int[] ID; void getName(int key){ for(int A=0; A<ID.length; A++){ if(key==ID[0]){ System.out.println(name[0]);break; }else{ if(key==ID[1]){ System.out.println(name[1]);break; }else{ if(key==ID[2]){ System.out.println(name[2]);break; }else{ if(key==ID[3]){ System.out.println(name[3]);break; }else{ if(key==ID[4]){ System.out.println(name[4]);break; } } } } } } } } } 例外処理もなくエラーもかえって来ないんですが一回しか学生名が出力しないです。 何故でしょうか? nameに入っている名前を出力しないといけないですよね。 「ここがおかしいよ」とかのアドバイスをお願いします

  • Java
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 補足ありがとうございました。 要するに何回も学生番号を入力できてその番号の学生名を出力したいということでしょうか。 まず何回も入力させるのであればScanner sc = new Scanner(System.in);を繰り返す必要があります。 その辺は難しいこと無いですので作ってみてください。 IDに該当する学生名を出すところですが元々の条件式ですと結果は正しく出ると思いますが、いかんせん汎用性がありませんしIDの個数が今より増えたときとてつもない条件式になります。 せっかくforを思いついたのであれば for ( int A = 0; A < ID.length; A ++ ) { if ( ID[A] == key ) { System.out.println ( name[A] ); break; } } これでどう動くか、実際にコンパイルする前に頭の中で動かしてみてください。 キー入力を何度も行わせるためのループとIDの配列の中に該当するIDがあるか調べるためのループがあります。

skybkird
質問者

お礼

たびたびありがとうございます まだコンパイル動かしていません。 ネット上なので信用しづらいとおもいますが・・・」 ↓これは思いつかなかったです。 for ( int A = 0; A < ID.length; A ++ ) { if ( ID[A] == key ) { System.out.println ( name[A] ); break; } } この文まだイメージつかないというか説明しづらいです。 後はキーボード入力の繰り返しが書いていないということですね? 考えて試してみます

その他の回答 (1)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 何をどうしようとしている仕様が明確にわからないので何ともいえませんが、 forで配列要素分のループをしている中でkeyとID配列の中身が一致した際に文字出力後breakをしています。 それではその場でループが終了します。 また現状の条件式ですと一つのキーにしか合致しないことになります。 >nameに入っている名前を出力しないといけないですよね。 これは作る人が決めることですのでわからないです。 具体的に実現したい動作ってどんな動きでしょうか。 例えば、入力された学生番号に合致する人の名前を出す  入力が23の場合は荒川

skybkird
質問者

お礼

有難うございます したいことはint型配列23とキーボード入力で23で比較して同じならString型に入っている配列[0]を"荒川"を出力したいです 同様にIDの45とキーボード入力の数字45を比較して同じならString[1]に入っている"神田"を出力です 後は以下略で、全員分のIDとキーボード入力を比較して同じなら出力したいです。 言葉足らずですみません。 まだプログラミングの初心者で説明しづらいです 後break文なんですが外すのもためしたんですが続けて入力できずこうコンソールに出力されました 荒川 荒川 荒川 荒川 荒川 だから結局break文に戻っているんですが・・・ 何故でしょうか? あともう少し解決できそうな気がするんですが・・・

関連するQ&A

  • java.util.Listについてです。

    以下の配列プログラムをava.util.Listを使うとどういう感じになるのでしょうか? 何卒ご回答よろしくお願い致します。 class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard( "山田一郎"); manager.addCustomerCard( "鈴木太郎"); manager.addCustomerCard( "田中次郎"); manager.printAllInfo(); } private CustomerCard[] customers = new CustomerCard[5]; private int index = 0; public void addCustomerCard(String name){ customers[index] = new CustomerCard(1 + index,name); index++; } public void printAllInfo() { System.out.print("ID =" + customers[0].id + ","); System.out.println("名前 = " + customers[0].name); System.out.print("ID =" + customers[1].id + ","); System.out.println("名前 = " + customers[1].name); System.out.print("ID =" + customers[2].id + ","); System.out.println("名前 = " + customers[2].name); } } class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } }

    • ベストアンサー
    • Java
  • どこに・・・

    import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("勝ち"); } else if(c== -1){ System.out.println("勝ち"); } else if(c==0){ System.out.println("あいこ"); } else if(c==1){ System.out.println("負け"); } else { System.out.println("負け"); } } } } いまjavaの勉強をしており、練習をかてね上のようにじゃんけんのプログラムを書きました。今の段階で、一様動くのですが、一回ごとにじゃんけんが終了されてしまいます。そこで繰り返し文のwhile(a != x)を使って数値を入力したら終了するように考えているんですが、whileをどこに入れたらいいのかがわかりません・・・ 自分でいろんなところに入れて試して見たんですが、無限ループになったりして、終了してくれません。どこにwhileを入れたらいいのでしょうか?それてもwhileじゃないほうがいいのでしょうか?アドバイスお願いします。

    • ベストアンサー
    • Java
  • 実行時のとエラーについて質問します

    SQL文を使ったプログラムを実行しようとするとエラーが 出てしまうのですが、解決方法を教えて下さい。 **** プログラム **************************************** (前略) public class DBAccessMainNaka{ public static void main(String args[])throws Exception{ DBAccessNaka naka = new DBAccessNaka(); System.out.println("操作を選択して下さい"); System.out.println("1.Insert Account 2.Select Account 3.Insert Trainee 4.Select Trainee"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); (中略) }else if(res == 2){ System.out.println("名前を入力して下さい"); String name2 = br.readLine(); Account account = nakajima.selectAccount(name2); System.out.println("「検索結果」"); System.out.println("id [" + account.getId() + "]"); System.out.println("name [" + account.getName() + "]"); System.out.println("money[" + account.getMoney() + "]"); (中略) } else if(res == 4){ System.out.println("名前(名)を入力して下さい"); String firstName = br.readLine(); List<Trainee> traineeList = new ArrayList<Trainee>(); traineeList.add((Trainee) nakajima.selectTrainee(firstName)); for(int i=0; i<traineeList.size(); i++){ Trainee trainee =(Trainee)traineeList.get(i); System.out.println("[検索結果]"); System.out.println("id [" + trainee.getId() + "]"); System.out.println("id [" + trainee.getlast_Name() + "]"); System.out.println("id [" + trainee.getfirst_Name() + "]"); System.out.println("id [" + trainee.getbirth_Day() + "]"); } } ************************************************************* res == 1と3のときは上手く実行出来るのですが、 res == 2を選択すると、java.sql.SQLException: ORA-00936: 式がありません。というエラーが出て、 res == 4を選択すると、java.lang.ClassCastExceptionが出てしまいます。 エラーの意味など色々調べたのですが解決出来なかったので、 間違っている記述があれば教えてください。 ただ、他のクラスも利用しているので分かりにくいかもしれないので その際は聞いていただければその部分についても書きます。 変な質問ですみませんが、よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのコンパイルエラーについてです。

    「これならわかるJava」という本でjavaを勉強してます。 以下のソースコードをコンパイルした所、 「注:DogList.java の操作は、未チェックまたは安全ではありません。 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください」 と、表示されます。 ネットで色々と調べてみましたが上手く行きません。 よろしくお願い致します。 import java.io.*; import java.util.*; class Dog { private String name; private int energy; public Dog(String n, int e){ name = n; if(e < 0) e = 0; energy = e; } public Dog(){ this("未定",50); } public void bark(){ if(energy == 0){ System.out.println("お腹が減ってほえられないよ。"); return; } System.out.println("わん、わん!"); energy--; } public void intro(){ System.out.println("僕の名前は" + name + "だ。わん。"); System.out.println("エネルギーは" + energy +"だ。わん。"); } public void eat(int e){ if(e < 0){ System.out.println("マイナスは与えられません。"); return; } energy += e; } public String getName(){ return name; } public void setName(String n){ name = n; } public int getEnergy(){ return energy; } public void setEnergy(int e){ if(e < 0) e = 0; energy = e; } public String toString(){ return "僕の名前は" + name + "だ。わん。\n" +"エネルギーは" + energy + "だ。わん。" ; } } class DogList { public static void main(String[] args) throws IOException { Vector dogs = new Vector(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str, name; int n, energy; for(;;){ System.out.println("名簿:どうしますか?"); System.out.println("1 一覧 2 追加 3 終了"); str = br.readLine(); n = Integer.parseInt(str); if(n == 1){ for(int i = 0; i < dogs.size(); i++){ ((Dog)dogs.elementAt(i)).intro(); System.out.println("-----"); } } else if(n == 2){ System.out.println("名前を入力:"); name = br.readLine(); System.out.println("エネルギーを入力:"); str = br.readLine(); energy = Integer.parseInt(str); dogs.addElement(new Dog(name, energy)); } else{ break; } } } }

    • ベストアンサー
    • Java
  • 例外処理

    import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int k=0,m=0,h=0,z=0; while(true){ System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); if(a == 0){ break; } z++; switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("あなたの勝ちです。"); k++; } else if(c== -1){ System.out.println("あなたの勝ちです。"); k++; } else if(c==0){ System.out.println("あいこです。"); h++; } else if(c==1){ System.out.println("コンピュータの勝ちです。"); m++; } else { System.out.println("コンピュータの勝ちです。"); m++; } } } System.out.println("じゃんけん終了。"); System.out.println("あなたは"+z+"試合中、"+k+"勝"+m+"敗"+h+"分けです"); } } このようにじゃんけんのプログラムを作りました。 しかし0~3以外の数字が入力されても、じゃんけんの勝敗を勝手に判定してしまいます・・・ try文でやってみたのですがいまいちうまくいきませんでした。 0~3を入力したら入力エラーと表示して、ふたたびユーザーの手を聞くようにしたいです。 どうすればよいかアドバイスお願いします。

    • ベストアンサー
    • Java
  • java.until.Mapに関してです。

    以下のプログラムで配列部分をjava.until.Map(キーはID)に変更して、 こんな事やるとどういうプログラムになるのでしょうか? 何卒ご回答よろしくお願い致します。 ・顧客情報を取得するgetCustomer(int id)メソッドを作成する ・顧客情報を変更するupdateCustomer(int id, String name)メソッド、 顧客情報を削除するdeleteCustomer(int id)メソッドを作成する  但し、指定idの顧客情報が存在しない場合は例外をスローしたいのです。 class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard( "山田一郎"); manager.addCustomerCard( "鈴木太郎"); manager.addCustomerCard( "田中次郎"); manager.printAllInfo(); } private CustomerCard[] customers = new CustomerCard[5]; private int index = 0; public void addCustomerCard(String name){ customers[index] = new CustomerCard(1 + index,name); index++; } public void printAllInfo() { System.out.print("ID =" + customers[0].id + ","); System.out.println("名前 = " + customers[0].name); System.out.print("ID =" + customers[1].id + ","); System.out.println("名前 = " + customers[1].name); System.out.print("ID =" + customers[2].id + ","); System.out.println("名前 = " + customers[2].name); } } class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } }

    • ベストアンサー
    • Java
  • java 一意のIDを振り分けるには。。。

    一意のIDの振り分け方がわかりません。。。 以下のプログラムを改良したいのですが。 CustomerManagerが内部でです。ただCustomerManagerインスタンス毎に一意で構いません。 addCustomerメソッドの整数型引数は除去します。 何卒ご回答よろしくお願い致します。 package exercise12; class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } } package exercise12; class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard(1, "山田一郎"); manager.addCustomerCard(2, "鈴木太郎"); manager.addCustomerCard(3, "田中次郎"); manager.printAllInfo(); } private CustomerCard[] customers = new CustomerCard[4]; private int index = 0; public void addCustomerCard(int id,String name){ customers[index] = new CustomerCard(id,name); index++; } public void printAllInfo() { System.out.print("ID =" + customers[0].id + ","); System.out.println("名前 = " + customers[0].name); System.out.print("ID =" + customers[1].id + ","); System.out.println("名前 = " + customers[1].name); System.out.print("ID =" + customers[2].id + ","); System.out.println("名前 = " + customers[2].name); } }

    • ベストアンサー
    • Java
  • java 入力命令

    以下うまくどうさしません、教えてください。 public class Main { public static void main(String[] args){ System.out.println("名前"); String name = new java.util.Scanner(System.in) .nextLine(); System.out.println("年齢"); int age = new java.util.Scanner(System.in) .nextInt(); System.out.println (age + name); } }

  • 配列の変換について

    こんにちは、お世話になります。 次のコードで、どうしてint[] i = {1,2,3};が int[] i = new int[3]; int[0] = 1; int[1] = 2; int[2] = 3; のようになるのか分かりません。お分かりの方よろしくお願いします。 class arr{ public static void main(String[] args){ String[] name = new String[3]; name[0] = "1番目"; name[1] = "2番目"; name[2] = "3番目";      System.out.println("nameの0:" + name[0]); System.out.println("nameの1:" + name[1]); System.out.println("nameの2:" + name[2]); int[] i = {1,2,3}; System.out.println("iの0:" + i[0]); System.out.println("iの1:" + i[1]); System.out.println("iの2:" + i[2]); char c[] = new char[1]; c[0] = 'A'; System.out.println("cの0:" + c[0]); } }

  • 構文解析中にファイルの終わりに移りました。

    いつも大変お世話になりありがとうございます。 度々申し訳ございません。 コンパイルエラーが解読できません。 アドバイスのほど宜しくお願い申し上げます。 import java.util.*; class Monster { private int power; Monster(int p) { power = p; } class PlayWithMonster6 { public static void main(String[] args) { Monster m = new Monster(10); System.out.println("モンスターが生まれました"); Scanner sc = new Scanner(System.in); int ans, food; while(m.getPower() > 0) { System.out.println("\nモンスターのパワー:" + m.getPower()); System.out.println("どうしますか"); System.out.print("1 散歩させる 2 食べさせる 3 終了>"); ans = sc.nextInt(); if(ans == 1) { m.walk(); } else if( ans == 2) { System.out.println("食べさせる量を入力してください"); System.out.print("整数入力>"); food = sc.nextInt(); m.eat(food); } else { System.out.println("終了します"); break; } } System.out.println("\nまた遊ぼうね"); } }

    • ベストアンサー
    • Java

専門家に質問してみよう