我正在尝试建立一个程序来帮助我为课堂上的学生进行评分。我已经把它设置成一个学生班,然后通过一个数组从文件中读取(在Ruby中我不是很熟悉的东西)。我的编程经验是在java中,所以如果有错误可以解释,我道歉。提前感谢您的帮助。
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)
这是我的目标。我试图在引入更多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
答案 1 :(得分:0)
我们无法轻松复制您的代码,因为您打开了一个名为“Grades”的文件,而我们没有或知道其内容。
在继续之前,您还应该添加一些代码来首先检查您的文件是否存在 - 现在您的脚本以Errno :: ENOENT退出。
我还建议将main中的逻辑放入您的类中 - 让您的类处理所有内容。
在部分中:
if __FILE__ == $PROGRAM_NAME
end
然后您可以通过简单的调用简单地初始化您的课程,例如:
Foobar.new(ARGV)
你描述了“成绩”文件,但我不明白你写的是什么 - 如果你可以链接到一个样本,比如通过一个pastie或gist,然后链接它,会更容易;并且还说明哪个部分不起作用,这一点也不清楚。
样式问题是次要的,我认为你的代码没问题 - 这里的另一张海报没有。
答案 2 :(得分:-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行。