0
Lloyd = {
    "name":"Lloyd",
    "homework": [90,97,75,92],
    "quizzes": [ 88,40,94],
    "tests": [ 75,90]
    }
Alice = {
    "name":"Alice",
    "homework": [100,92,98,100],
    "quizzes": [82,83,91],
    "tests": [89,97]
    }
Tyler = {
    "name":"Tyler",
    "homework": [0,87,75,22],
    "quizzes": [0,75,78],
    "tests": [100,100]
    }

def average(value):
    avg=0
    items = len(value)
    for item in value:
        avg +=item 
    return avg/items

def getAverage(dictin):
    hw = average(dictin.get('homework'))
    quiz = average(dictin.get('quizzes'))
    tests = average(dictin.get('tests'))
    weighted_average = hw*.1 + quiz*.3 + tests*.6
    return weighted_average

def getLetterGrade(score):
    if score >=90:
        return "A"
    elif score < 90 and score >= 80:
        return "B"
    elif score < 80 and score >= 70:
        return "C"
    elif score < 70 and score >= 60:
        return "D"
    elif score < 60:
        return "F"
    else:
        return "No grades for you"

score = getAverage(Lloyd)
grade = getLetterGrade(score)
print grade

これは問題なく機能しますが、スコアが89.5の場合は機能しないと言われています。私もそれを試しましたが、どこに問題があるのか​​わかりません。どんな間違いでも大歓迎です。

4

1 に答える 1

5

キャッチはおそらく、整数( )を別の整数()averageで除算する関数にあります。両方のオペランドが整数であるため、Pythonは結果も整数にキャストします。したがって、関数は小数のスコアを返すことはありません。avgitemsaverage

多くの可能な解決策があります:

  1. 分割する前に、オペランドの1つ(avgまたは)をfloatにキャストします。items例、、return float(avg)/itemsまたはreturn (avg+0.0)/items

  2. avg0ではなく0.0から始めましょう。これにより、avg常にフロートになります。

  3. コードの最初に追加from __future__ import divisionします。これは、PythonにPython 3.xの方法で除算を使用し、常にfloatを返すように指示します。

更新:また、MrGingerbearのコメントによると、スコアの切り上げまたは切り下げを検討することもできますgetLetterGrade。モジュールからceilandfloor関数をインポートする場合は、切り上げる、切り下げる、または最も近い整数に切り上げると言うことができます。mathceil(score)floor(score)round(score)

于 2012-10-15T19:32:50.820 に答える