2014-01-29 81 views
0

提供了一個成績文本文件,每行有一個整數,代表該班學生的成績爲 。這些數字沒有排序,但是它們綁定在0和100之間 (含)。使用數組時,您必須計算每個坡度值的頻率,並將其作爲水平直方圖打印到標準輸出 。您還必須標註每個柱狀圖欄的範圍,並允許用戶指示他們想要使用該柱狀圖的大小間隔。直方圖 - 成績分佈

這是我的任務,我被困在如何標記每個直方圖條的範圍,並允許用戶指出他們希望直方圖的大小間隔是多少?

我該如何修復我的代碼?

我的代碼:

import java.util.Scanner; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 

public class GradeHistogram{ 

    public static void main(String[] args) throws Exception { 
     Scanner gradeFile = new Scanner(new FileInputStream("grades.txt")); 
     int counter = 0; 
     while (gradeFile.hasNextLine()) { 
     gradeFile.nextLine(); 
     counter++; 
     } 
     int[] grades = new int[counter]; 
     System.out.println("Grades loaded!"); 
     System.out.println("What bucket size would you like?"); 
     Scanner output = new Scanner(System.in); 
     for (int i = 0; i < grades.length; i++) { 
      grades[i] = Integer.parseInt(output.nextLine()); 
      for (i = 0; i < grades.length; i++) { 
      if (grades[i] > 0){ 
       System.out.print(i + " | "); 
       for (int j = 0; j < grades[i]; j++) { 
        System.out.print("[]"); 
       } 
       System.out.println(); 
      } 
     } 
    } 
} 

回答

0

行動!請注意,您目前正在循環中重複使用變量i。您的代碼可能(並且可能)出乎意料地由此導致。我也相信你沒有正確解析文件。

您可以使用輔助數組來存儲每個等級的頻率。初始化一個空數組(填充零),然後爲每個年級更新相應的插槽。

的代碼將是這樣的:

// 1. Generate your counting array 
    // (give it 101 slots to include all grades from 0 to 100) 
    int gradeFrequency = new int[101]; 
    for (int j = 0; j < 101; j++) { 
     gradeFrequency[j] = 0; 
    } 

    // 2. Parse the file and store the frequency of each grade 
    while (gradeFile.hasNextLine()) { 
     // get the grade and add 1 to its counter 
     int grade = Integer.parseInt(gradeFile.nextLine()); 
     gradeFrequency[grade]++; 
    } 

之後,你gradeFrequency數組將包含每個年級的頻率範圍爲0〜100

當打印直方圖,可以要求用戶輸入希望看到直方圖的時間間隔,然後從數組中打印相應的頻率。造成這種情況的代碼將是這樣的:

// Retrieve the interval the user wants to see 
    Scanner s = new Scanner(System.in); 
    System.out.println("Enter the interval for the histogram (e.g. '0 100'):"); 
    int lowerBound = s.nextInt(); 
    int upperBound = s.nextInt(); 

    // Print the histogram title and 'column headers' 
    System.out.println(); 
    System.out.println("HISTOGRAM"); 
    System.out.println("Grade\tFrequency"); 

    // For each grade present in the interval, print out its 'label' 
    // (the assigned grade) 
    for (int i = lowerBound; i < upperBound; i++) { 
     System.out.print(i + "\t"); 

     // For each time this grade was assigned to a student, 
     // print an asterisk 
     for (int j = 0; j < gradeFrequency[i]; j++) { 
      System.out.print("*"); 
     } 
     System.out.println(); 
    } 

(請注意,我不包含任何錯誤處理意外的條目,如負邊界,開始>端或上限比數組大小較大;我把它留給你)

控制檯此代碼示例執行後會是這樣的:

Enter the interval for the histogram (e.g. '0 100'): 
5 11 

HISTOGRAM  
Grade  Frequency 
5   *** 
6   * 
7   ****** 
8   * 
9   ** 
10  ****** 
11  **** 

我能說清楚還是你有什麼遺留問題? :)

+1

謝謝!這真的很有幫助! – sd2205