0

スタックオーバーフローに投稿するのはこれが初めてなので、サイトのエチケットに関してすべてを正しく行っていることを願っています。私は初心者のプログラミング クラス (Python) に参加しています。現在の割り当ては、ユーザー入力を考慮して、炭素、水素、および酸素の化合物の分子量を計算することです。C2 から C8H19O2 などのように指定できます。

コードを持っていますが、よくわからないエラーが発生し続けます。基本的に私がやろうとしているのは、コードに入力化合物を文字ごとに読み取らせ、それが分子であるかどうかを判断させることです。次に、前の文字の右側にある文字を読み取り、それが別の化合物の数字かどうかを判断します。それが別の化合物である場合、前の単一の化合物は、それが合計であった分子の現在の集計に追加されます。数値の場合は、右側の次の文字を読み取って、数値か文字かをもう一度判断します。数値の場合は、前の文字数を 10 倍してから次の文字数を加算し、次の文字に到達するまで繰り返します (C123H2 は 10*1 + 2 の後に 10*12 + 3 が続き、実行中の集計に 123 カーボンが追加されます)。集計が完了すると、その数値にそれぞれの分子量を掛けます。リストのインデックスが範囲外であるというインデックス エラーが表示され続けます。どんな助けでも大歓迎です!

デフメイン():

C1 = 0
H1 = 0
O1 = 0
num = 0

chemicalFormula = (input("Enter the chemical formula, or enter key to quit: "))
while True:
    cformula = list(chemicalFormula)
    for index, x in enumerate(cformula):
        if x == 'C':
            if cformula[index + 1] == 'H' or cformula[index + 1] == 'O':
                C1 += 1
            else:
                for index, y in enumerate(range(index + 1, 1000000000)):
                    if cformula[index + 1] != 'H' or cformula[index + 1] != 'O':
                        num = int(y)
                        num = num*10 + int(cformula[index + 1])
                    else:
                        C1 += num
                        break
        elif x == 'H':
            if cformula[index + 1] == 'C' or cformula[index + 1] == 'O':
                H1 += 1
            else:
                for y in range(index + 1, 1000000000):
                    if cformula[index + 1] != 'C' or cformula[index + 1] != 'O':
                        num = int(y)
                        num = num*10 + cformula[index + 1]
                    else:
                        H1 += num
                        break
        elif x == 'O':
            if cformula[index + 1] == 'C' or cformula[index + 1] == 'H':
                O1 += 1
            else:
                for y in range(index + 1, 1000000000):
                    if cformula[index + 1] != 'C' or cformula[index + 1] != 'H':
                        num = int(y)
                        num = num*10 + cformula[index + 1]
                    else:
                        O1 += num
                        break
        else:
            break

weightC = 15.994*C1
weightH = 1.0079*H1
weightO = 12.011*O1

sumWeight = weightC + weightH + weightO
print("The molecular weight is ", sumWeight)
4

2 に答える 2

0

という名前のいくつかの異なる変数がindexあり、それらは互いに隠れています。

まず、cformula を反復処理します。

for index, x in enumerate(cformula)

わかった。soindexは常に の適切な範囲内にありcformulaます。しかし、その直後にあなたはそうします

for index, y in enumerate(range(index + 1, 1000000000))

index は 1000000000 になり、次のようになります。

if cformula[index + 1]

おっとっと。cformulaこの式を適切に評価する必要があるため、サイズが 1000000002 に近づくことさえありません。ここは本当に必要ないと思いenumerateます。

あなたがしなければならないことは、メインの繰り返しの現在の要素cformulaを使用してアクセスすることだけです。xあなたがそれを読むだけである限り(それはあなたが実際に必要とするものです)、それは問題ありません.

質問から、あなたは正確に何を意味するのか理解していないようですenumerate- あなたは実際に特別なものを必要としない場所でそれを使用しています.

同じ変数を異なる意味で使用しないでください。

于 2013-05-24T03:47:44.003 に答える