2016-04-08 5 views
-2

Ich habe Lösungen in anderen Sprachen aber nicht Ruby gepostet, also frage ich hier.Student Marks Hash

Ich versuche, ein Studenten Marks System mit Ruby zu erstellen, das sollte den Namen des Studenten und zwei Marken vom Benutzer für diesen bestimmten Schüler nehmen.

ich entschieden und speichern diese in einem Hash zu versuchen, so dass es wie etwas am Ende aussehen würde:

student_marks = { 
     "Steve" => 45, 65, 
     "James" => 20, 75, 
     "Scott" => 30, 90 
    } 

Mein Code Versuch wird wie folgt:

continue = "y" 

    student_grades = Hash.new 

    while continue == "y" 

    puts "Please enter student name" 
    name = gets.chomp 

    puts "Please enter the first grade for #{name}" 
    grade_one = gets.chomp.to_i 

    puts "Please enter the second grade for #{name}" 
    grade_two = gets.chomp.to_i 


     student_grades.each do |key, value| 
      student_grades[key] = name 
      student_grades[value] = grade_one 
      student_grades[value][1] = grade_two 

     end 

     puts "Do you want to continue? y or n" 
     continue = gets.chomp 

    end 


    puts student_grades 

Offensichtlich gibt es ein Problem mit meine Logik beim Versuch, den Hash mit jeder/Iteration zu füllen, weil ich immer Null zurück bekomme. Ich denke, ich könnte Arrays verwenden und den Hash von ihnen auffüllen, aber gibt es eine Möglichkeit, den Hash sowohl die Schlüssel und Werte durch Iteration von Benutzereingaben zu füllen?

+0

Ihr erwartetes Ergebnis ist an erster Stelle ungültig. – sawa

+0

In Ihrem Code beginnen Sie mit 'student_grades' als ein leerer Hash, dann iterieren Sie darüber, was bedeutet, dass Sie nichts tun. – sawa

+0

Hoppla danke! Es scheint, dass ich meine Logik um Hashes komplett falsch verstanden habe. – Sevenum

Antwort

0

Sie scheinen falsch zu verstehen, wie Hashes in Ruby funktionieren. Ich würde vorschlagen, es ein wenig zu lesen.

In der Zwischenzeit versuchen Sie dies:

student_grades = Hash.new {|h,k| h[k] = [] } 

Nun jedes Mal, wenn Sie einen Student Klasse bekommen, können Sie es in den Array-Wert für diesen Schüler Raute-Taste drücken können.

Zum Beispiel:

student_grades 
=> {} 

student_grades['Mark'] << 95 
student_grades['Mark'] << 86 

student_grades 
=> {'Mark' => [95, 86]} 

Sie brauchen gar nicht den Hash iterieren in jedem Lauf Ihrer Schleife, sollten Sie nur das zu tun, wenn Sie einige Informationen aus es brauchen zu extrahieren.

+0

Danke für den Rat, Ihre Antwort ist klar. Sieht so aus, als hätte ich meine Logik falsch verstanden, zurück zu den Büchern. – Sevenum

+0

Der Teil, der einige Leute in Ruby stürzt, ist, dass wenn Sie einen neuen Hash erstellen, wenn Sie wollen, dass Ruby für jeden Schlüssel einen Anfangswert annimmt, Sie spezifisch auf diesen Wert sein müssen. Wenn Sie beispielsweise nur eine Note vergeben möchten, wie zum Beispiel 'grade ['Mark'] = 95 ', ist das kein Problem, aber wenn Sie einen Zähler wie' counts ['ding'] + = 1 'machen möchten, tut Ruby das auch Nehme nicht an, dass der Startwert '0' ist - dafür musst du deinen Hash als 'Hash.new (0)' instanziieren, damit Ruby weiß, mit was du anfangen willst. Das Gleiche gilt auch hier. Wir teilen Ruby mit, dass jeder neue Schlüssel mit einem neuen Array-Objekt als Wert beginnen soll. – Damon

Verwandte Themen