2015-10-22 28 views
1

我正在嘗試設置一個程序來幫助我照顧課堂學生的評分。我已經設置好了,讓一個學生班通過一個數組讀取文件(我在Ruby中不太熟悉)。我的編程經驗是用java編寫的,所以如果有錯誤可以用我的道歉來解釋。預先感謝您的幫助。類數組交互Ruby

class Student 
    def initialize(str_LastName, str_FirstName, arr_Score) 
    @str_LastName = str_LastName 
    @str_FirstName = str_FirstName 
    @arr_Score = arr_Score 
    str_Grade = "" 
    int_OutOf = 415 
    end 

    def get_LastName 
    str_LastName 
    end 

    def get_FirstName 
    str_FirstName 
    end 

    def get_Grade 
    str_Grade 
    end 

    def set_TotalScore() 
    sum = 0 
    arr_Score.each do |item| 
     sum += item 
    end 
    arr_Score[12] = sum 
    end 

    def set_Grade 
    if arr_Score[12]/int_OutOf >= 0.9 
     str_Grade = "A" 
    elsif arr_Score[12]/int_OutOf >= 0.8 
     str_Grade = "B" 
    elsif arr_Score[12]/int_OutOf >= 0.7 
     str_Grade = "C" 
    elsif arr_Score[12]/int_OutOf >= 0.6 
     str_Grade = "D" 
    else 
     str_Grade = "F" 
    end 
    end 
end 

def main 
    file_name = "Grades" 
    arr_students = Array.new(31) 
    arr_scores = Array.new(12) 
    int_i = 0 
    file_io = open(file_name).readlines.each do |line| 
    array = line.split(",").map(&:strip) 
    student = Student.new(array[0],array[1],array[2..-2]) #the final element in the array is for the final score 
    arr_students[int_i] = student 
    puts "read #{arr_students[int_i]}" 
    end 
    file_name = "Graded" 
    file_io = open(file_name,"a+") 
    arr_students.each do |student| 
    set_TotalScore 
    set_Grade 
    file.io_write(student) 
    puts "write #{student}" 
    end 
end 

main if __FILE__==$0 
+0

忘了提,在成績文本文件格式,因此每行1個學生得分在名稱後到來,並且我將最後一個數組槽保持爲0,以便我可以將其設置爲最終得分。 – Thailer

+3

問題是什麼? – steenslag

回答

1

這是我的跑步。我試圖保持真實的一般性,以您的代碼的原始意圖,同時引入更多Rubyish的做事方式。

class Student 
    def initialize(firstname, lastname, *scores) 
    @firstname, @lastname, @scores = firstname, lastname, scores 
    end 

    def total_score 
    @scores.map(&:to_i).inject(:+) 
    end 

    def grade 
    raise "TOO HIGH!" if total_score > MAX_SCORE 

    case total_score/MAX_SCORE 
    when 0.9..1.0; "A" 
    when 0.8...0.9; "B" 
    when 0.7...0.8; "C" 
    when 0.6...0.7; "D" 
    else   "F" 
    end 
    end 

    def to_s 
    "#{@lastname}, #{@firstname}: #{total_score}, #{grade}" 
    end 
end 

MAX_SCORE = 415.0 
DATA.each_line do |line| 
    arr = line.split(",").map(&:strip) 
    student = Student.new *arr 
    puts student 
end 

__END__ 
Herb,Goldberg,22,99,44,22,88,88 
Mark,Sullivan,77,88,88,44,33 

可以讀取和寫入類似這樣的文件(未測試):

outfile = File.open("Graded", "a+") 
File.open("Grades").each_line do |line| 
    ... 
    outfile.puts student 
end 
outfile.close 
-2

你應該通過codecademy來獲得你的ruby語法。

要訪問您初始化的實例變量(@str_LastName(應該是@last_name)等),您需要使用「attr_reader:str_LastName」,最好在類的頂部。這將確定你的getter(setter是attr_writer,都是attr_accessor)。

你也可以對這樣的數組進行求和:[1,4,6,7] .inject(:+)。

Java不允許case語句嗎?你應該在set_grade中使用它。你也不需要初始化str_Grade。在等級中,您可以執行@grade_letter || =「A」,然後調用set_grade將在每次調用時返回該值。

我沒有看透你的主要方法。雖然這很醜陋。 Ruby方法可能不應超過5行。

0

因爲您打開了一個名爲「Grades」的文件,我們不能輕易地重現您的代碼,但我們不知道它的內容。

在繼續之前,您還應該添加一些代碼來首先檢查您的文件是否存在 - 現在您的腳本將退出Errno :: ENOENT。

我也建議把邏輯放在你的班級裏 - 讓你的班級處理一切。

在部分:

if __FILE__ == $PROGRAM_NAME 

end 

然後,您可以簡單地用一個簡單的調用,如初始化類:

Foobar.new(ARGV) 

您所描述的「成績」的文件,但我不明白你寫道 - 如果你可以鏈接到一個樣本,比如通過一個pastie或gist,然後把它鏈接起來,它會更容易。並且還要說明哪部分是不起作用的,這也是不清楚的。

風格問題是次要的,我認爲你的代碼沒問題 - 這裏的另一張海報沒有。

+0

評分系統的格式將與以下內容類似 **史密斯,約翰,1,2,3,4,5,6 ** ...(代表任務分數的數字) – Thailer