日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

面向对象第一次总结

發(fā)布時(shí)間:2025/6/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象第一次总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

這三次作業(yè)都是關(guān)于多項(xiàng)式求導(dǎo)的問(wèn)題,不過(guò)難度逐步遞進(jìn),而且在第三次作業(yè)里面加入了嵌套。在前兩次作業(yè)中,多項(xiàng)式中的每一項(xiàng)因子確定,所以完成這部分代碼是不太難的,主要是在優(yōu)化輸出多項(xiàng)式長(zhǎng)度上面下功夫;而第三次作業(yè)由于存在嵌套,原來(lái)的結(jié)構(gòu)不太好擴(kuò)展,而且讀入、解析上也有很大的改變,所以第三次作業(yè)單獨(dú)拿出來(lái)說(shuō)。

第一、二次作業(yè)

代碼度量

第一次作業(yè)事實(shí)上只寫了一個(gè)類,如下圖所示:

多項(xiàng)式的格式檢查、解析、求導(dǎo)都在一個(gè)類中實(shí)現(xiàn),總共代碼200多行,下面是各個(gè)方法的復(fù)雜度分析:

其中多項(xiàng)式求導(dǎo)復(fù)雜度有點(diǎn)高,主要是在優(yōu)化上的處理有一些分支,其實(shí)可以再分一個(gè)對(duì)項(xiàng)求導(dǎo)的函數(shù)出來(lái),可以把函數(shù)的結(jié)構(gòu)變得再簡(jiǎn)單一點(diǎn)。在第二次作業(yè)中,我把多項(xiàng)式的求導(dǎo)函數(shù)剝離出來(lái),單獨(dú)做了一個(gè)多項(xiàng)式計(jì)算的類,這樣原來(lái)多項(xiàng)式的類只需要關(guān)注多項(xiàng)式解析和存儲(chǔ),計(jì)算交給其他類來(lái)處理。第二次作業(yè)加入了三角函數(shù),代碼在400行左右,依賴關(guān)系如下:

?其中Poly是多項(xiàng)式類,用于解析、存儲(chǔ)多項(xiàng)式,ComputePoly用于多項(xiàng)式求導(dǎo)。各方法的復(fù)雜度如下所示:

由于多項(xiàng)式中加入了三角函數(shù),以及求導(dǎo)法則的緣故,函數(shù)增加了很多,但是基本思路和第一次作業(yè)一致。

思路分析

前兩次作業(yè)由于多項(xiàng)式每一項(xiàng)的元素固定,每一項(xiàng)的形式比較簡(jiǎn)單,只需要幾個(gè)指數(shù)和一個(gè)系數(shù)就可以表示,所以采用正則表達(dá)式讀入、解析,HashMap存儲(chǔ)多項(xiàng)式,方便合并同類項(xiàng)。

多項(xiàng)式解析

在前兩次作業(yè)中,我采用正則表達(dá)式來(lái)解析輸入,由于一次性判斷整個(gè)多項(xiàng)式是否合法存在爆棧的風(fēng)險(xiǎn),所以我才用單次匹配一項(xiàng),循環(huán)匹配直到不能匹配到新的項(xiàng)為止。

在匹配之前,我先檢查空白字符是否符合要求,然后刪去所有空白字符。這樣在接下來(lái)每一項(xiàng)的匹配中就不需要考慮空白字符的位置,簡(jiǎn)化正則。除了第一項(xiàng),每一項(xiàng)前面至少一個(gè)正負(fù)號(hào),所以我在處理輸入串的時(shí)候,判斷了一下第一個(gè)非空白字符是否為正負(fù)號(hào),如果沒(méi)有就添加一個(gè)正號(hào),使得每一項(xiàng)都有統(tǒng)一的格式,接下來(lái)只需要逐項(xiàng)匹配即可。同時(shí)匹配上一項(xiàng)就刪去該項(xiàng),如果該輸入串符合要求,匹配結(jié)束后,字符串應(yīng)該為空串。

在項(xiàng)的解析中,首先解析每一個(gè)因子,比如冪函數(shù)、三角函數(shù)等,最后再解析有符號(hào)整數(shù)。先匹配有符號(hào)整數(shù)有可能導(dǎo)致指數(shù)部分先匹配上,發(fā)生解析錯(cuò)誤,然后根據(jù)各因子的指數(shù),存到HashMap的相應(yīng)位置。

多項(xiàng)式求導(dǎo)

在多項(xiàng)式求導(dǎo)中,我是對(duì)各個(gè)因子進(jìn)行求導(dǎo),然后將結(jié)果加入到新的HashMap中,最后將HashMap轉(zhuǎn)成字符串輸出即可。在優(yōu)化部分,除了對(duì)于系數(shù)、指數(shù)的特殊處理,還有正負(fù)項(xiàng)位置的問(wèn)題,如果正項(xiàng)為首項(xiàng),那么可以去掉一個(gè)正號(hào)。

思路總結(jié)

總的來(lái)說(shuō),代碼可以分為三個(gè)部分,解析、求導(dǎo)和優(yōu)化。在解析部分,正則的作用可以說(shuō)是非常的大,求導(dǎo)和優(yōu)化就因人而異了,這里使用的HashMap很方便去查找項(xiàng),包括但不限于合并同類項(xiàng)以及三角函數(shù)合并。

bug分析

我在這部分出現(xiàn)的bug主要包括,省略形式的正負(fù)號(hào)個(gè)數(shù)、輸入串是否為空等。空串的判斷可以用Scanner類的hasNextLine來(lái)判斷,省略形式的正負(fù)號(hào)需要對(duì)題目有較好的理解。對(duì)于大數(shù)的處理可以直接用BigInteger類。在第二次優(yōu)化部分,由于不能在循環(huán)中增刪HashMap,所以需要分別構(gòu)造增刪隊(duì)列,在遍歷結(jié)束后用于增刪。

第三次作業(yè)

代碼度量

第三次作業(yè)由于加入了嵌套,java的正則好像不能很好支持,而且項(xiàng)的形式也較為復(fù)雜,于是只能像上學(xué)期一樣吭哧吭哧寫了個(gè)“編譯器前端”,用于解析輸入串,然后使用樹(shù)狀結(jié)構(gòu)去存儲(chǔ)整個(gè)表達(dá)式,最后調(diào)用求導(dǎo)即可,具體依賴關(guān)系如下:

我在三角函數(shù)加入了Factor自變量的位置,用于嵌套,然后對(duì)于該三角函數(shù)的求導(dǎo)可以套用求導(dǎo)法則得出。整個(gè)代碼700行左右,找bug可以說(shuō)是有點(diǎn)酸爽了。

這里面由于優(yōu)化等因素,導(dǎo)致復(fù)雜度函數(shù)的復(fù)雜度較大。

思路分析

多項(xiàng)式解析

這部分,經(jīng)過(guò)一晚上的奮斗,我發(fā)現(xiàn)我還是要放棄正則,改用編譯器寫法,將表達(dá)式分為expression-term-factor三層,其中(expression)也可以為factor,然后逐層解析,邊驗(yàn)證合法性邊構(gòu)造樹(shù)狀圖。在返回最后一層expression時(shí),應(yīng)該沒(méi)有待解析的字符串了。

在解析之前,首先檢查空白字符的合法性,然后去掉所有的空白字符。在解析的過(guò)程中,對(duì)可能出現(xiàn)的情況創(chuàng)建if分支,對(duì)不滿足所有if的分支,進(jìn)行錯(cuò)誤處理,然后遞歸調(diào)用。在三角函數(shù)內(nèi)部,由于存在嵌套,所以用factor來(lái)作為自變量,先解析嵌套因子,然后創(chuàng)建對(duì)應(yīng)的子類繼續(xù)解析。

在解析完成后,進(jìn)行求導(dǎo),并將結(jié)果存儲(chǔ)下來(lái)。因?yàn)樵趖erm中使用ArrayList存儲(chǔ),在求導(dǎo)的過(guò)程中存在對(duì)一項(xiàng)多次求獲取字符串和求導(dǎo),這樣可以降低一部分的復(fù)雜度,同時(shí)在debug過(guò)程中也可以查看各項(xiàng)的求導(dǎo)結(jié)果。

?多項(xiàng)式求導(dǎo)

多項(xiàng)式求導(dǎo)倒是比較形式化,主要是利用求導(dǎo)規(guī)則即可,但是如果要優(yōu)化的話,那么需要?jiǎng)?chuàng)建很多分支去特殊處理。除此之外,對(duì)項(xiàng)的求導(dǎo),往往會(huì)有多個(gè)項(xiàng),那么需要對(duì)這多個(gè)項(xiàng)加括號(hào),保證計(jì)算正確,但是對(duì)長(zhǎng)度的優(yōu)化稍有不便。

bug分析

在第三次作業(yè)中,主要出現(xiàn)的bug主要出現(xiàn)在解析多項(xiàng)式和對(duì)多項(xiàng)式求導(dǎo)中。在解析多項(xiàng)式,由于使用“編譯器”的模式,所以需要對(duì)各種可能存在的情況進(jìn)行判斷,稍有考慮不慎,就會(huì)有越界的可能性,或者誤報(bào)錯(cuò)誤。在對(duì)多項(xiàng)式的求導(dǎo)中,由于三角函數(shù)中存在指數(shù),對(duì)于各個(gè)指數(shù)的優(yōu)化,很容易寫錯(cuò)求導(dǎo)公式。除此之外,對(duì)term進(jìn)行求導(dǎo)時(shí),有可能會(huì)出現(xiàn)多個(gè)項(xiàng)相加的情況,那么需要加個(gè)括號(hào)來(lái)保證整體性,不然可能在嵌套結(jié)構(gòu)中出錯(cuò),比如對(duì)于“sin((sin(x)*sin(x)))”的求導(dǎo)。而且對(duì)于term類而言,并不需要繼承factor類,雖然并沒(méi)有在代碼中使用,但還算是一個(gè)小瑕疵。

具體重構(gòu)

如果需要重構(gòu)的話,那么我會(huì)針對(duì)優(yōu)化進(jìn)行重構(gòu),重寫equals函數(shù)使得各個(gè)term表達(dá)式可以互相合并。但是對(duì)于三角函數(shù)合并還是沒(méi)有太好的想法,在我的思路中,需要對(duì)每個(gè)項(xiàng)進(jìn)行遍歷,尋找可以合并的項(xiàng),但是目前使用ArrayList存儲(chǔ),如果強(qiáng)行合并,那么復(fù)雜度可能會(huì)比較大,可能還是需要使用hashCode函數(shù)。

作業(yè)感想

這三次作業(yè)的難度是逐漸上升的,前兩次作業(yè)聯(lián)系較為緊密,而且思路也比較直,基本上網(wǎng)上查查資料,寫寫就完了。第三次作業(yè)由于嵌套的問(wèn)題,必須使用新的代碼結(jié)構(gòu),所以花的時(shí)間會(huì)比較長(zhǎng)。其實(shí)如果老師在第一周就和我們說(shuō)最終的目標(biāo)的話,那在前兩次作業(yè)中,我們就會(huì)進(jìn)行相關(guān)的設(shè)計(jì),那么第二次和第三次的代碼結(jié)構(gòu)也許用的一樣,會(huì)讓我們有更多的時(shí)間去考慮優(yōu)化的問(wèn)題。

這三次作業(yè)下來(lái),基本上熟悉Java的常用容器和一些常規(guī)操作,并且對(duì)類和繼承有了初步的認(rèn)識(shí)。接下來(lái)要對(duì)多線程進(jìn)行學(xué)習(xí),免得后面手忙腳亂。

轉(zhuǎn)載于:https://www.cnblogs.com/Tywin/p/10597203.html

總結(jié)

以上是生活随笔為你收集整理的面向对象第一次总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。