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

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

QA

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

답변 1

본문

2049248357_1622847361.5244.jpg2049248357_1622847361.8551.jpg2049248357_1622847361.8192.jpg

 

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

 

2049248357_1622847469.7023.jpg

 

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

이 질문에 댓글 쓰기 :

답변 1


elif len(self.a) >= 5:

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

 

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

 

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

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 954
© SIRSOFT
현재 페이지 제일 처음으로