-1

私はPythonにかなり慣れていません。

文字列コマンド、int/string/float 間の変換 (必要な場合) のみを使用して電卓を作成するように依頼されました。関数を使用する必要があります。while および for ループも使用できます。

プログラムは、x/y または x/y/z の形式の入力を受け取る必要があります。ここで、xyz は正または負の数値です。「/」は足し算、掛け算、引き算でも代用できます。また、オペランドと演算子の間に任意の数の空白を含めることができます。これは私がこれまでに持っているもののアイデアです。

+、-、/、および * には独自の定義があります。ユーザーが入力する関数を作成します。「.lstrip」と「.rstrip」を使用して空白を取り除きます。

今私が問題を抱えているのは、入力関数の作成です。私は関数に非常に慣れていません。これは基本的に私が持っているものです。私はそれを扱うことはあまりないことを知っていますが、関数を正しく入力する方法に本当にこだわっています.

def multiplication(x,a,y,b,z):
    if (a== "*"):
        return x*y
    if (b== "*"):
        return y*z

def division(x,a,y,b,z):
    if (a== "/"):
        return x/y
    if (b== "/"):
        return y/z

def addition(x,a,y,b,z):
    if (a== "+"):
        return x+y
    if (b== "+"):
        return y+z

def subtraction(x,a,y,b,z):
    if (a== "-"):
        return x-y
    if (b== "-"):
        return y-z

def (x,y,z):
    x=0
    y=0
    z=0

    zxc=int(input()):# this is where I get stuck and I don't know how to implement x,y,z into the input.

すべての助けに感謝します。あなたが提供するコードが私のニーズに対して強すぎるかどうかわからない場合は、私がおそらく使用できないコードを作成して時間を無駄にする前に質問してください. できるだけ早く返信することを約束します。

基本的に、入力された文字列を分割して計算を開始する方法を見つけようとしています。

4

4 に答える 4

2

これは宿題のように見えるので、OPが問題を解決するために典型的な方法を使用することを許可されているとは思えません。これは、入力の検証と文字列操作の演習だと思います。次に、プログラム フローと関数の戻り値について説明します。

ここで行う必要があるのは次の 2 つです。

  1. プログラムへの有効な入力となるものを見つけます。
  2. プログラムに有効な入力をユーザーが入力するまで、ユーザーにプロンプ​​トを表示し続けます。

#1 については、有効な入力は数値 (正または負の整数) であり、式の形式でなければならないことがわかっています。つまり、入力の最小長は 3 (2 つの数字と 1 つの数学記号) であり、入力内の文字 (文字列) は無効です。

これは、ユーザーの入力を取得するための基本的なループです。

expression = raw_input('Please enter the expression: ')
expression_result = check_input(expression)

while not expression_result:
    print 'You did not enter a valid expression'
    expression = raw_input('Please enter the expression: ')
    expression_result = check_input(expression)

このcheck_inputメソッドは、ユーザーが入力したものが何であれ、ルールに基づいて正確であることを検証します。

def check_input(input_string):

    # Check the basics
    if len(input_string) < 3:
        return False

    # Check if we are getting passed correct characters
    for character in input_string:
        if character not in '1234567890' or character not in '/*+-':
            return False

    # Things like /23 are not valid
    if input_string[0] in '/*+':
        return False

    return input_string

正しい入力が得られたら、次のステップは、入力をさまざまな部分に分割して、数学関数に渡す必要があることです。その部分はお任せします。


正しい文字列がある (つまり、プログラムの有効な入力である) と仮定すると、今度はそれを 2 つの部分に分割する必要があります。

  1. 演算子 (数学記号)
  2. オペランド (数学記号を囲む数字)

演算子のセットが限られていることがわかっている+,-,/,*ので、1 つのアイデアはsplit()文字列のメソッドを使用することです。これはうまくいきます:

>>> s = '4+5'
>>> s.split('+')
['4', '5']

すべての演算子で文字列を分割してみて、結果を確認します。存在しない文字で文字列を分割してもエラーは発生しませんが、文字列が元に戻るだけであることに注意してください。

>>> s = '4+5'
>>> s.split('/')
['4+5']

したがって、1 つのアプローチは、演算子で文字列を分割することです。結果のリストの長さが 2 より大きい場合、結果のリストの最初のメンバーが演算子の左側であり、リストの 2 番目のメンバーが何であれ、右側にあります。

これは正の数では問題なく動作しますが、負の数でも次のようになります。

>>> s = '-4+3'
>>> s.split('-')
['', '4+3']

幸いなことに、この問題に直面したのは私たちだけではありません。方程式を評価する別の方法として、ポーランド記法(プレフィックス記法とも呼ばれます) があります。ウィキペディアのページのアルゴリズムは次のとおりです。

Scan the given prefix expression from right to left
for each symbol
 {
  if operand then
    push onto stack
  if operator then
   {
    operand1=pop stack
    operand2=pop stack
    compute operand1 operator operand2
    push result onto stack
   }
 }
return top of stack as result

通常の表現 (中置と呼ばれる) を洗練された風合いにするには、コンピューター サイエンスで私のお気に入りの列車ベースのアルゴリズムであるshunting yard アルゴリズムを使用します。

分流場を使用して式をポーランド語表記に変換し、疑似コードを使用して方程式を解きます。リストを「スタック」として使用できます。

すべての入力は文字列であることに注意してください。実際の計算を行うときは、必ず整数に変換してください。

于 2012-10-29T05:46:33.303 に答える
1

おもちゃの電卓を作成するだけの場合は、eval()ローカル変数とグローバル変数を受け入れるため、次のようなものを使用できます。

def calculate(x=0, y=0, z=0):
    expression = raw_input('Enter an expression: ')

    return eval(expression, None, locals())

コンソール セッションの例を次に示します。

>>> calculate()
Enter an expression: x + 5 - y
5

eval()安全ではないことに注意してください。何かを真面目にしたい場合は、式を解析する必要があります。

また、式は単純なので、正規表現を使用して入力を検証してから入力することもできますeval

def validate(expression):
    operator = r'\s*[+\-/*]\s*'

    return bool(re.match(r'^\s*(?:x{o}y|x{o}y{o}z)$'.format(o=operator), expression))
于 2012-10-29T05:21:18.057 に答える
0

正規表現を使用した可能なソリューションの概要を次に示します。エラーチェックは練習問題として残しました。これが宿題ではなく、肉付けされたソリューションを見たい場合は、ここで表示してください

import re

# input is a list of tokens (token is a number or operator)
tokens = raw_input()

# remove whitespace
tokens = re.sub('\s+', '', tokens)

# split by addition/subtraction operators
tokens = re.split('(-|\+)', tokens)

# takes in a string of numbers, *s, and /s. returns the result
def solve_term(tokens):
    tokens = re.split('(/|\*)', tokens)
    ret = float(tokens[0])
    for op, num in <FILL THIS IN>:
        # <apply the operation 'op' to the number 'num'>
    return ret

# initialize final result to the first term's value
result = solve_term(tokens[0])

# calculate the final result by adding/subtracting terms
for op, num in <FILL THIS IN>:
    result +=  solve_term(num) * (1 if op == '+' else -1)

print result
于 2012-10-29T06:21:34.020 に答える