
Java言語の質問です。
下のようなクイズプログラムを作っていました。
九州地方の7つの都道府県をローマ字で答えて7つのうちいくつ正しいかをはかる問題のプログラムです。でも、1つしか入力しなかったときだけ反応して2つ以上だと変なエラーが出ます。
ファイル名はQshu.javaです。
一体どこがおかしいのでしょうか?
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Quiz{
String question;
String[] answer;
Quiz(String question, String answerline){
this.question = question;
StringTokenizer token = new StringTokenizer(answerline, ",");
answer = new String[token.countTokens()];
for(int c=0; token.hasMoreTokens(); c++)
answer[c] = token.nextToken();
}
String[] getCorrect(String inputline){
StringTokenizer token = new StringTokenizer(inputline, ",");
int inputnum = token.countTokens();
String[] input = new String[inputnum];
for(int c=0; token.hasMoreTokens(); c++)
input[c] = token.nextToken();
for(int c=1; c<inputnum; c++)
for(int f=c-1; c>=0; c--)
if(input[c].equals(input[f]))
input[c] = "0";
int correctnum=0;
for(int c=0; c<inputnum; c++)
for(int f=0; f<answer.length; f++)
if(input[c].equals(answer[f]))
correctnum++;
String[] correct = new String[correctnum];
int g=0;
for(int c=0; c<inputnum; c++)
for(int f=0; f<answer.length; f++)
if(input[c].equals(answer[f])){
correct[g] = input[c];
g++;
}
return correct;
}
}
class Qshu{
static String getInput(){
String input = new String();
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
input = br.readLine();
}catch(Exception e){
System.out.println(e);
}finally{
return input;
}
}
public static void main(String[] args){
Quiz qz = new Quiz("九州の都道府県(ローマ字で)", "Fukuoka,Saga,Nagasaki,Kumamoto,Oita,Miyazaki,Kagoshima");
System.out.print("【問題】" + qz.question + "を「,」で区切って答えなさい\n");
int answernum = qz.answer.length;
String input = getInput();
String[] correct = qz.getCorrect(input);
int correctnum = (correct == null) ? 0 : correct.length;
if(correctnum > 0){
System.out.print("正解:");
for(int f=0; f<correctnum; f++)
System.out.print(correct[f] + " ");
System.out.println();
}
System.out.print(correctnum + "/" + answernum + " 正解");
if(correctnum == answernum)
System.out.println(" よくできたね");
else if(correctnum > answernum / 2)
System.out.println(" まだまだだね");
else
System.out.println(" 出直してこい");
}
}
No.4ベストアンサー
- 回答日時:
以下が出鱈目な挙動になっています。
for(int c=1; c<inputnum; c++)
for(int f=c-1; c>=0; c--) // fの意味は? cが無限ループ?
おそらくは配列の重複削除処理だと思いますが、
それならば以下のようにするのが一般的かと
for(int d=0; d<個数; d++)
for(int e=d+1; e<個数; e++)
// dとeを比較して重複ならeを削除
for(int f=c-1; c>=0; c--)の部分を「for(int f=c-1; f>0; f--)」に直したらエラーが消えて思う通りに動きました。変数cとfは重複していません。
ご指摘ありがとうございました。
No.3
- 回答日時:
配列範囲外エラーですね。
行数や範囲外になった値も近所に書いてあるともいますが、-1 ではないかと思います。№1さんのように、
for(int f=c-1; c>=0; c--)
のc>=0をc>0に代えたらどうでしょうか。
No.2
- 回答日時:
エラーが何行目で出たのかは表示されないんだっけ?
ともあれ
for(int c=1; c<inputnum; c++)
for(int f=c-1; c>=0; c--)
if(input[c].equals(input[f]))
input[c] = "0";
の部分, なんかおかしくない?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
論理演算子”||”またはの入力方法
-
テキストボックスに入力された...
-
Java 配列<選挙>
-
コマンドライン引数の例外処理...
-
コマンドプロンプトでキーを押...
-
数値⇒漢数字変換 java
-
countに実行した回数をいれたい...
-
オブジェクトの中のプロパティ...
-
ORA-01858: 数値を指定する箇所...
-
System.err. printlnとSystem.o...
-
IF関数でEmpty値を設定する方法。
-
C言語のポインターに関する警告
-
動的配列が存在(要素が有る)か...
-
C言語 重複しない4ケタの乱数...
-
JSPでの計算結果表示
-
1~100までの数字を表示したい
-
hiddenの値が期待した値で取得...
-
JSPやサーブレットでSystem.out...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
java キーボード入力された値の...
-
論理演算子”||”またはの入力方法
-
数値⇒漢数字変換 java
-
テキストボックスに入力された...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
Ctrl+Zが入力されると終了する...
-
JAVAのfor文で困っています。
-
countに実行した回数をいれたい...
-
Java 入力した整数値の合計を、...
-
配列を逆順させて表示させる方...
-
Randomメソッドの確率設定
-
【JAVA <identifier>がありま...
-
コマンドライン引数の例外処理...
-
繰り返しによる星印の出力
-
Java 配列<選挙>
-
7つ数字を表示したら改行すると...
-
要素数が10の配列で、乱数0~9...
-
javaのプログラミングについて...
-
javaです。 途中まで出来ている...
おすすめ情報
Tacosanさん、返信ありがとうございます。
「exception in thread "main" java.lang.arrayindexoutofboundsexception」っていうエラーが出ました。