0

コードについて簡単な質問があります。私はJavaにまったく慣れておらず、自己学習しようとしていますが、今はループにとらわれています。私には、これはうまくいくはずだと思います。問題は、生徒の数を求めすぎて、ユーザーに各生徒の名前とスコアを入力させることです。次に、スコアが1番目と2番目に高い生徒を表示する必要があります。何らかの理由で、私のコードは、最初に高いスコアと2番目に高いスコアの両方に入力した名とスコアを表示するだけです。私はおそらくいくつかの大きな間違いを犯しましたが、誰かが私を正しい方向に向けることができるかもしれませんか?これが巨大な混乱のように見える場合は申し訳ありません。:(

public class Chapter4_9 {

  public static void main(String[] args) {

    //scanner for input
    Scanner input = new Scanner(System.in);

    //ask user for number of students
    System.out.print("Enter the number of students: ");
    int numberStudents = input.nextInt();

    //declare variables
    double highestScore = 0;
    double tempScore = 0;
    double secondHighestScore = 0;
    String firstStudent = "";
    String tempStudent = "";
    String secondStudent = "";

    for (int i = 0; numberStudents != i; ++i) {
        System.out.print("Enter the students name followed by his score: ");
        String studentName = input.next();
        double studentScore = input.nextDouble();

        if (i == 0){
            firstStudent = studentName;
            highestScore = studentScore;
        }

        else if (studentScore > highestScore) {
            tempStudent = firstStudent;
            studentName = firstStudent;
            secondStudent = tempStudent;
            tempScore = highestScore;
            studentScore = highestScore;
            secondHighestScore = tempScore;
        }


    }   
    System.out.println("The highest scoring student is " + firstStudent + " with a " + highestScore);
    System.out.println("The second highest scoring student is " + secondStudent + " with a " + secondHighestScore);

}
}
4

4 に答える 4

1

このブロックは少し混乱しているようです:

else if (studentScore > highestScore) {
    tempStudent = firstStudent;
    studentName = firstStudent;
    secondStudent = tempStudent;
    tempScore = highestScore;
    studentScore = highestScore;
    secondHighestScore = tempScore;
}

このブロックの意図された結果は何ですか?(とにかくユーザーから新しい値を読み取る前に)二度と読み取られないのに、なぜstudentNameとの値を上書きするのですか?studentScore

おそらく目的は、2番目のスコア/名前を最高のスコア/名前に置き換え、次に最高のスコア/名前を現在の入力に置き換えることですが、それはコードが行うことではありません。これはそれを行います:

secondStudent = firstStudent;
secondScore = highestScore;
firstStudent = studentName;
highestScore = studentScore;

一時変数はまったく必要ありません。

ただし、その変更だけでは十分ではありません。また、新しいスコアが現在の最高スコアより高くはないが、現在の2番目に高いスコアよりも高い状況を考慮する必要があります。私はあなたにそれが必要とするものを解決することを任せます...

ちなみに、「名前/スコア」の組み合わせに別のクラスを導入すると、コードはおそらく簡単になりますStudent。そうすれば、並列変数はなくなります。心配する必要があるのはtopStudent、、だけです。secondStudentcurrentStudent

于 2012-08-04T08:24:36.980 に答える
0

あなたがより高いスコアを見つけたときのあなたのコードは間違っています。

secondStudent = fistStudent; // what used to be high score is now 2nd
firstStudent = studentName;
// score adjustment left for you to do ;)
于 2012-08-04T08:24:21.430 に答える
0

コードに1つの間違いがあり、すべてを網羅しているわけではありません。

forループでは、次のものが必要です。

else if (studentScore > highestScore) {
        secondStudent = firstStudent;
        firstStudent = studentName;
        secondHighestScore = highestScore;
        highestScore = studentScore;
    }
else if (studentScore < highestScore && studentScore > secondHighestScore) {
        secondStudent = studentName;
        secondHighestScore = studentScore;
    }

終わり。

于 2012-08-04T08:27:18.553 に答える
0

あなたの論理は正しくありません。あなたはすべての側面を扱っているわけではありません。コードをチェックすると、最初の入力が正しく処理され、入力の方法によって異なります。ロジックを改善する必要があります。それほど多くの一時変数を持つ必要はありません。

アプリケーションをデバッグモードで実行し、どこで問題が発生したかがわかるようにステップインするとよいでしょう。

于 2012-08-04T08:36:13.460 に答える