2012-10-30 2 views
3

파이썬 : 3/4/5 또는 32432/23423/2354325 나 3425 * 343/254235와 같은 표현식을 사용하는 프로그램 (클래스 할당)을 작업 중입니다. 43252 + 34254-2435, 등 (모든 연산자는 +, -, /, *). 표현을 해결할 것입니다.파이썬 : 수학 표현 파싱

I CANT 사용 EVAL! 나는 더 높은 수준의 코드를 사용하지 못할

은, 내가 문자열을 분할 아래의 웹 사이트에서 문자열 조종 장치를 사용하여, 기껏로 제한하고있다.

http://docs.python.org/2/library/stdtypes.html#typesseq

내 방법이 연산자 및 슬라이싱 함수를 사용해서 사용자가 입력 표현을보고하고 운영자를 찾는 find 함수를 사용한다 (예를 들면 S [0 : X]). . 내가 가지고있는 것은 아래에 있으며 불행하게도 작동하지 않는다 : * print 문은 디버깅 목적으로 만 존재한다. EDIT : 프로그램을 실행하고 표현식을 입력 할 때 x가 정의되지 않은 이유는 무엇입니까?

z= (input("expression:")).strip() 

def finding(z): 
    if "/" in z: 
     x=z.find("/") 
     print("hi1") 
    elif "*" in z: 
     x=z.find("*") 
     print("hi2") 
    elif "+" in z: 
     x=z.find("+") 
     print("hi3") 
    elif "-" in z: 
     x=z.find("-") 
     print("hi4") 
    else: 
     print("error, not math expression") 
    return x 

def Parsing(z,x): 

    x= finding(z) 
    qw=z.s[0:x] 
    print (qw) 
# take the x-value from function finding(z) and use it to split 

finding(z) 
Parsing(z,x) 
+1

당신이 요청하지 않았나요 [비슷한 질문] (http://stackoverflow.com/questions/13055884/parsing-math-expression-in-python-and-solving-to-find-an-answer)? 나는이 정확한 질문에 어제 대답했다. 이틀 전에 누군가 다른 사람도 했어. 아무도 당신을 위해 숙제를하지 않을 것입니다. – Blender

+0

@Blender 이것은 새로운 질문에 왜 그것이 노력하고 있는지 완전히 다른 방법입니다. 당신은 언제나 저에게 -1을주기 전에 이미 묻은 것을보기 위해 저의 프로필과 질문을 볼 수 있습니다. 내가 얻고있는 답변이 궤도에서 멀어지고 있기 때문에 나는 새로운 질문을 던졌다.나는 매우 구체적인 것을 요구하고 그것에 답을 주면 숙제를 마칠 수 없으므로 나는 누군가가 내 숙제를 할 수 있도록 같은 질문을 다시하지 않았다. ... – SeesSound

+0

[이 답변] (http://stackoverflow.com/a/13056137/464744)? – Blender

답변

3

, 여기에 당신을 도울 뭔가. 당신이 적어도 그것이 무엇을하는지 이해할 수 있도록 나는 그것을 읽을 수있는 정도로 남겼습니다.

def parse(text): 
    chunks = [''] 

    for character in text: 
     if character.isdigit(): 
      if chunks[-1].isdigit(): # If the last chunk is already a number 
       chunks[-1] += character # Add onto that number 
      else: 
       chunks.append(character) # Start a new number chunk 
     elif character in '+-/*': 
      chunks.append(character) # This doesn't account for `1 ++ 2`. 

    return chunks[1:] 

사용 예제 :

>>> parse('123 + 123') 
['123', '+', '123'] 
>>> parse('123 + 123/123 + 123') 
['123', '+', '123', '/', '123', '+', '123'] 

내가 당신에게 나머지를 떠날거야 당신이 나를 필요하면 그것의 어떤 부분을 설명 할 것이다. .isdigit()을 사용할 수 없으면 하위 수준의 Python 코드로 바꿔야합니다.

나는이 프로그램을 실행하고 식을 입력 할 때 왜 x가 정의되지 않은
+0

좋은, 내 시도보다 더 [여기] (http://stackoverflow.com/questions/13116167/python-creating-a-calculator/13116467#13116467) –

+0

@BurhanKhalid 그것은 함수의 정의에 자리 표시 자입니다. 믿다. – SeesSound

+0

@blender yes 모든 코드를 사용할 수 있습니다. 나는 "텍스트"가 함수의 정의 밖의 입력 일 가능성이 높다는 것을 이해한다. 가변 문자가 어디에 들어 있는지 이해하지 못합니다. 함수의 매개 변수에는 정의되어 있지 않지만 인수에는 사용되고 있습니다. – SeesSound

2

이 작업을 수행하는 가장 쉬운 방법, 내 생각, 후위 표기법에 방정식을 변환하는 Shunting-yard algorithm을 구현하고 왼쪽에서 오른쪽으로 실행됩니다.

하지만이 클래스 과제이기 때문에, 당신은 실제 구현 자신을해야

, 나는 이미 당신에게 내가 가진 것보다 더했다. 당신은 그냥 그 부분으로 입력을 분할하는 데 문제가있는 경우

+0

죄송합니다 이것은 전혀 도움이되지 않았다. 사용자가 위의 방법과 관련하여 구체적인 예를 들어 주었고이 방법을 사용할 수 없다는 것을 깨달았습니다. – SeesSound

+0

그런데 왜 그 방법에 대한 질문을하지 않았고 전체 질문을 다시 반복하지 않고 문제가 발생 했습니까? –

+0

사실 그것은 여러분의 필요에 맞고, 우선 순위를 존중하며, 외부 라이브러리를 필요로하지 않습니다. 왜냐하면 전에 여유 시간에 이것을 파이썬으로 구현했기 때문입니다. – wiill

0

?

x은 범위 내에 있지 않으므로 메서드에서만 정의하고 다른 곳에서는 액세스하려고합니다. 당신이를 저장하지 않기 때문에 Parsing 이후

z= (input("expression:")).strip() 

def finding(z): 
    # ... removed your code ... 
    # in this method, you define x, which is local 
    # to the method, nothing outside this method has 
    # access to x 
    return x 

def Parsing(z,x): 

    x= finding(z) # this is a different x that is assigned the 
        # return value from the 'finding' method. 
    qw=z.s[0:x] # I'm curious as to what is going on here. 
    print (qw) 
# take the x-value from function finding(z) and use it to split 

finding(z) # here, z is the value from the top of your code 
Parsing(z,x) # here, x is not defined, which is where you get your error. 

이미 x의 값을 얻을 수 finding를 부르고, 당신이 Parsing에 전달할 필요가 없습니다, 당신은 또한, Parsing 외부 finding(z)를 호출 할 필요는 없다 어디서든 가치.

def Parsing(z): 

    x= finding(z) # this is a different x that is assigned the 
        # return value from the 'finding' method. 
    qw=z.s[0:x] # I'm curious as to what is going on here. 
    print (qw) 
# take the x-value from function finding(z) and use it to split 

# finding(z) -- not needed 
Parsing(z) 
+0

첫 번째 함수에있는 X를 두 번째 함수로 가져 오려면 어떻게해야합니까? – SeesSound

+0

두 번째 함수에서 첫 번째 함수를 호출하고 결과 'x = finding (z)'를 저장 했으므로 두 번째 함수에 이미이 함수가 있습니다. –