2

自動販売機をシミュレートするプログラムに取り組んでいます。コードのこのセクションで無限ループが作成される場合がありますが、その理由がよくわかりません。問題がどこにあるかを確認するためにPythonチューターを実行しました。変数price_remaining = 5の場合、elifステートメントを通過しない場合があるようです。何が何らかの形でそれを引き起こすのか、私には完全にはわかりません。誰かがそれに基づいて説明できることを期待して、入力したものをコピーして python tutor に貼り付けます。編集: python tutor をもう少しチェックしたところ、price_remaining の値が 5 で終わる場合にのみ発生するようです。たとえば、2.05、0.05、1.15 などです。

price_remaining = 2.55
price_remaining = price_remaining * 100
q_stock = 25
q_returned = -0
d_stock = 25
d_returned = 0
n_stock = 25
n_returned = 0
while price_remaining > 0:
    if price_remaining >=25 and q_stock > 0:
        price_remaining = price_remaining - 25
        q_stock = q_stock - 1
        q_returned = q_returned + 1
    elif price_remaining >=10 and d_stock > 0:
        price_remaining = price_remaining - 10
        d_stock = d_stock - 1
        d_returned = d_returned + 1
    elif price_remaining >=5 and n_stock > 0:
        price_remaining = price_remaining -5
        n_stock = n_stock - 1
        n_returned = n_returned + 1

print( q_returned)
print( d_returned)
print( n_returned

)

4

1 に答える 1

6

行を追加すると

print(repr(price_remaining), repr(n_stock))

whileループの開始時に、コードは生成します

254.99999999999997 25
229.99999999999997 25
204.99999999999997 25
179.99999999999997 25
154.99999999999997 25
129.99999999999997 25
104.99999999999997 25
79.99999999999997 25
54.99999999999997 25
29.99999999999997 25
4.999999999999972 25
4.999999999999972 25
4.999999999999972 25
[.. forever ..]

浮動小数点数の仕組み (リマインダーについてはこちらを参照) のため、可能な各数値を常に完全に表現できるとは限らないため、すべて 9 になります。

いずれにせよ、onceは、たとえそれがわずかに少なくても、コードにはトリガーされるブランチがありprice_remaining < 5ません。if

于 2013-01-25T01:51:16.730 に答える