0

コンソールから入力された 2 の最大数を見つけようとしています。最初のものは見つかりましたが、2番目のものの解決策は機能していません。プログラムがコンパイルされ、実行されています。これがコードです。

import java.util.Scanner;

public class FindingSecondHighestScore_4_09 {

    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);

        double max = 1;
        double score2 = 0;
        String firstName = "";
        String secondName = null;
        System.out.println("Enter number of students: ");
        int x = input.nextInt();
        while(x > 0)
        {
            System.out.println("Enter Sudent's name");
            String name = input.next();
            System.out.println("Enter Student's score");
            double score = input.nextDouble();

            //find max
            if(score > max)
            {
                max = score;
                firstName = name;
            }

            //find second max
            if(max < score2  || score < score2)
            {
                max = score2;
                score = score2;
            }
            else if(max > score2  && score2 < score)
            {
                score2 = score;
                secondName = name;
            }


            x--;
        }
        System.out.println("The student: " + firstName + " has the greatest score: " + max);
        System.out.println("Second studemt " + secondName + " with second results: " + score2);

    }

}
4

4 に答える 4

1

ここにもう少し手の込んだ実装があります(今日の私の目覚めの練習):

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TopScores {

    private static final int TOP_SELECTION_SIZE = 2;

    public static class Student {
        private final String name;
        private double score;

        public Student(String name) {
            if (name == null || name.length() == 0) {
                throw new IllegalArgumentException("Name cannot be empty");
            }
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public double getScore() {
            return score;
        }

        public void setScore(String score) {
            try {
                this.score = Double.parseDouble(score);
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("Illegal score: " + score);
            }
        }

        @Override
        public String toString() {
            return String.format("%s with score %s", name, score);
        }
    }

    public static void main(String[] args) {

        List<Student> students = new ArrayList<TopScores.Student>();
        System.out.println("Please enter students. Press <RETURN> to stop.");
        Scanner input = new Scanner(System.in);
        boolean enteringData = true;
        while (enteringData) {
            try {
                System.out.print("Enter student's name: ");
                Student student = new Student(input.nextLine());
                System.out.print("Enter student's score: ");
                student.setScore(input.nextLine());
                for (int i = 0; i < students.size(); i++) {
                    if (student.getScore() > students.get(i).getScore()) {
                        students.add(i, student);
                        break;
                    }
                }
                if (students.size() == 0) {
                    students.add(student);
                }
            } catch (IllegalArgumentException e) {
                enteringData = false;
            }
        }

        int studentsToDisplay = Math.min(TOP_SELECTION_SIZE, students.size());
        if (studentsToDisplay > 0) {
            System.out.println("Top students:");
            for (int i = 0; i < studentsToDisplay; i++) {
                System.out.println("* " + students.get(i));
            }
        } else {
            System.out.println("No students to display");
        }
    }
}

名前とスコアを保持し、入力を検証し、1人の生徒の表示形式を作成する別のクラスStudentを作成しました。

最高のスコアを決定するために、新しい生徒を正しい位置に追加することで、入力したすべての生徒をリストに並べ替えます。

ユーザーは事前に学生数を入力する必要はありませんが、空の行(または無効なスコア)​​を入力することでデータ入力を終了できます。

データ入力が完了すると、希望する数の最高得点の学生が印刷されます。

このアプローチはより柔軟です。トップ3またはトップ10の学生を印刷するには、TOP_SELECTION_SIZEの値を変更します。

最も重要なポイント:可能な場合はクラス(この場合は学生)で考え、各クラスに賢明な責任を委任するようにしてください。

于 2012-07-12T07:46:26.640 に答える
1

Since this looks like homework, I will just give you a few hints:

  • When you find a new max, what should happen to score2?
  • Should you look for a new score2 even if you found a new max?
于 2012-07-12T06:48:44.930 に答える
1

If we want to address the if structures, consider rearranging to something like this:

if (/* new score beats second score, but not first */) {
    // replace second score
} else if (/* new score beats both first and second */) {
    // move first score down to second
    // assign a new first score
}

Let your thought process to correspond closely to the code, which will clarify what each block should do, thus localizing any logic errors.

于 2012-07-12T06:50:22.290 に答える
1

スコアが最大値より大きい場合は、最大値を 2 番目のスコアにシフトし、新しいスコアで最大値を設定する必要があると思います..そして、スコアが最大値とスコア 2 の間にある場合は、スコア 2 を新しいスコアでのみ更新する必要があります。

        //find max
        if(score > max)
        {
            score2 = max;
            max = score;
            secondName = firstName;
            firstName = name;
        }

        //find second max
        if(score < max && score > score2)
        {
            score2 = score;
            secondName = name;
        }
于 2012-07-12T07:29:39.110 に答える