2013-03-09 102 views
0

新手java程序員,新的陣列,在以下提示的分配工作:創建Java數組數字分數轉換爲字母等級

編寫一個程序,將繪製一個測試成績的等級分佈。一次輸入一個分數,當輸入0(零)分數時循環將中斷。輸出將在字母等級中爲每個分數打印*,並將字母等級放置在圖表下方的橫軸上。

我的主要問題是創建一個數組,使我能夠總結每個年級(A,B,C ...)中的得分數量。我禁止在此轉換中使用if或switch語句。我想知道從哪裏開始創建這個數組。謝謝!

+3

那麼,到目前爲止你做了什麼? – jrd1 2013-03-09 23:58:44

+0

我是否在談論這個錯誤,或者你是否必須根據作爲數值輸入的'A','B'等等級的數字來製作模擬「酒吧」圖表? – SGM1 2013-03-10 00:02:04

+0

SGMI - 沒錯。我已經用兩種方法對它進行了細分:一種用於打印基本圖(這不是我擔心的部分),另一種用於獲取用戶輸入,其中我設置了可以假設的do-while循環初始化數組/索引。 – user2152567 2013-03-10 00:06:55

回答

1

它是否必須是一個數組?如果沒有,Map對於這種情況是一個不錯的選擇。地圖的鍵是各種等級(A,B,C等),每個鍵的值是一個整數(或長)以保存該鍵的等級數。所以,基本邏輯就是從地圖上獲得等級(即關鍵字)的計數器,將其增加並放回地圖中。

如果您不介意使用外部庫,那麼Guava's Multiset更適合。

編輯:好,所以你需要使用一個數組,但一個挑戰(如果我正確地讀你的帖子)是你不能使用if或switch語句(大概是訪問數組)。圍繞這一可能的方式是「A」分配給索引0,「B」到索引1等。然後可以使用用於數組索引以下符號:

char gradeAsChar = ...; //I'll leave this to you to get the grade as an (uppercase) char 
gradesArray[gradeAsChar - 'A'] = gradesArray[gradeAsChar - 'A'] + 1; 

「A」 - 「A」是0,'B' - 'A'是1等。當然,如果字符是意外的,那麼上面的索引越界問題已經成熟,所以您需要在那裏進行一些錯誤處理。

+0

不幸的是,它必須是一個數組,基於賦值的參數。我同意有更有效的方法,但我必須遵守規則。 – user2152567 2013-03-10 00:04:37

+0

我相信他是在一個介紹性的CS類,所以他可能只限於標準IO和循環。 – SGM1 2013-03-10 00:04:47

+0

^這是正確的。 – user2152567 2013-03-10 00:07:45

1

當然,如果你不關心內存效率(!你應該總是同時編碼),你可以做一個新的數組,像這樣:

int[] grades = new int[101]; 

然後只要用戶輸入的輸入,你可以這樣做:

int grade = input.nextInt(); 
grades[grade] = grades[grade] + 1; 

你可以找出等級的數量由運行這樣等於:

int A = 0; 
for (int i = 91; i < 101; i++){ 
    A += grades[i]; 
} 

當你說你不允許使用if或switch語句時,這就是我想到的。讓我知道它是否有幫助。再一次,效率極低,但至少你可以追蹤你所有的分數。這是一個優點。

這應該是O(n)的粗略運行時間,但我認爲可能會更好。

祝你好運!

編輯:你可以通過使用整數除法的概念做一個更高效的方法版本。什麼是整數除法,你可能會問,它是當你分兩個整數,比如說10/3,答案可能是3.333,但是java放棄了小數部分,所以答案是3. 因此,如果你除以10,你可以使用獲得哪些分數的結果等等。例如:92/10 = 9,97/10 = 9,83/10 = 8等等。需要注意的是A的分數是91-100,所以在應用這個概念之前你必須減去1。

這應該會將數組從101個元素減少到10個,因爲您只是跟蹤十位數中的數字,反正更重要。你可能能夠進一步優化這個,但再次,這不是我的功課,所以我不想花太多時間在它上面。當我醒來時,我想到了這個:)。

希望這給了你一些思考!