类 - 阵列交互Ruby

时间:2015-10-22 20:54:49

标签: arrays ruby class

我正在尝试建立一个程序来帮助我为课堂上的学生进行评分。我已经把它设置成一个学生班,然后通过一个数组从文件中读取(在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

3 个答案:

答案 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行。