2013-05-20 23 views
5

Noob na Ruby tutaj. Pracując przez kilka ćwiczeń i uderzając w ścianę.Oblicz liczbę liter za pomocą serii ocen

Ćwiczenie: Oblicz stopień się szeregu gatunków

Tworzenie get_grade metoda, która akceptuje tablicę wyników testów. Każdy wynik w tablicy powinien wynosić od 0 do 100, gdzie 100 oznacza maksymalną liczbę punktów.

Obliczyć średnią punktację i zwrócić ocenę litery jako ciąg, tj. "A", "B", "C", "D", "E" lub "F".

I powracają błąd :

avg.rb:1: syntax error, unexpected tLBRACK, expecting ')' 
def get_grade([100,90,80]) 
      ^
avg.rb:1: syntax error, unexpected ')', expecting $end 

Oto co mam do tej pory. Chciałbym trzymać się poniższych metod lub .join, ponieważ próbuję pracować z metodami, których uczymy się na zajęciach. Więc suma, wstrzyknięcie itp. Niekoniecznie będzie pomocne. Z góry przepraszam za specyfikę tej prośby :) Jestem pewna, że ​​jest lepszy sposób na to, że jest mniej kodu, ale próbuję się tego nauczyć w ten sposób.

def get_grade([100,90,80]) 
     get_grade = (array[0] + array[1] + array[2]).to_i/array.length.to_i 
    case get_grade 
     when 90..100 
     "A" 
     when 80..90 
     "B" 
     when 70..80 
     "C" 
     when 60..70 
     "D" 
     when 0..60 
     "F" 
     else 
    "Error" 
     end 
    end 

    puts get_grade([100,90,80]) 

Odpowiedz

7

Nie można po prostu losowo zrzucić tablicę dosłownego jak [100,90,80] do listy parametrów definicji funkcji. Sądząc po ciele funkcji, myślę, że masz na myśli, aby zaakceptować jeden parametr array:

def get_grade(array) 
    grade = (array[0].to_i + array[1].to_i + array[2].to_i)/array.length 
    case grade 
    # unchanged 
    end 
end 
+0

Ponadto obliczenie stopnia może być nieznacznie poprawiła : 'array.inject (: +)/tablica.size'. –

+1

@BenjaminTan Wiem, i chciałbym; ale cytując pytanie: "Chciałbym trzymać się poniższych metod lub .join, ponieważ próbuję pracować z metodami, których uczymy się na zajęciach, więc suma, wstrzyknięcie itp. niekoniecznie będzie pomocne". – michaelb958

+0

To prawda, ale naprawdę nie mogłem się oprzeć. :) –

0

Dzięki za pomoc dzisiaj! Oto, co udało mi się zrobić, aby działało z więcej niż trzema argumentami. Użyłem każdej metody Array #. Wyobrażam sobie, że istnieje bardziej eleganckie rozwiązanie, ale zadziałało! Pracowałem nad tym od godziny 10:00, bardzo doceniam pomoc!

def get_grade(array) 
    sum = 0 
    array.each do |element| 
    sum += element 
    end 
    average = sum/array.length 
    if average >= 90 
     grade = "A" 
    elsif average >= 80 
     grade = "B" 
    elsif average >= 70 
    grade = "C" 
    elsif average >= 60 
    grade = "D" 
    elsif average >= 0 
    grade = "F" 
    else 
    "Error" 
    end 
end 

puts get_grade([70,80,80,90,100]) 
puts get_grade([100,80,90,11,20]) 
puts get_grade([30,20,10,60,75]) 
+0

Nie mogę się doczekać, aby dowiedzieć się więcej o .inject, ponieważ widziałem to jako rozwiązanie tego pytania na kilku tablicach! Wszelkie linki na ten temat są doceniane, ponieważ nie mogłem znaleźć tego w dokumentacji metodologii ruby-docs. – ideahed

+0

'inject' jest częścią' Zmiennej' mixin można zobaczyć dokumentację tutaj http://ruby-doc.org/core-2.0/Enumerable.html – Abizern

0

Pamiętaj, że maksymalny wynik to 100 (i można założyć, że min wynosi 0).

def get_grade(array) 
sum = 0 
array.each do |x| 
    sum += x 
end 

average = sum/array.length 

if average > 100 
    print "Grades must be no more than 100!" 
elsif average >= 90 
    grade = "A" 
elsif average >= 80 
    grade = "B" 
elsif average >= 70 
    grade = "C" 
elsif average >= 60 
    grade = "D" 
elsif average >=0 
    grade = "F" 
else 
    print "Grades must be no less than 0!" 
end 
grade 
    end 

puts get_grade([100,90,80]) == "A" 
puts get_grade([98,90,80]) == "B" 
puts get_grade([80,80,80]) == "B" 
puts get_grade([55,45,35]) == "F" 
puts get_grade([101,100,104]) 
puts get_grade([-2,-3,-4]) 
0

Dodano proc, dzięki czemu nawet jeśli użytkownik wprowadzi wynik powyżej 100, nie zostanie obliczony na średnią. Naprawiono także instrukcje przełączania w jednym wierszu. Daj mi znać, jeśli to pomoże. Powodzenia.

def get_grade array 
    scores_under_100 = Proc.new {|score| score <= 100 && score > 0} 
    scores = array.select(&scores_under_100) 
    average = scores.inject(:+)/scores.size 

    case average 
     when 90..100 then puts "A." 
     when 80..89 then puts "B." 
     when 70..79 then puts "C." 
     when 60..69 then puts "D." 
     else puts "F." 
    end 
    end 

puts get_grade([100, 100, 90, 67, 85, 200, 290, 299, 299]) 
+0

@ michaelb958 wiem, że chcesz trzymać się z dala od metody obiektu, ale ja Sądzę, że to wciąż solidny sposób na przekazanie tablicy tylu wyników, ile chcesz. – MartianE

1

lakoniczny zastąpienie wielkiej case oświadczeniu dla zabawy:

def letter_grade(score) # assumes that score is between 0 and 100 (not 0-1) 
    %w[F F F F F F D C B A][ (score/10.0).floor ] || 'A' # handles grades >=100 
end 

Lub więcej ziarnistości:

def letter_grade(score) # score is between 0 and 100 (not 0-1) 
    grades = %w[F F F F F F F F F F F F F F F F F F D- D D+ C- C C+ B- B B+ A- A A+ A+] 
    grades[ (3.0*score/10).floor ] 
end 
Powiązane problemy