2016-10-26 26 views
2

我一直無法理解Java方法的概念,而且我需要爲Grade Calculator程序編寫一個代碼,這個程序不會比我得到的那麼混亂。如何在Java中爲不同的任務創建不同的方法,然後調用它們?

這是我有什麼(這一切都在一個方法):

public class GradeCalculator2{ 
    public static void main(String[]args){ 

     Scanner sc = new Scanner(System.in); 

     int students; 
     String studentName; 

     System.out.println("Welcome to GradeCalculator program."); 
     System.out.println("Author: Hayden Wires"); 
     System.out.println("Date: 10/25/2016"); 
     System.out.print("Enter the number of students:"); 
     students = sc.nextInt(); 
     System.out.println("Enter next student's information:"); 
     System.out.print("Name:"); 
     studentName = sc.next(); 

     for(int i = students; i > 1; i++){ 

      double quizScore1; 
      double quizScore2; 
      double quizScore3; 
      double quizScore4; 
      double quizScore5; 

      System.out.print("Quiz 1:"); 
      quizScore1 = sc.nextDouble(); 
      quizScore1 /= 100; 
      quizScore1 *= .02; 

      System.out.print("Quiz 2:"); 
      quizScore2 = sc.nextDouble(); 
      quizScore2 /= 100; 
      quizScore2 *= .02; 

      System.out.print("Quiz 3:"); 
      quizScore3 = sc.nextDouble(); 
      quizScore3 /= 100; 
      quizScore3 *= .02; 

      System.out.print("Quiz 4:"); 
      quizScore4 = sc.nextDouble(); 
      quizScore4 /= 100; 
      quizScore4 *= .02; 

      System.out.print("Quiz 5:"); 
      quizScore5 = sc.nextDouble(); 
      quizScore5 /= 100; 
      quizScore5 *= .02; 

      double totalQuizScores = quizScore1 + quizScore2 + quizScore3 + quizScore4 + quizScore5; 
      totalQuizScores /= 5; 

      double a1_Score; 
      double a2_Score; 
      double a3_Score; 
      double a4_Score; 
      double a5_Score; 
      double a6_Score; 

      System.out.print("Assignment 1:"); 
      a1_Score = sc.nextDouble(); 
      a1_Score /= 100; 
      a1_Score *= .025; 

      System.out.print("Assignment 2:"); 
      a2_Score = sc.nextDouble(); 
      a2_Score /= 100; 
      a2_Score *= .025; 

      System.out.print("Assignment 3:"); 
      a3_Score = sc.nextDouble(); 
      a3_Score /= 100; 
      a3_Score *= .05; 

      System.out.print("Assignment 4:"); 
      a4_Score = sc.nextDouble(); 
      a4_Score /= 100; 
      a4_Score *= .05; 

      System.out.print("Assignment 5:"); 
      a5_Score = sc.nextDouble(); 
      a5_Score /= 100; 
      a5_Score *= .05; 

      System.out.print("Assignment 6:"); 
      a6_Score = sc.nextDouble(); 
      a6_Score /= 100; 
      a6_Score *= .1; 

      double a1_a2_Scores = a1_Score + a2_Score; 
      double a3_a4_a5_Scores = a3_Score + a4_Score + a5_Score; 

      double assignmentScoresTotal = a1_a2_Scores + a3_a4_a5_Scores + a6_Score; 
      assignmentScoresTotal /= 3; 


      double mt1Score; 
      System.out.print("Midterm 1:"); 
      mt1Score = sc.nextDouble(); 
      mt1Score /= 100; 
      mt1Score *= .1; 

      double mt2Score; 
      System.out.print("Midterm 2:"); 
      mt2Score = sc.nextDouble(); 
      mt2Score /= 100; 
      mt2Score *= .2; 

      double mtScoresTotal = mt1Score + mt2Score; 
      mtScoresTotal /= 2; 

      double finalScore; 
      System.out.print("Final:"); 
      finalScore = sc.nextDouble(); 
      finalScore /= 100; 
      finalScore *= .3; 

      double totalGrade = assignmentScoresTotal + totalQuizScores + mtScoresTotal + finalScore; 
      totalGrade *= 100; 
      totalGrade *= 2; 

      System.out.println(studentName + "'S SCORE:" + totalGrade); 

      String letterGrade; 

      if (totalGrade >= 93){ 
       letterGrade = "A"; 
      } else if ((totalGrade >= 90)&&(totalGrade < 92)){ 
       letterGrade = "A-"; 
      } else if ((totalGrade >= 87)&&(totalGrade < 90)){ 
       letterGrade = "B+"; 
      } else if ((totalGrade >= 83)&&(totalGrade < 87)){ 
       letterGrade = "B"; 
      } else if ((totalGrade >= 80)&&(totalGrade < 83)){ 
       letterGrade = "B-"; 
      } else if ((totalGrade >= 77)&&(totalGrade < 80)){ 
       letterGrade = "C+"; 
      } else if ((totalGrade >= 74)&&(totalGrade < 77)){ 
       letterGrade = "C"; 
      } else if ((totalGrade >= 70)&&(totalGrade < 74)){ 
       letterGrade = "C-"; 
      } else if ((totalGrade >= 68)&&(totalGrade < 70)){ 
       letterGrade = "D+"; 
      } else if ((totalGrade >= 60)&&(totalGrade < 68)){ 
       letterGrade = "D"; 
      } else { 
       letterGrade = "F"; 
      } 
      System.out.println(studentName + "'S LETTER GRADE:" + letterGrade); 
     } 
    } 
} 

我理解這一點非常凌亂,可能很難看,但是這就是我需要幫助。我知道有一種方法可以減少使用方法重複使用該程序的難度,但我無法在這個程序中理解這個概念。

+4

這一切都是在Oracle的在線Java教程很好解釋。我建議你[從這裏開始](https://docs.oracle.com/javase/tutorial/java/javaOO/classes.html) –

+0

在http://codereview.stackexchange上,好的人會更好地服務這個問題。 .COM /。 –

回答

1

Java是精心設計的面向對象編程語言。面向對象的哲學與繼承密切相關。 Java是在OOP的繼承屬性上構建的。由於繼承,你不能擁有全局方法。

下面的例子是不是良好的面向對象的做法,它只是顯示的過程:

public class myClass{ 
public static void main(String[] args){ 
    f1(); 

} 

private void f1(arg1, arg2){ 
//your code here 
} //end of method f1 
} //end of class 

這是不好的面向對象的做法,因爲你通常分開你的主(驅動器)類和其他類和在主要課程中你只有主要的方法。

1

要縮短您的代碼,您需要尋找模式!

看看你如何處理每個測驗的得分和每個任務的類似方式?

你總是過程測驗這樣的:

System.out.print("Quiz <insert a number here>:"); 
quizScoreX = sc.nextDouble(); 
quizScoreX /= 100; 
quizScoreX *= .02; 

的不同之這裏是數字「測驗」後的唯一的事情。

你總是過程分配是這樣的:

System.out.print("Assignment <insert number here>:"); 
aX_Score = sc.nextDouble(); 
aX_Score /= 100; 
aX_Score *= <insert number here>; 

是不同的這裏唯一的事情是「分配」這個詞,你乘以分數在數字後面的數字。

查看模式?

這意味着我們可以得到組每次測驗的得分和各分配到兩種方法的過程:

private static double getQuizScore(int number) { 
    System.out.print("Quiz " + Integer.toString(number) + ":"); 
    double quizScore = sc.nextDouble(); 
    quizScore /= 100; 
    quizScore *= .02; 
    return quizScore; 
} 

private static double getAssignmentScore(int number, double multiplier) { 
    System.out.print("Assignment " + Integer.toString(number) + ":"); 
    doubke assignmentScore = sc.nextDouble(); 
    assignmentScore /= 100; 
    assignmentScore *= multiplier; 
    return assignmentScore; 

} 

另外請注意,您收到5次測驗的得分。每次,你所做的只是增加測驗號碼。最後加上它們。這可以簡化爲:

private static double getTotalQuizScore() { 
    double total = 0; 
    for (int i = 0 ; i < 5 ; i++) { 
     total += getQuizScore(i + 1); 
    } 

    return total; 
} 

然後,您可以在代碼中使用這兩種方法是這樣的:

 double totalQuizScores = getTotalQuizScore(); 
     totalQuizScores /= 5; 

     double a1_Score = getAssignmentScore(1, 0.25); 
     double a2_Score = getAssignmentScore(2, 0.25); 
     double a3_Score = getAssignmentScore(3, 0.05); 
     double a4_Score = getAssignmentScore(4, 0.05); 
     double a5_Score = getAssignmentScore(5, 0.05); 
     double a6_Score = getAssignmentScore(6, 0.1); 

     double a1_a2_Scores = a1_Score + a2_Score; 
     double a3_a4_a5_Scores = a3_Score + a4_Score + a5_Score; 

     double assignmentScoresTotal = a1_a2_Scores + a3_a4_a5_Scores + a6_Score; 
     assignmentScoresTotal /= 3; 


     double mt1Score; 
     System.out.print("Midterm 1:"); 
     mt1Score = sc.nextDouble(); 
     mt1Score /= 100; 
     mt1Score *= .1; 

     double mt2Score; 
     System.out.print("Midterm 2:"); 
     mt2Score = sc.nextDouble(); 
     mt2Score /= 100; 
     mt2Score *= .2; 

     double mtScoresTotal = mt1Score + mt2Score; 
     mtScoresTotal /= 2; 

     double finalScore; 
     System.out.print("Final:"); 
     finalScore = sc.nextDouble(); 
     finalScore /= 100; 
     finalScore *= .3; 

     double totalGrade = assignmentScoresTotal + totalQuizScores + mtScoresTotal + finalScore; 
     totalGrade *= 100; 
     totalGrade *= 2; 

     System.out.println(studentName + "'S SCORE:" + totalGrade); 

     String letterGrade; 

     if (totalGrade >= 93){ 
      letterGrade = "A"; 
     } else if ((totalGrade >= 90)&&(totalGrade < 92)){ 
      letterGrade = "A-"; 
     } else if ((totalGrade >= 87)&&(totalGrade < 90)){ 
      letterGrade = "B+"; 
     } else if ((totalGrade >= 83)&&(totalGrade < 87)){ 
      letterGrade = "B"; 
     } else if ((totalGrade >= 80)&&(totalGrade < 83)){ 
      letterGrade = "B-"; 
     } else if ((totalGrade >= 77)&&(totalGrade < 80)){ 
      letterGrade = "C+"; 
     } else if ((totalGrade >= 74)&&(totalGrade < 77)){ 
      letterGrade = "C"; 
     } else if ((totalGrade >= 70)&&(totalGrade < 74)){ 
      letterGrade = "C-"; 
     } else if ((totalGrade >= 68)&&(totalGrade < 70)){ 
      letterGrade = "D+"; 
     } else if ((totalGrade >= 60)&&(totalGrade < 68)){ 
      letterGrade = "D"; 
     } else { 
      letterGrade = "F"; 
     } 
     System.out.println(studentName + "'S LETTER GRADE:" + letterGrade); 

編輯:我忘了提,你也需要移動sc類水平,使這些方法都可以訪問它:

移動這一行:

Scanner sc = new Scanner(System.in); 

主要方法外,在開始處添加private static

private static Scanner sc = new Scanner(System.in); 
public static void main(String[] args) { 
    // ... 
} 
1

您似乎在重複運行相同的計算:

System.out.print("Quiz 1:"); 
quizScore1 = sc.nextDouble(); 
quizScore1 /= 100; 
quizScore1 *= .02; 

這可以用一個方法

double readScore(Scanner sc, String title, double weight) 
{ 
    System.out.print(title); 
    double result = sc.nextDouble(); 
    result /= 100.0; 
    result *= weight; 
    return result; 
} 

被替換然後,你的主要功能看起來像:

quizScore1 = readScore(sc, "Quiz 1", 0.02); 
: 
a2_Score = readScore(sc, "Assignment 2", 0.025); 
etc... 

這樣就可以從主函數中刪除大量的重複代碼。

之後,你應該瞭解數組,所以你沒有a1_score通過a6_score等..

相關問題