파이썬 계산기 프로그램 질문
본문
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
elif len(self.a) >= 5:
이 것 때문에 + 나 - 가 있는 문으로 가지 않습니다.
else 아래에 있는 +/-를 이 문장위로 올리고, 5개, 7개가 들어 올때도 +/-가 처리 되도록 하면 될 것 같습니다.
효율적으로 한다고 하면 switch문을 쓰고, while같은 loop을 쓰면서 현재 캐릭터의 index를 활용해서 처리하는 방법이 있을 것 같습니다.
!-->