iT邦幫忙

0

(已解決)python-四則運算與資料結構(?)

  • 分享至 

  • xImage

目前在練習四則運算,我想自己寫判斷,不使用eval()來操作,
我的解題想法是把運算式子用陣列表達,最後會是多層陣列。


x="2*9*3+5*8/2+60*10/5/1"
#經過我的split之後會變成以下:
x=[[['2'], ['9'], '3'], [['5'], ['8', '2']], [['60'], ['10', '5', '1']]]
#我是先分割加減,然後才是乘法,最後是除法

接下來我就知道answer=x[0]+x[1]+x[2],因為第一次分割是加法。
所以要處理這三項,而每一項裡面的值是相乘:

x[0]=x[0][0]*x[0][1]*x[0][2]
x[1]=x[1][0]*x[1][1]

以此類推

最後要處理除法就會像是這樣


x[2][1]=x[2][1][0]/x[2][1][1]/x[2][1][2]

思考方向講完了,接下來是操作,我試圖用一個函式去丟出某陣列的所有項,
但我不知道該如何把所有項拿來運作乘除。

def AllofArr(test):
    for i in range(len(test)):
        if type(test[i])==list:
            return AllofArr(test[i])
        print(test[i],end="")#這裡我只能把項都丟出來 實際上我想要讓他們運算

後來我想到物件導向與類別之類的觀念,試圖建立一個class


class Book:
    def __init__(self,one,two,three,long):
        self.one=one
        self.two=two
        self.three=three
        self.long=long
    
    #我想讓某陣列裡面的所有值存起來,目前先操作三項而已
def SaveValue(A):
    if len(A)==3:
        s=Book(A[0],A[1],A[2],3)
    
    if len(A)==2:
        s=Book(A[0],A[1],'null',2)
    
    if len(A)==1:
        s=Book(A[0],'null','null',1)
    return s


#這個是想要call出某一項的值的函式
def One(A):
    q=SaveValue(A).one
    return q

def Two(A):
    q=SaveValue(A).two
    return q
 
def SaveValue(A):
    q=SaveValue(A).three
    return q

目前寫到這邊,整體好像已經到一個極限了,不知道該如何操作下去。
我希望能依照我的最初思路去解,
似乎還差遞迴或是一個漂亮的迴圈,因為我知道我這種想法勢必會面對以下的code:

One(One(Three(One(x))))

One(One(One(x)))
Two(Two(One(x)))
One(Three(One(x)))

這種東西……

對於這題,我有看到有人提出DFS與BFS的演算法,我想知道跟我的作法是否有類似?
稍微去看了教學影片,感覺是很棒的東西,
但在自己的code中不太知道如何運用。

想問如果要用我這種處理陣列的方式解題,該怎麼把它寫完?

淺水員 iT邦大師 6 級 ‧ 2022-06-07 19:45:42 檢舉
參考關鍵字:中序轉後序 四則運算
石頭 iT邦高手 1 級 ‧ 2022-06-07 20:04:42 檢舉
如 淺水員大所述 可以用逆波蘭表示法 (後序) 較方便程式計算
https://openhome.cc/zh-tw/algorithm/computation/postfix/
froce iT邦大師 1 級 ‧ 2022-06-07 21:53:04 檢舉
https://docs.python.org/zh-tw/3/library/operator.html
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
rofellos
iT邦新手 2 級 ‧ 2022-06-08 14:28:29
最佳解答
x="2*9*3+5*8/2+60*10/5/1"


def tolist(str):
    list01=str.split('+')
    print(list01)
    list02=[]
    for v01 in list01:
        if v01.find('*')>0:
            list02.append(v01.split('*'))
        else:
            list02.append(v01)
    print(list02)
    list03 = []
    for v02 in list02:
        list04=[]
        for v01 in v02:
            if v01.find('/') > 0:
                list04.append(v01.split('/'))
            else:
                list04.append(v01)
        list03.append(list04)
    return list03

a=tolist(x)
#a=[['2', '9', '3'], ['5', ['8', '2']], ['60', ['10', '5', '1']]]
print(a)


class Book2:
    tag_str=["add","multiply","divide","null"]
    def __init__(self, t_list,t_tag="add"):
        self.m_list=t_list
        self.tag=t_tag
    def getNum(self,num):
        if num >= self.len:
            print("error01")
            return null
        return Book2(self.m_list[num])
    def len(self):
        return len(self.m_list)
    def value(self):
        if self.tag == "add":
            return self._add()
        if self.tag == "multiply":
            return self._multiply()
        if self.tag == "null":
            return 0
        return 0
    def _add(self):
        t_value=0
        for num in self.m_list :
            #print("add")
            #print(num)
            if isinstance(num, list):
                t_value = t_value + Book2(num,self.getNextTag()).value()
            else:
                t_value = t_value + int(num)
        return t_value
    def _multiply(self):
        t_value=1
        for num in self.m_list :
            #print("multiply")
            #print(num)
            if isinstance(num, list):
                t_value = t_value* Book2(num,self.getNextTag()).value()
            else:
                t_value = t_value* int(num)
        return t_value
    def getNextTag(self):
        if not(self.tag in  self.tag_str):
            print("error")
            print(self.tag)
            return self.tag_str(len(self.tag_str)-1)
        if self.tag == "null" :
            print("error")
            return self.tag
        v=self.tag_str.index(self.tag)
        return self.tag_str[v+1]



print(Book2(a).value())

你的分割跟我的不太一樣
運算只做了加 乘

謝謝大師指導

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-06-07 19:58:43

我是覺得用不到 物件導向/DFS/BFS 啦

x="2*9*3+5*8/2+60*10/5/1"
#經過我的split之後會變成以下:
x=[[['2'], ['9'], '3'], [['5'], ['8', '2']], [['60'], ['10', '5', '1']]]
#我是先分割加減,然後才是乘法,最後是除法

只要在你的 split (eg.產生陣列)時,加上一個「運算子」即可
類似像這樣
x=[[['2'], ['9'], '3', '*'], [['5'], ['8', '2', '/'], '*'], [['60'], ['10', '5', '1', '/'], '*'], '+']

謝謝大師指導

2
wiseguy
iT邦超人 1 級 ‧ 2022-06-08 09:22:49

你的算式 sample 都還沒用到小括號呢,就已經寫到這麼複雜了 ....
這個若只是單純切割運算式,放到陣列裡,是沒辦法應付小括號的。要是再巢狀小括號,你就瘋掉了。
思維應該是:

  1. 要先 parse 字串,用堆疊來把算式拆解,逐個算式放入堆疊中
  2. 若有正確放入堆疊,那麼最上面的就是要最先運算的,再一個一個取出來運算
  3. 堆疊取完算完,你的算式也算好了

或者使用遞迴(也有堆疊的概念),不過還是得先 parse 算式,正確的拆解算式中的運算優先權,才是正解。

謝謝大師指導

我要發表回答

立即登入回答