アプリ版:「スタンプのみでお礼する」機能のリリースについて

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(" 出直してこい");
}
}

質問者からの補足コメント

  • Tacosanさん、返信ありがとうございます。
    「exception in thread "main" java.lang.arrayindexoutofboundsexception」っていうエラーが出ました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/09/14 19:09

A 回答 (4件)

その「変なエラー」って, どんなエラー?

この回答への補足あり
    • good
    • 0

エラーが何行目で出たのかは表示されないんだっけ?



ともあれ
for(int c=1; c<inputnum; c++)
for(int f=c-1; c>=0; c--)
if(input[c].equals(input[f]))
input[c] = "0";
の部分, なんかおかしくない?
    • good
    • 0

配列範囲外エラーですね。

行数や範囲外になった値も近所に書いてあるともいますが、-1 ではないかと思います。
№1さんのように、
for(int f=c-1; c>=0; c--)
のc>=0をc>0に代えたらどうでしょうか。
    • good
    • 0

以下が出鱈目な挙動になっています。



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を削除
    • good
    • 0
この回答へのお礼

for(int f=c-1; c>=0; c--)の部分を「for(int f=c-1; f>0; f--)」に直したらエラーが消えて思う通りに動きました。変数cとfは重複していません。
ご指摘ありがとうございました。

お礼日時:2021/09/21 00:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!