Создание шкалы оценок с использованием перечислений в Java, а затем разрешение пользователю вводить числовую оценку для вывода буквенной оценки - PullRequest
0 голосов
/ 04 февраля 2019

На четвертой неделе я изучаю Java онлайн и имею задание создать шкалу оценок с использованием перечислений.

Я создал перечисление шкалы оценок, но совершенно не понимаю, как разрешить пользователю вводить числовое значение, а затем выводить буквенное значение.Каждая попытка либо говорит мне, что я не могу использовать функцию возврата с тем, что я выбрал, либо system.out.println также не хочет принимать мои значения.Я решил полностью удалить мой файл класса и перезапустить, но понятия не имею, что я сделал не так.Вот мой код перечисления:

public enum Grade {

    A(95-100, "A"),
    AMINUS(92-94, "A-"),
    BPLUS(89-91, "B+"),
    B(86-88, "B"),
    BMINUS(83-85, "B-"),
    CPLUS(80-82, "C+"),
    C(77-79, "C"),
    CMINUS(74-76, "C-"),
    DPLUS(71-73, "D+"),
    D(68-70, "D"),
    DMINUS(65-67, "D-"),
    F(1-64, "F"),
    FA(0, "FAILURE TO APPEAR");

    private final String gradeText; 

    private Grade(int gradeValue, String gradeText) {
        this.gradeText = gradeText; 
    }

    public String printGrade() {
        return gradeText; 
    }
}

Ответы [ 5 ]

0 голосов
/ 04 февраля 2019
public enum Grade {
    A("A", 95, 100),
    AMINUS("A-", 92, 94),
    BPLUS("B+", 89, 91),
    B("B", 86, 88),
    BMINUS("B-", 83, 85),
    CPLUS("C+", 80, 82),
    C("C", 77, 79),
    CMINUS("C-", 74, 76),
    DPLUS("D+", 71, 73),
    D("D", 68, 70),
    DMINUS("D-", 65, 67),
    F("F", 1, 64),
    FA("FAILURE TO APPEAR", 0, 0);

    private final String text;
    private final int min;
    private final int max;

    Grade(String text, int min, int maxScore) {
        this.text = text;
        this.min = min;
        this.max = maxScore;
    }

    public String getText() {
        return text;
    }

    public static Grade parseScore(int score) {
        for (Grade grade : values())
            if (score >= grade.min && score <= grade.max)
                return grade;
        throw new EnumConstantNotPresentException(Grade.class, String.valueOf(score));
    }
}

А теперь вы можете конвертировать счет в Gradle:

Grade grade = Grade.parseScore(85);  // BMINUS
0 голосов
/ 04 февраля 2019

Конструктор не будет работать так, как вы его используете.Если вы хотите добавить значения к типу перечисления, как вы сделали здесь, вам нужно установить эти значения в конструкторе.

Тип перечисления нуждается только в конструкторе по этой причине, и конструктор никогда не сможетбыть использован другим классом Java.

Поскольку в Java нет простого класса диапазона, я предлагаю вам определить минимальные и максимальные значения как отдельные параметры:

public enum Grade {
    A(95, 100, "A")
    // and so on

    String gradeText;
    int gradeMinPoints;
    int gradeMaxPoints;

    // ...
}

В конструкторе вынеобходимо присвоить эти значения:

private Grade (int minimum, int maximum, String text) {
    this.gradeMinPoints = minimum;
    this.gradeMaxPoints = maximum;
    this.gradeText      = text;
}

Вы можете получить доступ к переменным с помощью дополнительных функций и объявить статические функции, которые возвращают тип перечисления 'grade' в зависимости от предоставленных вами параметров.Другие ответы на этот пост обеспечивают гораздо лучшие функции, чем я мог бы написать, поэтому я отсылаю вас к ним.

0 голосов
/ 04 февраля 2019

Вам нужно определить границы как отдельные поля, чтобы компилятор мог их понять.Вероятно, вы ищете Enum следующим образом:

public enum Grade {
    A("A", 95, 100),
    AMINUS("A-", 92, 94);
    // DEFINE ALL YOUR GRADES HERE

    String grade;
    int gradeMin;
    int gradeMax;

    Grade(String grade, int gradeMin, int gradeMax) {
        this.grade = grade;
        this.gradeMin = gradeMin;
        this.gradeMax = gradeMax;
    }

    /**
     * @return the grade
     */
    public String getGrade() {
        return grade;
    }

    /**
     * @return the gradeMin
     */
    public int getGradeMin() {
        return gradeMin;
    }

    /**
     * @return the gradeMax
     */
    public int getGradeMax() {
        return gradeMax;
    }

    public static Grade getGrade(int marks) {
        for (Grade g : values()) {
            if (marks >= g.getGradeMin() && marks <= g.getGradeMax()) {
                return g;
            }
        }

        return null;
    }
}

Затем вы можете использовать это в своем классе, чтобы получить оценку как

public class GradeRetriever {
    public static void main(String... args) {
        System.out.println(Grade.getGrade(92).getGrade());
    }
}
0 голосов
/ 04 февраля 2019

Полагаю, вы пытаетесь достичь чего-то подобного:

public enum Grade {

    A(95, 100, "A"),
    AMINUS(92, 94, "A-"),
    BPLUS(89, 91, "B+"),
    B(86, 88, "B"),
    BMINUS(83, 85, "B-"),
    CPLUS(80, 82, "C+"),
    C(77, 79, "C"),
    CMINUS(74, 76, "C-"),
    DPLUS(71, 73, "D+"),
    D(68, 70, "D"),
    DMINUS(65, 67, "D-"),
    F(1, 64, "F"),
    FA(0, 0, "FAILURE TO APPEAR");

    private final String gradeText;
    private final int lower;
    private final int higher;

    private Grade(int lower, int higher, String gradeText) {
        this.gradeText = gradeText;
        this.lower = lower;
        this.higher = higher;
    }

    public String getGradeText() {
        return this.gradeText;
    }

    public static Grade getGrade(int points) {
        for (Grade g : Grade.values()) {
            if (g.lower <= points && points <= g.higher) {
                return g;
            }
        }

        return null;
    }

    public static void main(String[] args) {
        for (int i = 0; i <= 100; i++) {
            System.out.println(Grade.getGrade(i));
        }
    }
}

Я заменил ваше определение "диапазона" двумя отдельными параметрами, сохранил их в полях перечисления и добавил метод getGrade(int points), который возвращает элемент перечисления Grade, соответствующий данному количеству баллов.Если вы введете какое-либо число, находящееся за пределами диапазона от 0 до 100, метод возвращает ноль.Метод main предназначен только для завершения этого простого доказательства концепции и примера использования метода getGrade(int).

0 голосов
/ 04 февраля 2019

Я думаю, этот подход мог бы вам помочь.

Вместо того, чтобы пытаться сохранить диапазон в перечислении, сохраните максимальное значение, которое все еще можно считать этой оценкой, для каждой оценки.Затем вы можете получить действительные буквенные оценки с помощью статического метода:

public enum Grade {

    A(100, "A"), AMINUS(94, "A-"), BPLUS(91, "B+"), B(88, "B"), BMINUS(85, "B-"),
    CPLUS(82, "C+"), C(79, "C"), CMINUS(76, "C-"), DPLUS(73, "D+"), D(70, "D"),
    DMINUS(67, "D-"), F(64, "F"), FA(0, "FAILURE TO APPEAR");

    private final int gradeValue;
    private final String gradeText;

    private Grade(int gradeValue, String gradeText) {
        this.gradeValue = gradeValue;
        this.gradeText = gradeText;
    }

    public static Grade getGrade(int value) {
        Grade grade = FA;
        for(Grade g : values()) {
            if(value <= g.gradeValue) {
                grade = g;
            }
        }
        return grade;
    }

    public String printGrade() {
        return gradeText;
    }
}

Тестирование:

System.out.println(Grade.getGrade(99).printGrade());
System.out.println(Grade.getGrade(80).printGrade());
System.out.println(Grade.getGrade(88).printGrade());
System.out.println(Grade.getGrade(75).printGrade());

дает нам это:

A
C+
B
C-
...