0

だから私は簡単な電卓を作っています。これは私がこれまでに持っているものです:

import time
print ("Welcome. This is a calculator that uses the function: A (operator) B.")
time.sleep(3.5)
print ("Available operators include: Addition, Subtraction, Multiplication, Division,     Exponent, and Remainder division.")
time.sleep(3.5)
while True:
    a = float(input("Type in a value of A. "))
    b = float(input("Type in a value of B. "))
    opera = input("Would you like to: Add - Subtract - Multiply - Divide - Exponent - or Remainder? ")
    opera = opera.lower()
    while not (opera) == "add" or (opera) == "subtract" or (opera) == "multiply" or (opera) == "divide" or (opera) == "exponent" or (opera) == "remainder":
        print ("Invalid operation.")
        opera = input("Would you like to: Add - Subtract - Multiply - Divide - Exponent - or Remainder? ")
        break
    if (opera) == "add":
        print ((a) + (b))
    if (opera) == "subtract":
        print ((a) - (b))
    if (opera) == "multiply":
        print ((a) * (b))
    if (opera) == "divide":
        print ((a) / (b))
    if (opera) == "exponent":
        print ((a) ** (b))
    if (opera) == "remainder":
        print ((a) % (b))
    cont = input("Would you like to do another problem?")
    cont = cont.lower()
    if cont != "yes":
        break
    quit

そのため、電卓を起動して a と b の値を入力すると、add 以外の値を入力すると無効な操作になります。次に、有効な操作を入力するように求められ、すべての操作で機能します。どうすれば修正できますか?問題は、while true の内部ではなく while に関係していると思います。

4

2 に答える 2

1

括弧の問題だと思います。

 while not (opera) == "add" or (opera) == "subtract" or (opera) == "multiply" or (opera) == "divide" or (opera) == "exponent" or (opera) == "remainder":

する必要があります

 while not ((opera) == "add" or (opera) == "subtract" or (opera) == "multiply" or (opera) == "divide" or (opera) == "exponent" or (opera) == "remainder"):

あなたのnotは、最初の用語「追加」にのみ適用されます。その後機能する理由は、ブレークのために条件付きではない while に戻らないためです。

この種の問題を解決するためのはるかに洗練された方法として、辞書を検討します。

于 2013-11-10T14:19:04.293 に答える
0

実際、スクリプトには多くの問題があります。以下の変更を参照してください。

演算 = (「加算」、「減算」、「乗算」、「除算」、「指数」、「剰余」)

print ("ようこそ。これは関数を使用する電卓です: A (演算子) B. \n") print ("使用可能な演算子には次のものがあります: {0}".format(operations))

while True: a = float(raw_input("A の値を入力します。")) b = float(raw_input("B の値を入力します。"))

opera = raw_input("Which operation would you like to perform? ")
opera = opera.lower()

while opera not in operations:
    print ("Invalid operation.")
    opera = raw_input("Which operation would you like to perform? ")

if opera == "add":
    print (a + b)
if opera == "subtract":
    print (a - b)
if (opera) == "multiply":
    print (a * b)
if (opera) == "divide":
    print (a / b)
if (opera) == "exponent":
    print (a ** b)
if (opera) == "remainder":
    print (a % b)

if raw_input("Would you like to do another problem?").lower() != 'yes':
    break

問題 0: スリープ ステートメントは常にユーザーの観点から不快であり、テスト デバッグの実行に 7 秒追加されました。それらを取り除きます。本当に... 本当に... 必要な場合は、完了したら元に戻してください。

問題 1: raw_input 関数の代わりに入力関数を使用しました。python docs を読んでください。入力関数は、入力したものに対して eval ステートメントを実行します。「add」コマンドを実行しようとしたときに NameError が発生しました。代わりに raw_input を使用してください。

問題 2: while ステートメントのロジックが間違っていました。while (opera != 'add) または ... と言うこともできましたが、有効な値をすべてタプルに追加することにしました。その方がきれいで、すっきりしています。また、ループから抜け出すロジックが間違っていました。ループから抜け出す入力に関係なく、同じ効果のために if ステートメントを使用した方がよいでしょう。

問題 3: これは c スタイルの switch ステートメントを叫ぶので、辞書を使用してください。辞書を使用して、演算 (「加算」、「乗算」など) の文字列形式を関数ポンターに関連付けます。それは非常に明確で、よりpythonicになります。必要に応じて、辞書を使用するためのコードを投稿できます。

于 2013-11-10T14:43:58.943 に答える