سلام روزتون بخیر
من تابع eval رو نوشتم اما باگی که داره اینه وقتی پرانتزی درون پرانتز دیگریه خطا میده و ایدهای ندارم که باید چیکار کنم
اگر ایدهای دارید خوشحال میشم کمکم کنید وگرنه همین رو به عنوان نکته آموزشی درون سایت قرار میدم
'''
bayad bein adad va parantez amaliat riazi bashe
tavan va radikal ro in kod poshtibani nemikone
bugi ke dare ine parantezi daroon parntez dige bashe be moshkel bar mikhore
'''
ebarat_string = input("Please Enter ... \\n")
print(eval(ebarat_string))
ebarat_string = ebarat_string + '.' # to khat 15 ta 40 baray jelogiry as yek bag mishe va adad akhar ham be list e ezafe mishe
def joda_sazi (ebarat_string):
ebarat_joda_shode = list()
for i in ebarat_string: #kol string ra joda mikone
ebarat_joda_shode += i
return ebarat_joda_shode
def chasbondan_adad(ebarat_joda_shode):
list_ebarat = list()
d = str()
for i in ebarat_joda_shode: #adad ra be ham michasbone
if i.isalnum():
d = d+i
else:
list_ebarat.append(d)
d = ''
if i == '(':
list_ebarat.append('(')
elif i == ')':
list_ebarat.append(')')
elif i == '*':
list_ebarat.append('*')
elif i == '/':
list_ebarat.append('/')
elif i == '+':
list_ebarat.append('+')
elif i == '-':
list_ebarat.append('-')
for i in range(list_ebarat.count('') ):# string khali hay ezafi ke niazi be anha nadarim ra pak mikonad
list_ebarat.remove('')
return list_ebarat
def amaliat_ha (list_ebarat):
while list_ebarat.count('*') != 0:
jaygah_alamat_amaliat = list_ebarat.index('*')
amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) * (float(list_ebarat[jaygah_alamat_amaliat + 1]))
list_ebarat.pop(list_ebarat.index('*') -1)
list_ebarat.pop(list_ebarat.index('*') +1)
list_ebarat.pop(list_ebarat.index('*'))
list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
while list_ebarat.count('/') != 0:
jaygah_alamat_amaliat = list_ebarat.index('/')
amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) / (float(list_ebarat[jaygah_alamat_amaliat + 1]))
list_ebarat.pop(list_ebarat.index('/') -1)
list_ebarat.pop(list_ebarat.index('/') +1)
list_ebarat.pop(list_ebarat.index('/'))
list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
while list_ebarat.count('+') != 0:
jaygah_alamat_amaliat = list_ebarat.index('+')
amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) + (float(list_ebarat[jaygah_alamat_amaliat + 1]))
list_ebarat.pop(list_ebarat.index('+') -1)
list_ebarat.pop(list_ebarat.index('+') +1)
list_ebarat.pop(list_ebarat.index('+'))
list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
while list_ebarat.count('-') != 0:
jaygah_alamat_amaliat = list_ebarat.index('-')
amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) - (float(list_ebarat[jaygah_alamat_amaliat + 1]))
list_ebarat.pop(list_ebarat.index('-') -1)
list_ebarat.pop(list_ebarat.index('-') +1)
list_ebarat.pop(list_ebarat.index('-'))
list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
return list_ebarat
def parantez (list_check): #baray mohasebe dakhle parantez
list_check = list_check[list_check.index('(') : list_check.index(')') + 1]
if list_check.count('(') > 1 :
return parantez
else:
list_check = amaliat_ha(list_check)
list_check.remove('(')
list_check.remove(')')
adad_akhar_parantez = list_check.pop()
return(adad_akhar_parantez)
def mohasebe(ebarat_string): #mohasbe akhar
list_ebarat = (chasbondan_adad(joda_sazi(ebarat_string)))
tedad_parantez = list_ebarat.count('(')
i = 0
while i < tedad_parantez :
adad_jay_gozari = parantez(list_ebarat)
while (list_ebarat.index('(') + 1) != list_ebarat.index(')'):
list_ebarat.pop(list_ebarat.index('(') + 1)
list_ebarat.insert(list_ebarat.index('('), adad_jay_gozari)
list_ebarat.remove('(')
list_ebarat.remove(')')
i += 1
list_ebarat = amaliat_ha(list_ebarat)
javab_akhar = list_ebarat.pop()
return javab_akhar
print(mohasebe(ebarat_string))