使用Python创建一个计算器(Python creating a calculator)

2019-07-03 10:37发布

我是相当新的蟒蛇。

我已被要求创建仅使用串命令计算器,INT /串之间的转换/浮动等(如果需要),以及使用功能是必需的。 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.

所有的帮助表示赞赏。 如果你不确定你提供的代码是否是我的需要过于激烈,请在浪费你的时间,我前询问,使代码,我不可能使用。 我保证及时回复。

基本上,我试图找到一种方法来拆分输入的字符串,然后它开始计算。

Answer 1:

下面是使用正则表达式的可能解决方案的轮廓。 错误检查留作练习。 如果这不是功课,你想看到的充实出解决方案, 在这里查看

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


Answer 2:

因为这看起来像功课,我怀疑OP被允许使用典型的方式来解决这个问题。 我认为这是输入验证和字符串操作练习; 其次是程序流程和理解函数的返回值。

有您需要做两件事情:

  1. 弄清楚什么是有效输入你的程序。
  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

之后,你有正确的输入,下一步是将输入分成,你需要养活你的数学函数的各个部分。 我会离开的那部分给你。


假设你有正确的字符串(也就是说,它是你的程序有效输入),你现在需要把它分成两个部分。

  1. 操作员(数学符号)
  2. 操作数(周围的数学符号的数字)

因此,我们知道,我们有一组有限的运营商+,-,/,* ,这样一个想法是使用split()的字符串的方法。 这种运作良好:

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

你会尝试与所有的运营商分割字符串,然后检查结果。 需要注意的是分裂与不存在不会引发任何错误字符的字符串,但你只是字符串返回:

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

因此,一种方法是 - 分割字符串的运营商,如果生成的列表中有长度> 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

为了得到正常表达(称为缀)波兰风味,使用调度场算法 ,这是计算机科学我最喜欢的基于列车算法。

使用调车场到您的表达式转换为波兰表示法,然后用伪代码来解方程。 您可以使用列表作为你的“栈”。

请记住,所有的输入是字符串,因此请确保将其转换为整数时,你在做实际的数学。



Answer 3:

如果你正在做只是一个玩具计算器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))


Answer 4:

我要你的代码的替代品。 用户可以输入类似的东西:8 * 6 / 4-3 + 3,这仍然可以工作。 它如果输入一个字母(d,A,S)也不会崩溃。 非常紧凑。

代码(Python的3.3.0):

valid_chars = "0123456789-+/* \n";
while True:
    x = "x="
    y = input(" >> ")
    x += y
    if False in [c in valid_chars for c in y]:
        print("WARNING: Invalid Equation");
        continue;
    if(y == "end"):
        break
    exec(x)
    print(x)


文章来源: Python creating a calculator