java循环的简单程序问题

时间:2012-08-04 08:16:43

标签: java loops

我对我的代码有一个简单的问题。我是java的新手,并试图自学,但我现在正在坚持循环。对我而言,这似乎应该有效。问题是要求一些学生,然后让用户输入每个学生的姓名和分数。然后它应该显示第一和第二高分的学生。出于某种原因,我的代码只显示了我为第一个最高分和第二个最高分输入的名字和分数。我可能犯了一些大错,但也许有人可以指出我正确的方向?对不起,如果这看起来像一团糟。 :(

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 个答案:

答案 0 :(得分:1)

这个区块看起来有些混乱:

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

这个街区的预期后果是什么?为什么要覆盖studentNamestudentScore的值,当它们从未再次读取时(在您从用户那里读取新值之前)?

大概目标是用最高得分/名称替换第二个得分/名称,然后用当前输入替换最高得分/名称 - 但这不是代码所做的。这样就可以了:

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

根本不需要临时变量。

但是,这种改变还不够。您需要考虑新分数不高于当前最高分数的情况,但高于当前第二高得分了。我会告诉你要解决这个问题......

顺便说一句,如果您为“名称/分数”组合引入了一个单独的类,例如,您的代码可能会更简单。 Student。那么你就不会有并行变量 - 你只需要担心topStudentsecondStudentcurrentStudent

答案 1 :(得分:0)

当您找到更高分数时,您的代码是错误的。

secondStudent = fistStudent; // what used to be high score is now 2nd
firstStudent = studentName;
// score adjustment left for you to do ;)

答案 2 :(得分:0)

代码中有一个错误,而且你没有涵盖所有内容。

在for循环中,你必须有这些:

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

完成。

答案 3 :(得分:0)

你的逻辑不正确。你没有处理所有方面。 如果你检查你的代码,它将只是正确处理第一个输入,这一切都取决于 如何提供您的意见。 你的逻辑需要改进。没有必要有这么多临时变量。

在调试模式下运行应用程序并进入它会很好,以便您知道它出错的地方。