2012-04-26 6 views
1

私は本当に困った。私の先生のためのプログラムを書いています(ImはPython 3 btwを使用しています)。その結果、彼は学生にレポートカードを待つ代わりにグレードを計算することができます。私は初心者ですので、答えを簡単にしてください。DPython - 計算が衝突しています。範囲変数のいくつかの並べ替えが必要

ここに問題があります。私はコードに必要なすべての入力を持っています。入力はこのように機能します。 A = 5 B = 4 C = 3 D = 2 E = 1。ストレートAを得れば50ポイントが得られますが、それでも35ポイントが得られれば、すべてのグレードの計算機がクラッシュします。なぜなら、> 30の場合はBですが、> 20の場合はC、しかし> 20と> 30が同時に印刷されるからです。彼らは両方の結果が30以上である場合に実行し、私はそれがこのコード

a = eval(input()) 
b = eval(input()) 
c = eval(input()) 
d = eval(input()) 
e = eval(input()) 
f = eval(input()) 
g = eval(input()) 
h = eval(input()) 
i = eval(input()) 
j = eval(input()) 

average = a + b + c + d + e + f + g + h + i + j 
print(average) 

if average >41: 
    print(" Grade A ") 

if average >31: 
    print(" Grade B") 

if average >21: 
    print(" Grade C") 

if average >11 : 
    print(" Grade D") 

if average >0 
    print(" Grade E") 
である31 40

にある場合、たとえば「B」を印刷するように、それを作る方法を知らないので

どのようなヘルプも大変感謝しています!ありがとう。

+0

'if-elif'構造はどうですか? – bezmax

+0

'' eval(input()) ''はこれを行うには本当に悪い方法です。 '' int(input) ''を使わないのはなぜですか? –

答えて

5

データのグループを定義することをお勧めします。 if/elifブロックは動作しますが、不格好であり、余分な入力の手間を必要とする:

ここ
import sys 

mark_boundaries = [("A", 41), ("B", 31), ("C", 21), ("D", 11), ("C", 0)] 

try: 
    marks = [] 
    for i in range(10): 
     marks.append(int(input())) 
except ValueError: 
    print("You entered an invalid mark, it must be a number.") 
    sys.exit(1) 

average = sum(marks) #I'd just like to note the misleading variable name here. 
#average = sum(marks)/len(marks) #This would be the actual average mark. 
print(average) 

for mark, boundary in mark_boundaries: 
    if average >= boundary: 
     print("Grade "+mark) 
     break #We only want to print out the best grade they got. 

我々は境界を定義するタプルのリストを使用します。私たちは一致した場合に最高から最低までチェックします(したがって、低いスコアに落ちることはありません)。

同様に、マークを使用してデータを収集するためにループを使用していることがわかります。プログラミング中に非効率的なやり方をしているという良い兆候は、コードを少しコピーして貼り付ける(または何度も繰り返す)ということです。これは一般的に、ループに入れたり、関数にする必要があることを意味します。 eval(input())ではなくint(input())も使用しました。より安全なオプションです。ユーザーが望むものは実行できません。また、ユーザーが数字でないものを入力すると、ValueErrorの例外をうまくキャッチできます。

驚くべき個人はペアタプルのリストを見て、dictが良い代替品と考えるかもしれないことに注意してください。ほとんどの場合、この場合、我々は正しいことを命じる必要があります。dictは秩序が恣意的であり、低いスコアを最初にチェックして、値下げします。

だけのノートとして、Pythonで

if 31 < average < 41: #Equivalent to `if 31 < average and average < 41:` 
    print("Grade B") 

を行うことは完全に可能です。つまり、このような使い方では、これはリストとループを使用するよりもはるかに多くの型付けを意味するか、if/elifです。

+0

答えをありがとう!しかし、私にとってはちょっと複雑すぎました。下の答えは、私を最も助けました。私はさらにPythonに入ると確信しています。私はあなたが暗示していることを理解するでしょう –

+0

@JosephSmithあなたは何を理解していませんでしたか? –

+0

コマンドの多く(ステートメント、関数..)あなたがそれらを呼び出すものは何でも。私はこれまで見たことがない。あなたは明らかにプログラミングについて多くのことを知っていますが、私は本当に始まったばかりです。とにかく答えてくれてありがとう:私はもう少し経験があるときにこれに戻ってきます! –

3

基本的に、これはあなたが望むものである:

if average >41: 
    print(" Grade A ") 
elif average >31: 
    print(" Grade B") 
elif average >21: 
    print(" Grade C") 
elif average >11 : 
    print(" Grade D") 
elif average >0 
    print(" Grade E") 
else 
    print("You broke the system") 

elifelse ifの略ですので、以前のif/elifブロックが実行されなかった場合にのみ実行されます。

+0

マックス、私はそのElifソリューションを以前に試してみましたが、あなたはそれを別のやり方でやりました。 –

関連する問題