-
Notifications
You must be signed in to change notification settings - Fork 0
/
EXP_Fixed.py
105 lines (105 loc) · 4.71 KB
/
EXP_Fixed.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#Exp.py
def Num_of_Bracket(Exp):
cnt = 0
for i in range(0,len(Exp)):
if Exp[i] == ')': cnt+=1
return cnt
def Replace_EXP(Exp):
NUM = list();RES = list();DEL_BALNK = list();TMP='';m_cnt=0 ###십의 자리 이상 숫자들을 정리
for i in Exp:
if i == 'U': continue
if i == '-' or i == '+' or i == '*' or i == '/':
NUM.append(TMP);NUM.append(i);TMP=''
continue
TMP+=str(i)
NUM.append(TMP)
for i in NUM:
if i == '': continue
DEL_BALNK.append(i)
for i in range(0,len(DEL_BALNK)): ### 음수들을 정리
if DEL_BALNK[i] == '' or m_cnt > 0: m_cnt=0;continue
if DEL_BALNK[i] == '-':
if i == 0 or DEL_BALNK[i-1] == '+' or DEL_BALNK[i-1] == '*' or DEL_BALNK[i-1] == '/' or DEL_BALNK[i-1] == '(':
NRE = DEL_BALNK[i]+DEL_BALNK[i+1];
RES.append(NRE);m_cnt+=1
continue
RES.append(DEL_BALNK[i])
print(RES)
return RES
def Replace_Bracket(Exp):
first=0;last=0;NUM = list()
Tmp_Exp=list();Exp = list(Exp)
for i in range(0,Num_of_Bracket(Exp)):
first = Find_Left_Bracket(Exp) ### 알고리즘 -> 왼쪽부터 괄호를 찾아 나간다 맨 마지막에 위치한 왼쪽 괄호를 first변수에 저장
last = Find_Right_Bracket(Exp) ### (만약 왼쪽 괄호의 위치가 오른쪽 괄호의 위치보다 크다면 오른쪽 괄호보다 작은 위치의 왼쪽 괄호 위치를 반환한다,이 작업은 Find_Left_Bracket에서 수행한다)
Tmp_Res = Calculate(Exp[first:last])
for j in range(first-1,last+1):
Exp[j] = 'U'
Exp.insert(first-1,Tmp_Res)
return Calculate(Exp)
def Find_Left_Bracket(Exp):
Out_cnt = 0
for i in range(0,len(Exp)):
if Out_cnt > 0: break
if Exp[i] == ')': Out_cnt+=1
if Exp[i] == '(': first = i
return first+1
def Find_Right_Bracket(Exp):
for i in range(len(Exp)-1,-1,-1):
if Exp[i] == ')': last = i
return last
def Find_NUM_Left(Exp,Loc):
for i in range(Loc,-1,-1):
if Exp[i] != 'U' and Exp[i] != '+' and Exp[i] != '-' and Exp[i] != '/' and Exp[i] != '*':
return i
def Find_NUM_Right(Exp,Loc,LEN):
for i in range(Loc,LEN+1):
if Exp[i] != 'U' and Exp[i] != '+' and Exp[i] != '-' and Exp[i] != '/' and Exp[i] != '*':
return i
def Find_FP_OP(Exp):
cnt = 0
for i in range(0,len(Exp)):
if Exp[i] == '*': cnt+=1
if Exp[i] == '/': cnt+=1
return cnt
def Find_SP_OP(Exp):
cnt = 0
for i in range(0,len(Exp)):
if Exp[i] == '+': cnt+=1
if Exp[i] == '-': cnt+=1
return cnt
def Calculate(Exp):
Tmp_NUM = list();NUM = Replace_EXP(Exp)[::] ### 숫자들을 정렬(1,100,1000)
FPv = Find_FP_OP(Exp) ### 연산하고자 하는 연산자의 수를 센다
for i in range(0,len(NUM)+FPv): ### 곱하기와 나누기 연산 진행
if NUM[i] == '*':
Tmp_Res = float(NUM[Find_NUM_Left(NUM,i)])*float(NUM[Find_NUM_Right(NUM,i,len(NUM))])
for j in range(Find_NUM_Left(NUM,i),Find_NUM_Right(NUM,i,len(NUM))+1):
NUM[j] = 'U'
NUM.insert(i-1,Tmp_Res)
elif NUM[i] == '/':
Tmp_Res = float(NUM[Find_NUM_Left(NUM,i)])/float(NUM[Find_NUM_Right(NUM,i,len(NUM))])
for j in range(Find_NUM_Left(NUM,i),Find_NUM_Right(NUM,i,len(NUM))+1):
NUM[j] = 'U'
NUM.insert(i-1,Tmp_Res)
for i in NUM: ### 리스트의 길이를 위해 대신 채운 u 값을 거를 차례
if i == 'U': continue
Tmp_NUM.append(i)
SPv = Find_SP_OP(Tmp_NUM) ### 연산하고자 하는 연산자의 수를 센다
for i in range(0,len(Tmp_NUM)+SPv): ### 더하기와 빼기 연산 진행
if Tmp_NUM[i] == '+':
Tmp_Res = float(Tmp_NUM[Find_NUM_Left(Tmp_NUM,i)])+float(Tmp_NUM[Find_NUM_Right(Tmp_NUM,i,len(Tmp_NUM))])
for j in range(Find_NUM_Left(Tmp_NUM,i),Find_NUM_Right(Tmp_NUM,i,len(Tmp_NUM))+1):
Tmp_NUM[j] = 'U'
Tmp_NUM.insert(i-1,Tmp_Res)
elif Tmp_NUM[i] == '-':
Tmp_Res = float(Tmp_NUM[Find_NUM_Left(Tmp_NUM,i)])-float(Tmp_NUM[Find_NUM_Right(Tmp_NUM,i,len(Tmp_NUM))])
for j in range(Find_NUM_Left(Tmp_NUM,i),Find_NUM_Right(Tmp_NUM,i,len(Tmp_NUM))+1):
Tmp_NUM[j] = 'U'
Tmp_NUM.insert(i-1,Tmp_Res)
for i in Tmp_NUM:
if i == 'U': continue
RESULT = i
return RESULT
EXP = input("수식을 입력해주세요 : ")
print("RESULT : %.2lf"%Replace_Bracket(EXP))