我只学习了两个星期的Java,并且刚刚完成了我的第一个程序。我有种感觉,我增加了不必要的东西,但不确定。我希望有人看看它,并让我知道是否有方法来简化或接近代码。基本上,我只是想创建一个简单的GPA计算器。
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.");
}
}
}发布于 2013-07-12 13:03:48
首先,Grade和Class (避免与java.lang.Class混淆的GradedClass)作为枚举都是有意义的。
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);
}
}这将允许一个更简单的计算循环:
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类实现:
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.");
}
}
}主要的课程只是把所有的东西联系在一起:
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);
}
}发布于 2013-07-12 09:09:15
我将对您的代码进行如下改进:
if ... else if而不是几个iff时存储0。没有必要处理这个案子。代码看起来应该是这样的:
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;
}
}
}最后,您可以改进提示符,只接受真正的分数(在您的代码中,在我的代码中,用户可以提供任何字符)。
发布于 2013-07-12 13:35:22
GpaCalculator的所有逻辑和行为,并在类中将它们分开。enum,这对于您的代码是灵活的。这是我对你的代码的版本。
IllegalGradeException。 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所建议的那样,使它成为一个主类.。
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.");
}
}
}https://codereview.stackexchange.com/questions/28406
复制相似问题