首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化GPA计算器

简化GPA计算器
EN

Code Review用户
提问于 2013-07-12 08:45:21
回答 3查看 13.7K关注 0票数 6

我只学习了两个星期的Java,并且刚刚完成了我的第一个程序。我有种感觉,我增加了不必要的东西,但不确定。我希望有人看看它,并让我知道是否有方法来简化或接近代码。基本上,我只是想创建一个简单的GPA计算器。

代码语言:javascript
复制
import java.util.Scanner;

class GpaCalculator {

    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
        char c1;
        double gpa;
        double g1, g2, g3, g4, g5, g6;

        g1 = 0;
        g2 = 0;
        g3 = 0;
        g4 = 0;
        g5 = 0;
        g6 = 0;

        System.out.println("What is your grade for class 1?");
        c1 = myScanner.findWithinHorizon(".", 0).charAt(0);
        if (c1 == 'a' || c1 == 'A') {
            g1 = 4;
        }
        if (c1 == 'b' || c1 == 'B') {
            g1 = 3;
        }
        if (c1 == 'c' || c1 == 'C') {
            g1 = 2;
        }
        if (c1 == 'd' || c1 == 'D') {
            g1 = 1;
        }
        if (c1 == 'f' || c1 == 'F') {
            g1 = 0;
        }
        System.out.println("What is your grade for class 2?");
        c1 = myScanner.findWithinHorizon(".", 0).charAt(0);
        if (c1 == 'a' || c1 == 'A') {
            g2 = 4;
        }
        if (c1 == 'b' || c1 == 'B') {
            g2 = 3;
        }
        if (c1 == 'c' || c1 == 'C') {
            g2 = 2;
        }
        if (c1 == 'd' || c1 == 'D') {
            g2 = 1;
        }
        if (c1 == 'f' || c1 == 'F') {
            g2 = 0;
        }
        System.out.println("What is your grade for class 3?");
        c1 = myScanner.findWithinHorizon(".", 0).charAt(0);
        if (c1 == 'a' || c1 == 'A') {
            g3 = 4;
        }
        if (c1 == 'b' || c1 == 'B') {
            g3 = 3;
        }
        if (c1 == 'c' || c1 == 'C') {
            g3 = 2;
        }
        if (c1 == 'd' || c1 == 'D') {
            g3 = 1;
        }
        if (c1 == 'f' || c1 == 'F') {
            g3 = 0;
        }
        System.out.println("What is your grade for class 4?");
        c1 = myScanner.findWithinHorizon(".", 0).charAt(0);
        if (c1 == 'a' || c1 == 'A') {
            g4 = 4;
        }
        if (c1 == 'b' || c1 == 'B') {
            g4 = 3;
        }
        if (c1 == 'c' || c1 == 'C') {
            g4 = 2;
        }
        if (c1 == 'd' || c1 == 'D') {
            g4 = 1;
        }
        if (c1 == 'f' || c1 == 'F') {
            g4 = 0;
        }
        System.out.println("What is your grade for class 5?");
        c1 = myScanner.findWithinHorizon(".", 0).charAt(0);
        if (c1 == 'a' || c1 == 'A') {
            g5 = 4;
        }
        if (c1 == 'b' || c1 == 'B') {
            g5 = 3;
        }
        if (c1 == 'c' || c1 == 'C') {
            g5 = 2;
        }
        if (c1 == 'd' || c1 == 'D') {
            g5 = 1;
        }
        if (c1 == 'f' || c1 == 'F') {
            g5 = 0;
        }
        System.out.println("What is your grade for class 6?");
        c1 = myScanner.findWithinHorizon(".", 0).charAt(0);
        if (c1 == 'a' || c1 == 'A') {
            g6 = 4;
        }
        if (c1 == 'b' || c1 == 'B') {
            g6 = 3;
        }
        if (c1 == 'c' || c1 == 'C') {
            g6 = 2;
        }
        if (c1 == 'd' || c1 == 'D') {
            g6 = 1;
        }
        if (c1 == 'f' || c1 == 'F') {
            g6 = 0;
        }

        gpa = (g1 + g2 + g3 + g4 + g5 + g6) / 6;

        System.out.println("Your GPA is " + gpa + ". ");

        if (gpa > 3.00) {
            System.out.println("Gret job, you're on your way to success.");
        } else if (gpa > 2.00) {
            System.out.println("You did OK, but better than average.");
        } else {
            System.out.println("You didn't do too well. You should look into getting a tutor.");
        }
    }
}
EN

回答 3

Code Review用户

发布于 2013-07-12 13:03:48

首先,GradeClass (避免与java.lang.Class混淆的GradedClass)作为枚举都是有意义的。

代码语言:javascript
复制
enum Grade {
    A(4),B(3),C(2),D(1),F(0);

    private final int value;

    Grade(int value) {
        this.value = value;
    }

    int getValue() {
        return value;
    }
}

enum GradedClass {
    ONE, TWO, THREE, FOUR, FIVE, SIX;

    @Override
    public String toString() {
        return "class " + (ordinal() + 1);
    }
}

这将允许一个更简单的计算循环:

代码语言:javascript
复制
    public double calculateGpa() {
        return calculateTotal() / GradedClass.values().length;
    }

    private double calculateTotal() {
        double total = 0d;
        for (GradedClass gradedClass : GradedClass.values()) {
            Grade grade = userInterface.askGradeFor(gradedClass);
            total += grade.getValue();
        }
        return total;
    }

请注意,为了将计算与UI代码分开,我已经将扫描仪隐藏在UserInterface接口后面。

它由ConsoleUI类实现:

代码语言:javascript
复制
class ConsoleUI implements UserInterface {
    Scanner myScanner = new Scanner(System.in);

    @Override
    public Grade askGradeFor(GradedClass gradedClass) {
        System.out.println(MessageFormat.format("What is your grade for {0}?", gradedClass));
        String input = myScanner.findWithinHorizon(".", 0);
        return Grade.valueOf(input.toUpperCase());
    }

    @Override
    public void presentGpa(double gpa) {
        if (gpa > 3d) {
            System.out.println("Great job, you're on your way to success.");
        } else if (gpa > 2d) {
            System.out.println("You did OK, but better than average.");
        } else {
            System.out.println("You didn't do too well. You should look into getting a tutor.");
        }
    }

}

主要的课程只是把所有的东西联系在一起:

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) {
        UserInterface ui = new ConsoleUI();
        GpaCalculator gpaCalculator = new GpaCalculator(ui);

        double gpa = gpaCalculator.calculateGpa();
        ui.presentGpa(gpa);
    }

}
票数 7
EN

Code Review用户

发布于 2013-07-12 09:09:15

我将对您的代码进行如下改进:

  • 看看您的代码,您会注意到同一段代码的重复(打印问题=>扫描输入=>分析输入),这意味着您可以为此编写一个方法。
  • 如果你想要多一个等级,你必须创建一个新的变量,等等。我会把分数存储在数组中。
  • 实际上,我甚至不确定我是否会把它们存储在一个数组中:只要把分数和起来,然后除以年级数
  • 小写用户输入,所以您不必测试小写和大写。
  • 使用if ... else if而不是几个if
  • 在您的示例中,使用0初始化级别,并在用户键入f时存储0。没有必要处理这个案子。
  • 你不处理E级吗?

代码看起来应该是这样的:

代码语言:javascript
复制
import java.util.Scanner;

public class GpaCalculator {
    private final static Scanner MY_SCANNER = new Scanner(System.in);
    private final static int NUMBER_OF_GRADES = 6;

    public static void main(final String[] args) {
        int sum = 0;
        for (int i = 0; i < NUMBER_OF_GRADES; i++) {
            sum += askForGrade(i);
        }
        final double gpa = (double) sum / NUMBER_OF_GRADES;

        System.out.println("Your GPA is " + gpa + ". ");

        if (gpa > 3.00) {
            System.out.println("Gret job, you're on your way to success.");
        } else if (gpa > 2.00) {
            System.out.println("You did OK, but better than average.");
        } else {
            System.out.println("You didn't do too well. You should look into getting a tutor.");
        }
    }

    private static int askForGrade(final int index) {
        System.out.println("What is your grade for class " + (index + 1) + "?");
        char c1 = MY_SCANNER.findWithinHorizon(".", 0).charAt(0);
        c1 = Character.toLowerCase(c1);

        switch(c1){
            case 'a':
                return 4;
            case 'b':
                return 3;
            case 'c':
                return 2;
            case 'd':
                return 1;
            default:
                return 0;
        }
    }
}

最后,您可以改进提示符,只接受真正的分数(在您的代码中,在我的代码中,用户可以提供任何字符)。

票数 5
EN

Code Review用户

发布于 2013-07-12 13:35:22

  • 首先,尝试考虑GpaCalculator的所有逻辑和行为,并在类中将它们分开。
  • 就像bowmore建议的那样,您可以使用enum,这对于您的代码是灵活的。

这是我对你的代码的版本。

  • 还试着考虑可以从代码(如例外情况 )中引发的IllegalGradeException

GradeCalculator类

代码语言:javascript
复制
    package com.se.cr;

    import java.util.Scanner;

    public class GradeCalculator {

        private final int NUMBER_OF_CLASSES;
        private Scanner myScanner = new Scanner(System.in);

        // Default constructor
        public GradeCalculator(){
            this(6); // By default number of classes are 6
        }

        // Customize constructor
        public GradeCalculator(int NUMBER_OF_CLASSES){
            this.NUMBER_OF_CLASSES = NUMBER_OF_CLASSES;
        }

        public double calculateGPA(){
            final double GPA = this.calculateSum() / NUMBER_OF_CLASSES;
            return GPA;
        }

        protected double calculateSum(){
            double sum = 0.0;
            for(int i = 1; i <= NUMBER_OF_CLASSES; i++){
                sum += this.gradeValue(i);
            }
            return sum;
        }

        /**
         * 
         * @param classNumber 
         * @return grade of that particular <code> classNumber </code>
         */
        protected double gradeValue(int classNumber){
            System.out.print("What is your grade for class " + classNumber + " ? ");
            char gradeChar = myScanner.next().toLowerCase().charAt(0);

                while(gradeChar < 'a' || gradeChar > 'f'){
                System.out.println("Wrong choice"); // raise an exception here and handle it
                System.out.print("What is your grade for class " + classNumber + " ? ");
                gradeChar = myScanner.next().toLowerCase().charAt(0);
            }
            return this.toGradeValue(gradeChar);
        }

        /**
         * 
         * @param grade
         * @return numeric representation of <code> grade </code>
         */
        public double toGradeValue(char grade){
            double gradeValue = 0.0;
            switch (grade) {
                case 'a': gradeValue = 5.0; break;
                case 'b': gradeValue = 4.0; break;
                case 'c': gradeValue = 3.0; break;
                case 'd': gradeValue = 2.0; break;
                case 'e': gradeValue = 1.0; break;
                case 'f': gradeValue = 0.0; break;
            }
            return gradeValue;
        }
    }

教师班您还可以使它成为一个单独的类,而不是像bowmore所建议的那样,使它成为一个主类.。

代码语言:javascript
复制
    package com.se.cr;

    public class Teacher {

        public static void main(String[] args) {
            GradeCalculator calculator = new GradeCalculator();
            final double GPA = calculator.calculateGPA();

            Teacher teacher = new Teacher();
            teacher.takeDecision(GPA); 
        }

        /**
         * Teacher will take decision on the basis of <code> GPA </code> 
         * @param GPA 
         */
        protected void takeDecision(final double GPA){
            System.out.println("Your GPA is " + GPA);
            if (GPA > 3.00) {
                System.out.println("Gret job, you're on your way to success.");
            } else if (GPA > 2.00) {
                System.out.println("You did OK, but better than average.");
            } else {
                System.out.println("You didn't do too well. You should look into getting a tutor.");
            }
        }
    }
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/28406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档