테스트 사이트 - 개발 중인 베타 버전입니다

파이썬 계산기 프로그램 질문

lhy 4년 전 조회 4,236

 

class calculator:

    print("이 프로그램은 사칙연산 연산자 3개와 정수 피연산자 4개로 구성된 수식을 입력 받아 결과를 출력하는 프로그램입니다.")

    def __init__(self):         while True:             num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]             operator = ["+", "-", "*", "/"]             self.a = []             c = 0             oper = []             n = []                      formula = input("사칙연산 (+, -, *, /) 연산자 3개 이하와 정수 피연산자 4개 이하로 구성된 수식을 입력하세요: ").replace(' ', '')

            for i in formula:                             if i not in num and i not in operator:                     print("잘못 입력하였습니다.")                     calculator.__init__(self)                     return                              formula += "+"                              for i in range(len(formula)):                 if formula[i] in operator:                     self.a.append(formula[c:i])                     self.a.append(formula[i])                     n.append(formula[c:i])                     oper.append(formula[i])                     c = i + 1

            del self.a[-1]             del oper[-1]

            for i in range(self.a.count('')):                 self.a.remove('')                 n.remove('')

            for i in n:                 i = i.strip()

            if self.a[0] == "-":                 if len(oper) == len(n):                     self.a[0] = self.a[0]+self.a[1]                     del self.a[1]                 else:                     print("잘못 입력하였습니다.")                     self.a.clear()                     n.clear()                     oper.clear()                     c = 0                     continue                              else:                 if len(oper) + 1 != len(n):                     print("잘못 입력하였습니다.")                     self.a.clear()                     n.clear()                     oper.clear()                     c = 0                     continue                              print(self.a)             calculator.main(self)             break                  def multiply(self, n):         self.a[n] = int(self.a[n-1])*int(self.a[n+1])         del self.a[n-1]         del self.a[n]         return

    def divide(self, n):         self.a[n] = int(self.a[n-1])/int(self.a[n+1])         del self.a[n-1]         del self.a[n]         return              def add(self, n):         self.a[n] = int(self.a[n-1])+int(self.a[n+1])         del self.a[n-1]         del self.a[n]         return

    def subtract(self, n):         self.a[n] = int(self.a[n-1])-int(self.a[n+1])         del self.a[n-1]         del self.a[n]         return

    def main(self):         if len(self.a) == 1:             print(self.a[0])             return                  elif self.a[1] == "*":             calculator.multiply(self, 1)             calculator.main(self)                          elif self.a[1] == "/":             calculator.divide(self, 1)             calculator.main(self)

        elif len(self.a) >= 5:             if self.a[3] == "*":                 calculator.multiply(self, 3)                 calculator.main(self)

            elif self.a[3] == "/":                 calculator.divide(self, 3)                 calculator.main(self)

            elif len(self.a) == 7:                    if self.a[5] == "*":                     calculator.multiply(self, 5)                     calculator.main(self)

                elif self.a[5] == "/":                     calculator.divide(self, 5)                     calculator.main(self)

        else:             if self.a[1] == "+":                 calculator.add(self, 1)                 calculator.main(self)

            elif self.a[1] == "-":                 calculator.subtract(self, 1)                 calculator.main(self)                               calculator()

 

사칙연산 수식을 문자열로 입력 받아서 eval 함수를 사용하지 않고 계산하는 코드를 짜기 위해 위와 같이 코드를 작성했습니다. 그런데 아래와 같이 입력하면 결과가 출력되지 않고 프로그램이 그냥 종료되어버립니다. (출력된 리스트는 확인 차 출력한 겁니다.) 왜 이러는 건가요? 다른 사칙연산 수식은 다 잘 계산되어 출력되는데,  +/-  ->  +/-  ->  곱셈/나누기 이 순서로 가는 수식은 그냥 프로그램이 종료되네요...

 

 

그리고 혹시 코드를 더 효율적으로 바꿀 수 있는 방법이 있으면 그것도 알려주시면 감사하겠습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변 1개

4년 전

</p>

<p>elif len(self.a) >= 5:</p>

<p>

이 것 때문에 + 나 - 가 있는 문으로 가지 않습니다.

 

else 아래에 있는 +/-를 이 문장위로 올리고,  5개, 7개가 들어 올때도 +/-가 처리 되도록 하면 될 것 같습니다.

 

효율적으로 한다고 하면 switch문을 쓰고, while같은 loop을 쓰면서 현재 캐릭터의 index를 활용해서 처리하는 방법이 있을 것 같습니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인