




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
西北農(nóng)林科技大學(xué)信息工程學(xué)院面向?qū)ο蟪绦蛟O(shè)計(jì)PAGE西北農(nóng)林科技大學(xué)信息工程學(xué)院面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)習(xí)報(bào)告題目:簡易計(jì)算器的設(shè)計(jì)與實(shí)現(xiàn)學(xué)號2011013304姓名趙燕專業(yè)班級信管112班指導(dǎo)教師張志毅實(shí)踐日期2014-1-16目錄一、綜合訓(xùn)練目的與要求 2二、綜合訓(xùn)練任務(wù) 3(一)綜合任務(wù) 3(二)個(gè)人任務(wù): 3三、總體設(shè)計(jì) 3(一)功能模塊圖 3(二)功能實(shí)現(xiàn) 3四、詳細(xì)設(shè)計(jì)說明 5(一)主窗口控制類 5(二)實(shí)現(xiàn)說明: 6五、調(diào)試與測試 9(一)使用說明書 9(二)調(diào)試結(jié)果 9六、實(shí)習(xí)日志 11七、實(shí)習(xí)總結(jié) 14八、附錄:核心代碼清單 14stack類 14calculatorWindow類 15calculatorWindow.cpp 17ButtonPress.cpp 19Calculator.cpp 21
一、綜合訓(xùn)練目的與要求《面向?qū)ο蟪绦蛟O(shè)計(jì)》課程設(shè)計(jì)是實(shí)踐性教學(xué)環(huán)節(jié)之一,是《面向?qū)ο蟪绦蛟O(shè)計(jì)》課程的輔助教學(xué)課程。該課程設(shè)計(jì)要求學(xué)生綜合運(yùn)用在《面向?qū)ο蟪绦蛟O(shè)計(jì)》課程中學(xué)到的面向?qū)ο蠹夹g(shù)與實(shí)際編程相結(jié)合,獨(dú)立完成一項(xiàng)較為完整、并具有一定實(shí)際功能的課程設(shè)計(jì)任務(wù),同時(shí)加深學(xué)生對面向?qū)ο蠛虲++編程技術(shù)的理解和掌握,培養(yǎng)實(shí)際的應(yīng)用程序開發(fā)能力。在課程設(shè)計(jì)過程中,使學(xué)生養(yǎng)成良好的程序設(shè)計(jì)風(fēng)格,并掌握C++應(yīng)用程序的設(shè)計(jì)開發(fā)過程和編程方法、測試方法。培養(yǎng)學(xué)生使用MFC或者QT設(shè)計(jì)程序,使學(xué)生學(xué)會使用他們?nèi)ラ_發(fā)軟件。二、綜合訓(xùn)練任務(wù)(一)綜合任務(wù)設(shè)計(jì)一個(gè)計(jì)算器,要求如下:1、實(shí)現(xiàn)最大輸入十進(jìn)制數(shù)字的四則運(yùn)算(有正負(fù)數(shù)區(qū)分)。2、實(shí)現(xiàn)三角函數(shù)和反三角函數(shù)的計(jì)算、開方、次冪、求對數(shù)、取余等。3、設(shè)置輸入數(shù)值的最大長度,溢出報(bào)警。4、除法和乘法結(jié)果用科學(xué)計(jì)數(shù)法并保留到小數(shù)點(diǎn)后2位。(二)個(gè)人任務(wù):1、學(xué)習(xí)qt使用,學(xué)習(xí)qt中信號和槽機(jī)制。2、在qt中實(shí)現(xiàn)代碼與界面的連接。三、總體設(shè)計(jì)(一)功能模塊圖功能設(shè)計(jì)如圖1,分為來個(gè)部分進(jìn)制轉(zhuǎn)換和表達(dá)式計(jì)算。圖SEQ圖表\*ARABIC1計(jì)算器的功能(二)功能實(shí)現(xiàn)1、程序設(shè)計(jì)過程中分為兩個(gè)模塊,第一模塊為計(jì)算器界面的類CalculatorWindow,如圖2,包括各個(gè)按鈕的聲明以及函數(shù)運(yùn)算的實(shí)現(xiàn),包括了倆個(gè)棧,分別為運(yùn)算符棧和數(shù)字棧,以及各個(gè)實(shí)現(xiàn)函數(shù);第二個(gè)為stack類,如下圖3包括了各個(gè)判斷棧的情況的函數(shù)。具體的UML視圖如下所示:calculate():voidchangeHexadecimal(intnum):longintoperatorCompare(charstackOut,charstackIn):boolcalculate():voidchangeHexadecimal(intnum):longintoperatorCompare(charstackOut,charstackIn):boolpartCalculate(charoper):void;setStr():voidgetStr():stringnumButtonPress():voidoperateButtonPress():voidabortOperation():voidnumStack:stackoperatoerStack:stackstr:stringNumButton:QPushButtonOperateButton:QpushButtonOperateEdit;:QLineEdit圖2CalculatorWindow類CalculatorWindows[max_len]:char//棧的內(nèi)容保存在數(shù)組中top:int//棧頂clear():s[max_len]:char//棧的內(nèi)容保存在數(shù)組中top:int//棧頂clear():voidpush(charc):voidpop():charempty():boolfull():boolremove():voidStack圖3圖3stack類2、此程序設(shè)計(jì)主要運(yùn)用了棧,利用棧后進(jìn)先出的原理,建立兩個(gè)棧,數(shù)字棧和運(yùn)算符棧,先將數(shù)據(jù)和運(yùn)算符分別壓入這兩個(gè)棧,判斷棧內(nèi)和棧外運(yùn)算符的優(yōu)先級,依據(jù)運(yùn)算符的優(yōu)先級判斷是應(yīng)再次壓入運(yùn)算符,還是將數(shù)據(jù)和運(yùn)算符彈出棧,在棧外進(jìn)行運(yùn)算,再將所得的結(jié)果壓入棧,繼續(xù)進(jìn)行與計(jì)算,直至運(yùn)算結(jié)束。3、建立工程文件視圖如圖4:圖4文件工程視圖四、詳細(xì)設(shè)計(jì)說明(一)主窗口控制類1、界面總共有26個(gè)按鈕,包括10個(gè)數(shù)字鍵按鈕、一個(gè)小數(shù)點(diǎn)按鈕、一個(gè)等號按鈕、12個(gè)運(yùn)算符按鈕、一個(gè)清除按鈕、一個(gè)退格鍵、以及倆個(gè)括號按鍵,按照簡潔化布局風(fēng)格,第一個(gè)元素為operateEdit文本框,后面采用四個(gè)面板設(shè)計(jì)firstLayout、secondLayout、thirdLayout、fourthtLayout,具體界面設(shè)計(jì)如下圖5所示:圖5計(jì)算器界面2、各個(gè)按鈕、按鈕功能以及所使用函數(shù)說明,如表1。表1按鈕功能表按鈕按鈕的槽函數(shù)功能zeroButtonzeroButtonPress()按鈕0oneButtononeButtonPress()按鈕1twoButtontwoButtonPress()按鈕2threeButtonthreeButtonPress()按鈕3fourButtonfourButtonPress()按鈕4fiveButtonfiveButtonPress()按鈕5sixButtonsixButtonPress()按鈕6sevenButtonsevenButtonPress()按鈕7eightButtoneightButtonPress()按鈕8nineButtonnineButtonPress()按鈕9decimalButtondecimalButtonPress()小數(shù)點(diǎn)clearButtonclearButtonPress()清空按鈕backspaceButtonbackspaceButtonPress()回退鍵addButtonaddButtonPress()加號鍵subButtonsubButtonPress()減號鍵divButtondivButtonPress()除號鍵mulButtonmulButtonPress()乘號鍵sinButtonsinButtonPress()Sin函數(shù)的計(jì)算cosButtoncosButtonPress()Cos函數(shù)的計(jì)算tanButtontanButtonPress()Tan函數(shù)的計(jì)算sqrtButtonsqrtButtonPress()開方powButtonpowButtonPress()平方equButtonequButtonPress()等號鍵binaryButtonbinaryButtonPress()從十進(jìn)制到二進(jìn)制的轉(zhuǎn)換octButtonoctButtonPress()從十進(jìn)制到八進(jìn)制的轉(zhuǎn)換hexButtonhexButtonPress()從十進(jìn)制到十六進(jìn)制的轉(zhuǎn)換rightPerButtonrightPerButtonPress()右括號leftPerButtonleftPerButtonPress()左括號(二)實(shí)現(xiàn)說明:1、除進(jìn)制轉(zhuǎn)換按鈕、清除鍵、退格鍵和等號按鈕外,其他按鍵都只是簡單的輸入文本信息,具體函數(shù)如下:數(shù)字鍵按鍵響應(yīng)事件函數(shù):操作符按鍵響應(yīng)事件:2、進(jìn)制轉(zhuǎn)換函按鈕調(diào)用了進(jìn)制轉(zhuǎn)換函數(shù),由于八進(jìn)制和二進(jìn)制沒有特殊字符,轉(zhuǎn)換函數(shù)一樣,具體的函數(shù)算法如下:十進(jìn)制到十六進(jìn)制的轉(zhuǎn)換由于牽涉到字母,故比較麻煩,具體實(shí)現(xiàn)如下圖6:圖6十進(jìn)制到十六進(jìn)制轉(zhuǎn)換流程圖3、等號的實(shí)現(xiàn)是程序中最精華的部分,采用了棧的思想,主要運(yùn)用了棧,利用棧后進(jìn)先出的原理,建立兩個(gè)棧,數(shù)字棧和運(yùn)算符棧,先將數(shù)據(jù)和運(yùn)算符分別壓入這兩個(gè)棧,判斷棧內(nèi)和棧外運(yùn)算符的優(yōu)先級,依據(jù)運(yùn)算符的優(yōu)先級判斷是應(yīng)再次壓入運(yùn)算符,還是將數(shù)據(jù)和運(yùn)算符彈出棧,在棧外進(jìn)行運(yùn)算,再將所得的結(jié)果壓入棧,繼續(xù)進(jìn)行與計(jì)算,直至按等號運(yùn)算結(jié)束。流程圖7如下:圖7計(jì)算表達(dá)式值得流程圖在此過程中涉及到優(yōu)先級的排序問題:(1)每個(gè)用函數(shù)或倒數(shù)的都是字表達(dá)式內(nèi)層向外層的方向輸出(括號的優(yōu)先級最大)(2)三角函數(shù)的站內(nèi)優(yōu)先級和棧外優(yōu)先級問題:(3)采用的優(yōu)先級時(shí)棧外比棧內(nèi)的大,3個(gè)三角函數(shù)運(yùn)算符的棧內(nèi)優(yōu)先級相同、棧外優(yōu)先級也相同;三角函數(shù)的優(yōu)先級比加減法大,比乘除法大,比括號小;三角函數(shù)與倒數(shù);三角函數(shù)的棧外優(yōu)先級要低于倒數(shù)的棧內(nèi)優(yōu)先級;三角函數(shù)的棧內(nèi)優(yōu)先級要高于倒數(shù)的棧外優(yōu)先級(4)倒數(shù)的優(yōu)先級倒數(shù)的棧外優(yōu)先級要低于棧內(nèi)優(yōu)先級(5)開二次方,棧外優(yōu)先級低于棧內(nèi)優(yōu)先級,開方函數(shù)的棧內(nèi)優(yōu)先級高于加、減、乘、除、以及其他函數(shù)的棧外優(yōu)先級,棧外優(yōu)先級高于加、減、乘、除棧內(nèi)優(yōu)先級,棧外優(yōu)先級低于其他幾種函數(shù)的棧內(nèi)優(yōu)先級綜合考慮得出的優(yōu)先級排序如下表2:表2優(yōu)先級排序算符站內(nèi)優(yōu)先級棧外優(yōu)先級*/43+-21(07)70Sin(S)Cos(C)Tan(T)Cot(O)1/x(X)Sqrt(Q)Pow(W)65#-1-14、按鍵響應(yīng)事件的流程圖8如下,只有在opreate為1、opreated為0時(shí)才可以鍵入運(yùn)算符,以達(dá)到運(yùn)算符不能連續(xù)輸入,輸入數(shù)字時(shí),先opreate置為0,輸入完后置opreated=1等待運(yùn)算符的輸入。圖8按鍵響應(yīng)流程圖五、調(diào)試與測試(一)使用說明書(1)此計(jì)算器采用先輸入表達(dá)式,再計(jì)算結(jié)果的方式。(2)進(jìn)行三角函數(shù)的計(jì)算和開方、平方的計(jì)算時(shí),先輸入數(shù)字,再輸入三角函數(shù)運(yùn)算符和開方、平方運(yùn)算符,注意為了變成方便編程,sin使用S代替,cos使用C代替,tan使用T代替,sqrt使用Q代替,pow使用W代替。如sin1+cos2+tan3顯示為1S+2C+3T。(3)其他使用和其他計(jì)算器的使用類似。(4)如果結(jié)果出現(xiàn)“####”,則表達(dá)式有問題,請注意輸入?。ǘ┱{(diào)試結(jié)果2*(3+4)的運(yùn)算:輸入2*(3+4)顯示如下圖9圖9按下等號顯示結(jié)果如下圖10所示:圖1012的二進(jìn)制計(jì)算:輸入12顯示如圖11所示圖11按下二進(jìn)制運(yùn)算符,顯示結(jié)果如圖12所示:圖12六、實(shí)習(xí)日志2014-1-6今天的任務(wù)主要是寫實(shí)習(xí)計(jì)劃書以及確定項(xiàng)目要實(shí)現(xiàn)那些功能,并且借鑒一下前面的師兄師姐們的作品,查了查相關(guān)的資料,下載相關(guān)軟件,并且簡單學(xué)習(xí)他們的使用方法。我們的項(xiàng)目決定要用qt來做界面,千辛萬苦找到了下載地址,下載qt軟件,安裝后不能使用,后來查閱相關(guān)資料后知道需要提前minGW,在多次校正后,軟件終于可以使用了。下面是下載相關(guān)軟件的地址:minGW的下載地址/projects/mingw/postdownload?source=dlpQT的下載地址/downloads在下午的時(shí)候,找了相關(guān)的項(xiàng)目來參考參考了一下,確定計(jì)算器要實(shí)現(xiàn)的功能以及要分成哪些模塊。這些是一些參考項(xiàng)目。實(shí)踐論文/p-664645791.html論文:/firecityplans/article/details/78319732014-1-7我們對計(jì)算器的功能模塊進(jìn)行的劃分,完成了模塊設(shè)計(jì)圖。為了編程實(shí)踐的方便,我們又完成了流程圖。由于電腦上的Qt一直沒能安裝成功,所以,我就主要考慮編程的過程,嘗試先用Code:Blocks實(shí)現(xiàn)計(jì)算器的功能。在這個(gè)過程中,我發(fā)現(xiàn)對用棧實(shí)現(xiàn)表達(dá)式求解的過程需要的數(shù)據(jù)結(jié)構(gòu)知識已經(jīng)忘了很多,不過經(jīng)過查資料和分析自己明白了過程,明天就是將程序繼續(xù)編完。我還看了關(guān)于Qt的使用,發(fā)現(xiàn)里面的類和方法都很陌生而且用法感覺有點(diǎn)兒奇怪,應(yīng)該是還不了解的原因。覺得目前先完成一件事,就是先完成控制臺程序,然后再用Qt完成界面設(shè)計(jì)今天主要是根據(jù)所確定的功能的確定我們的項(xiàng)目都需要包含哪些函數(shù),以及采用哪種方式去實(shí)現(xiàn),我們決定用棧來實(shí)現(xiàn),并且做了流程圖。初步設(shè)計(jì)了界面。對QT的使用還不是很好,正在初步的學(xué)習(xí)中,他和其他的界面設(shè)計(jì)軟件不同,搞得我滿頭霧水。不過我覺得摸索這些軟件的是使用是一件很開心的事。遇到的問題:1、使用qt界面設(shè)計(jì)和文件中源代碼并不一致,怎么進(jìn)行事件交互?使用了信號和槽機(jī)制,但如何實(shí)現(xiàn)呢?是什么原理?2、使用qt進(jìn)行設(shè)計(jì)界面時(shí),如何能夠有條理的管理已有控件?qrc文件又是什么東西?有什么作用?Qt中的qrc文件是一個(gè)xml格式的資源配置文件,與應(yīng)用程序關(guān)聯(lián)的應(yīng)用程序由.qrc文件來指定,它用XML記錄硬盤上的文件和對應(yīng)的隨意指定的資源名稱,應(yīng)用程序通過資源名稱來訪問資源。2014-1-今天的主要任務(wù)是學(xué)習(xí)qt的使用方法,還是沒怎么搞明白界面和代碼的聯(lián)系,感覺他和我之前學(xué)習(xí)的java設(shè)計(jì)界面、C#中的WPF大不一樣,很難駕馭??赡苁俏疫€沒有學(xué)習(xí)到他的精華所在吧。感覺那個(gè)樣式表不是很好用,在設(shè)計(jì)中可以佷容易實(shí)現(xiàn),但是要寫代碼實(shí)現(xiàn),又不是很好做。繼續(xù)學(xué)習(xí)中!2014-1-9今天的主要任務(wù)是實(shí)現(xiàn)簡單的一些功能,實(shí)現(xiàn)算法與界面的互聯(lián),在一天的努力下,終于明白了信號和槽機(jī)制的使用,實(shí)現(xiàn)了簡單的加減乘除。在界面的設(shè)計(jì)過程中,捉摸了老半天,才知道怎么做出絢麗的界面,樣式表的使用以及樣式表的語法,很多都還不會再進(jìn)一步的琢磨中。感覺我們的進(jìn)度還是太慢,一周的實(shí)習(xí)也即將快要結(jié)束了,但我們的還沒有實(shí)現(xiàn),繼續(xù)奮斗中!2014-1-10今天懷著忐忑的心來編程序,結(jié)果當(dāng)開始編的時(shí)候感覺c++已經(jīng)忘了很多。只能是一邊復(fù)習(xí),一邊編寫。下午老師介紹了mfc和Qt的相關(guān)知識,我覺得其實(shí)這些東西真的需要自己去試著用才能掌握,不是一朝一夕的事,當(dāng)然學(xué)習(xí)這些需要好的習(xí)慣,希望通過這次實(shí)習(xí),我能克服自己不想研究陌生東西這個(gè)心理障礙。實(shí)習(xí)即將結(jié)束,我感覺今天的收獲不是很多,效率有點(diǎn)兒低,時(shí)間越來越緊張了,我們的任務(wù)還是很重,我們必須加把勁了!2014-1-13今天還是在進(jìn)一步編寫代碼中,感覺好多東西都忘的差不多了,只能邊學(xué)習(xí)邊編寫,早上實(shí)現(xiàn)了進(jìn)制轉(zhuǎn)換函數(shù),有點(diǎn)小小的成就感。感覺qt還是不好用,在編寫代碼的時(shí)候,有時(shí)候函數(shù)明明出錯了,可程序還是可以運(yùn)行,也搞不懂是什么原因,后來只能新建工程,再拷貝了。還有感覺我們的代碼容錯性太差了,我們只是考慮了正常情況的運(yùn)行,還要努力考慮到各種異常情況,加強(qiáng)程序的健壯性。下午還是在進(jìn)一步的編寫代碼,感覺時(shí)間有點(diǎn)緊張,而且加上考試,所以有點(diǎn)忐忑不安,好多功能還沒有實(shí)現(xiàn)。對實(shí)習(xí)的時(shí)間安排極度不滿,C++都學(xué)習(xí)一年了,忘的也差不多了,再加上考試,總覺得自己很難靜下心來,好好編寫。強(qiáng)烈建議學(xué)習(xí)能夠改變一下實(shí)習(xí)時(shí)間,放在這個(gè)點(diǎn)上,實(shí)習(xí)做不好,考試考不好!為了后來的學(xué)弟學(xué)妹們,我要強(qiáng)烈說出我的不滿!2014-1-14先說說我們的進(jìn)度吧,我的隊(duì)友在codeblocks中已經(jīng)可以實(shí)現(xiàn)計(jì)算器的一些基本功能,由我來實(shí)現(xiàn)qt界面與代碼的結(jié)合,現(xiàn)在計(jì)算器基本可以運(yùn)行了,正常情況下基本可以計(jì)算了,就是三角函數(shù)以及開方、平方計(jì)算還沒有實(shí)現(xiàn),不過這個(gè)應(yīng)該很容易實(shí)現(xiàn),因?yàn)榛究蚣芤呀?jīng)搭建好了,今天還是再進(jìn)一步調(diào)編寫代碼中,預(yù)計(jì)今天可以實(shí)現(xiàn)代碼,后面就是再進(jìn)一步的完善。接下來還有一個(gè)問題需要去解決,那就是如何在qt中保存exe文件,查了一下相關(guān)資料,好像不是那么容易實(shí)現(xiàn),現(xiàn)在先把代碼完善了再說吧!2014-1-1就說實(shí)話吧,今天由于要考試,整個(gè)一天也沒怎么看。2014-時(shí)間過得真快,兩周的實(shí)習(xí)即將結(jié)束,我們的程序也做的差不多了,由于考試忙,還沒怎么完善,今天繼續(xù)完善以及寫報(bào)告、做PPT。感覺實(shí)習(xí)時(shí)間安排的相當(dāng)緊張,我們必須加把勁。今天繼續(xù)把代碼完善了,實(shí)現(xiàn)了十進(jìn)制到十六進(jìn)制的轉(zhuǎn)換、實(shí)現(xiàn)了對輸入的一些限制,如不能連續(xù)輸入多個(gè)運(yùn)算符、在進(jìn)行第二次輸入時(shí),自動更新而不用去按清除鍵、退格鍵只有在輸入時(shí)能夠退格,對輸出結(jié)果不響應(yīng)。但還有好多需要去完善,我們會努力的。七、實(shí)習(xí)總結(jié)當(dāng)時(shí)和隊(duì)友選題的時(shí)候本來打算做數(shù)獨(dú)游戲,后來班長說有人做了,我們只能放棄了,后來決定做計(jì)算器。其實(shí)在假期的時(shí)候做過一個(gè)小計(jì)算器,那時(shí)候是用C#語言寫的,函數(shù)實(shí)現(xiàn)只是用了簡單的加減乘除,沒有實(shí)現(xiàn)優(yōu)先級。由于要用C++做,體現(xiàn)面向?qū)ο蟮乃枷?,而現(xiàn)在已經(jīng)距離C++學(xué)習(xí)有一年多了,C++基本語法都差不多忘記了,剛開始做的時(shí)候感覺一團(tuán)亂,都不知道如何實(shí)現(xiàn),和隊(duì)友看完題目要求后,開始分析題目,我們決定采用棧的思想來實(shí)現(xiàn),采用qt來設(shè)計(jì)界面,確定好方向后,我們開始分工,隊(duì)友負(fù)責(zé)在codebooks來實(shí)現(xiàn),我負(fù)責(zé)在qt中來實(shí)現(xiàn)。記得當(dāng)時(shí)學(xué)習(xí)C++的時(shí)候只是學(xué)習(xí)了基本語法,只會編寫一些簡單的程序,老師講MFC也只是大概提了提,連最基本的用法都不會,更別說要做軟件了。Qt也是第一次接觸。安裝qt就花了不少時(shí)間,打開qt只會在界面中設(shè)計(jì),但并不懂得如何把代碼和界面關(guān)聯(lián)起來。后來通過簡單的學(xué)習(xí)才知道qt中的精華部分是使用信號和槽機(jī)制。在設(shè)計(jì)界面中,對樣式表的使用不是很明白,后來采用純代碼寫的,在兩個(gè)周的努力下,我們的程序終于可以運(yùn)行了。最后兩天對程序進(jìn)行了完善,對用戶輸入進(jìn)行了一些簡單的限制,保證了程序的健壯性!但還是存在很多問題,估計(jì)實(shí)習(xí)期間可能沒辦法全部解決,我們會利用以后的時(shí)間盡量去完善的。在此次實(shí)習(xí)中,我的收獲也不少,下面我具體說說我的收獲吧!1、在以前的C++實(shí)習(xí)中,只是會編寫一些簡單的程序,并不懂得面向?qū)ο蟮乃枷塍w現(xiàn)在哪里,通過此次實(shí)習(xí),使我對面向?qū)ο蟮母拍钣辛烁由羁痰睦斫?。類的封裝,使得程序更加清晰明了,簡單易讀。2、學(xué)習(xí)使用新的軟件設(shè)計(jì)軟件——qt,開始時(shí)覺得qt很難掌握,界面和代碼不容易結(jié)合在一起,雖說對他的學(xué)習(xí)并不是很深,只是會簡單的使用,但學(xué)習(xí)使用一個(gè)新的東西的感覺還是很不錯的。3、此次實(shí)習(xí)是我第一次和同學(xué)合作做程序,團(tuán)隊(duì)協(xié)作是一個(gè)很重要的能力,通過此次實(shí)習(xí),使我感受到了團(tuán)隊(duì)合作的快樂,以及讓我學(xué)會如何和別人分工合作。總之,這次的合作還不錯,分工明確,而又不脫離組織。是一次很值得記憶的實(shí)習(xí)。4、說實(shí)話,雖然編程語言學(xué)了那么久了,還是很怕編代碼,但通過此次實(shí)習(xí),我真正的體會到了編程的快樂,至少我不會再害怕編程,拿到一個(gè)大的工程,學(xué)會冷靜去分析。程序出錯也不會再像以前那樣,討厭調(diào)試,學(xué)會了冷靜分析代碼中的錯誤。雖然說程序已經(jīng)基本可以運(yùn)行了,但還是存在很多問題,下面我具體說說存在那些問題:1、有些設(shè)計(jì)并不是很合理,比如三角函數(shù)、開方和平方的計(jì)算,使用并不是很友好,但是考慮到整體性,舍棄了對這部分的完美!2、在操作中,對輸入表達(dá)式的順序并未做規(guī)定,也就是說怎么輸入都可以,但在表達(dá)式不正確時(shí),統(tǒng)一做異常處理,顯示“####”。對用戶輸入還要做很多的限制,這塊實(shí)現(xiàn)的并不是很好,有待完善??傊舜螌?shí)習(xí)是一個(gè)新的開始,而不是結(jié)束!最后,感謝隊(duì)友的幫助和配合,感謝老師的耐心指導(dǎo)!八、附錄:核心代碼清單stack類#ifndefSTACK_H#defineSTACK_Hconstintmax_len=20;//棧的最大容量classstack{private:chars[max_len];//棧的內(nèi)容保存在數(shù)組中inttop;//棧頂指示器,棧空時(shí)為-1floatn[max_len];public:stack();~stack();intgetTop();voidclear();voidpush(charc);voidpush(floatf);charpop(charc);floatpop(intf);boolempty();boolfull();charremove(charc);floatremove(intf);};calculatorWindow類#endif//STACK_H#ifndefJISUANQI_H#defineJISUANQI_H#endif//JISUANQI_H#ifndefCALCULATOR_H#defineCALCULATOR_H//對calculator.h頭文件的聲明#include<QWidget>//包含主窗體類#include<QPushButton>//包含按鍵類#include<QVBoxLayout>//包含垂直布局器類#include<QHBoxLayout>//包含水平布局器類#include<QLineEdit>//包含顯示框類#include"stack.h"usingnamespacestd;classcalculatorWindow:publicQWidget//計(jì)算器繼承自主窗體類{Q_OBJECT//必須加上這句,如果要調(diào)用信號,槽函數(shù)的操作的話public:calculatorWindow();//計(jì)算器類的構(gòu)造函數(shù)~calculatorWindow();//計(jì)算器類的析構(gòu)函數(shù)publicslots://定義各個(gè)按鍵按下后對應(yīng)操作處理的槽函數(shù)longintchangeHexadecimal(intnum,intpower);voidnumButtonPress(charnum);//按數(shù)字響應(yīng)事件voidzeroButtonPress();//調(diào)用numButtonPress()函數(shù)voidequButtonPress();voidcalculate();//普通計(jì)算voidhexChange(intnum);//進(jìn)制轉(zhuǎn)換函數(shù)booloperatorCompare(charstackOut,charstackIn);voidpartCalculate(charoper);voidabortOperation();//異常處理函數(shù)private:QLineEdit*operateEdit;//聲明顯示框QPushButton*zeroButton;//聲明數(shù)字按鍵1QPushButton*decimalButton;//小數(shù)點(diǎn)按鈕QPushButton*clearButton;QPushButton*backspaceButton;//聲明運(yùn)算符按鍵QPushButton*addButton;QPushButton*sinButton;QPushButton*cosButton;QPushButton*tanButton;QPushButton*sqrtButton;QPushButton*powButton;QPushButton*equButton;QPushButton*binaryButton;QPushButton*octButton;QPushButton*hexButton;QPushButton*rightPerButton;QPushButton*leftPerButton;//聲明水平布局器,該布局器主要對24個(gè)按鍵進(jìn)行布局QHBoxLayout*firstLayout;QHBoxLayout*secondLayout;QHBoxLayout*thirdLayout;QHBoxLayout*fourthLayout;QVBoxLayout*mainLayout;//聲明垂直布局器,該布局器主要對主窗體上面的空間進(jìn)行排布QStringinput;//計(jì)算器中要輸入的代數(shù)表達(dá)式stacknumStack;stackoperatorStack;stringstr;};#endif//CALCULATOR_HcalculatorWindow.cpp#include"calculatorWindow.h"#include"calculator.h"usingnamespacestd;calculatorWindow::calculatorWindow(){this->setWindowTitle(tr("Calculator"));//設(shè)置窗體標(biāo)題為Calculator//calc=newcalculators();//按鈕operateEdit=newQLineEdit(this);operateEdit->setReadOnly(true);operateEdit->setText(tr("0"));operateEdit->setAlignment(Qt::AlignRight);operateEdit->setMaxLength(30);//為文本框設(shè)置字體QFontfont=operateEdit->font();font.setPointSize(font.pointSize()+8);operateEdit->setFont(font);oneButton=newQPushButton;oneButton->setText(tr("1"));oneButton->setFixedHeight(50);oneButton->setFixedWidth(50);//其他按鈕的聲明是一樣的//面板firstLayout=newQHBoxLayout;firstLayout->addWidget(oneButton);firstLayout->addWidget(twoButton);firstLayout->addWidget(threeButton);firstLayout->addWidget(addButton);firstLayout->addWidget(sinButton);firstLayout->addWidget(clearButton);firstLayout->addWidget(backspaceButton);//其他面板的添加按鈕的過程類似//主窗口mainLayout=newQVBoxLayout(this);mainLayout->addWidget(operateEdit);mainLayout->addLayout(firstLayout);mainLayout->addLayout(secondLayout);mainLayout->addLayout(thirdLayout);mainLayout->addLayout(fourthLayout);//信號和槽connect(zeroButton,SIGNAL(clicked()),this,SLOT(zeroButtonPress()));connect(oneButton,SIGNAL(clicked()),this,SLOT(oneButtonPress()));connect(twoButton,SIGNAL(clicked()),this,SLOT(twoButtonPress()));connect(threeButton,SIGNAL(clicked()),this,SLOT(threeButtonPress()));connect(fourButton,SIGNAL(clicked()),this,SLOT(fourButtonPress()));connect(fiveButton,SIGNAL(clicked()),this,SLOT(fiveButtonPress()));connect(sixButton,SIGNAL(clicked()),this,SLOT(sixButtonPress()));connect(sevenButton,SIGNAL(clicked()),this,SLOT(sevenButtonPress()));connect(eightButton,SIGNAL(clicked()),this,SLOT(eightButtonPress()));connect(nineButton,SIGNAL(clicked()),this,SLOT(nineButtonPress()));connect(decimalButton,SIGNAL(clicked()),this,SLOT(decimalButtonPress()));connect(addButton,SIGNAL(clicked()),this,SLOT(addButtonPress()));connect(subButton,SIGNAL(clicked()),this,SLOT(subButtonPress()));connect(mulButton,SIGNAL(clicked()),this,SLOT(mulButtonPress()));connect(divButton,SIGNAL(clicked()),this,SLOT(divButtonPress()));connect(sinButton,SIGNAL(clicked()),this,SLOT(sinButtonPress()));connect(cosButton,SIGNAL(clicked()),this,SLOT(cosButtonPress()));connect(tanButton,SIGNAL(clicked()),this,SLOT(tanButtonPress()));connect(sqrtButton,SIGNAL(clicked()),this,SLOT(sqrtButtonPress()));connect(powButton,SIGNAL(clicked()),this,SLOT(powButtonPress()));connect(rightPerButton,SIGNAL(clicked()),this,SLOT(rightPerButtonPress()));connect(leftPerButton,SIGNAL(clicked()),this,SLOT(leftPerButtonPress()));connect(equButton,SIGNAL(clicked()),this,SLOT(equButtonPress()));connect(clearButton,SIGNAL(clicked()),this,SLOT(clearButtonPress()));connect(backspaceButton,SIGNAL(clicked()),this,SLOT(backspaceButtonPress()));connect(binaryButton,SIGNAL(clicked()),this,SLOT(binaryButtonPress()));connect(octButton,SIGNAL(clicked()),this,SLOT(octButtonPress()));connect(hexButton,SIGNAL(clicked()),this,SLOT(hexButtonPress()));input="0";//初始化運(yùn)算操作數(shù)2為0}//然后是析構(gòu)函數(shù)的實(shí)現(xiàn):calculatorWindow::~calculatorWindow()//析構(gòu)函數(shù)主要完成對構(gòu)造函數(shù)中所聲明的QLineEdit、QPushButton、QHBoxLayout、QVBoxLayout類的對象的回收工作(可以不定義析構(gòu)函數(shù),程序運(yùn)行結(jié)束時(shí)會自動調(diào)用系統(tǒng)默認(rèn)的析構(gòu)函數(shù)){if(operateEdit!=NULL)//{operateEdit=NULL;deleteoperateEdit;}if(zeroButton!=NULL){zeroButton=NULL;deletezeroButton;}}ButtonPress.cpp#include"calculatorWindow.h"http://數(shù)字鍵和最基本的運(yùn)算符建的實(shí)現(xiàn)voidcalculatorWindow::numButtonPress(charnum){if(opreate){//判斷是否開始第二次計(jì)算,如果opreate為真,單擊數(shù)字鍵就表示開始新的計(jì)算operateEdit->setText(0);opreate=0;//將文本置為零,將opreate置為0,一邊下一次輸入表達(dá)式}if(input=="0")//如果當(dāng)前顯示框?yàn)?{input=num;//變0為num}else{input=operateEdit->text();input.append(num);}operateEdit->setText(input);//更新顯示框中的顯示信息opreated=0;//輸入數(shù)字后將opreate改為1,等待運(yùn)算符輸入}//一元運(yùn)算符的響應(yīng)函數(shù)voidcalculatorWindow::danButtonPress(charop){if(input=="0")//如果當(dāng)前顯示框?yàn)?{input=op;//變0為num}else{input=operateEdit->text();input.append(op);}operateEdit->setText(input);//更新顯示框中的顯示信息}//二元運(yùn)算符響應(yīng)事件voidcalculatorWindow::opreateButtonPress(charop){//實(shí)現(xiàn)不能連續(xù)輸入運(yùn)算符//如果前面的字符為運(yùn)算符,則opreated=1,不能再次輸入運(yùn)算符。//只有opreated=0時(shí)才可以輸入運(yùn)算符if(!opreated){opreate=0;//只有opreate為假時(shí)才可以輸入運(yùn)算符if(!opreate){if(input=="0")//如果當(dāng)前顯示框?yàn)?{input=op;//變0為num}else{input=operateEdit->text();input.append(op);}operateEdit->setText(input);//更新顯示框中的顯示信息}opreated=1;}}//二元運(yùn)算符按鍵處理函數(shù)voidcalculatorWindow::opreateButtonPress(charop){//實(shí)現(xiàn)不能連續(xù)輸入運(yùn)算符//如果前面的字符為運(yùn)算符,則opreated=1,不能再次輸入運(yùn)算符。//只有opreated=0時(shí)才可以輸入運(yùn)算符if(!opreated){opreate=0;//只有opreate為假時(shí)才可以輸入運(yùn)算符if(!opreate){if(input=="0")//如果當(dāng)前顯示框?yàn)?{input=op;//變0為num}else{input=operateEdit->text();input.append(op);}operateEdit->setText(input);//更新顯示框中的顯示信息}opreated=1;}}//數(shù)字鍵的實(shí)現(xiàn)voidcalculatorWindow::oneButtonPress(){numButtonPress('1');}voidcalculatorWindow::twoButtonPress(){numButtonPress('2');}voidcalculatorWindow::threeButtonPress(){numButtonPress('3');}voidcalculatorWindow::fourButtonPress(){numButtonPress('4');}voidcalculatorWindow::fiveButtonPress(){numButtonPress('5');}voidcalculatorWindow::sixButtonPress(){numButtonPress('6');}voidcalculatorWindow::sevenButtonPress(){numButtonPress('7');}voidcalculatorWindow::eightButtonPress(){numButtonPress('8');}voidcalculatorWindow::nineButtonPress(){numButtonPress('9');}voidcalculatorWindow::zeroButtonPress(){numButtonPress('0');}//運(yùn)算符的按鍵響應(yīng)voidcalculatorWindow::addButtonPress(){opreateButtonPress('+');}voidcalculatorWindow::subButtonPress(){opreateButtonPress('-');}voidcalculatorWindow::mulButtonPress(){opreateButtonPress('*');}voidcalculatorWindow::divButtonPress(){opreateButtonPress('/');}//小數(shù)點(diǎn)按鍵處理voidcalculatorWindow::decimalButtonPress(){numButtonPress('.');}//三角函數(shù)的實(shí)現(xiàn),考慮到運(yùn)算的一致性,便于封裝函數(shù),故運(yùn)算規(guī)則只能是先輸入數(shù)字,后輸入運(yùn)算符//在這里三角函數(shù)只是計(jì)算了弧度制的voidcalculatorWindow::sinButtonPress(){opreateButtonPress('S');}voidcalculatorWindow::cosButtonPress(){opreateButtonPress('C');}voidcalculatorWindow::tanButtonPress(){opreateButtonPress('T');}//開方和平方的運(yùn)算響應(yīng)事件voidcalculatorWindow::sqrtButtonPress(){opreateButtonPress('Q');}voidcalculatorWindow::powButtonPress(){opreateButtonPress('W');}//括號按鍵響應(yīng)事件voidcalculatorWindow::rightPerButtonPress(){numButtonPress('(');}voidcalculatorWindow::leftPerButtonPress(){numButtonPress(')');}//二進(jìn)制的轉(zhuǎn)換voidcalculatorWindow::binaryButtonPress(){hexChange(2);opreate=1;}//八進(jìn)制的轉(zhuǎn)換voidcalculatorWindow::octButtonPress(){hexChange(8);opreate=1;}//十六進(jìn)制的轉(zhuǎn)換,由于牽扯到非數(shù)字字符,暫時(shí)并未實(shí)現(xiàn)voidcalculatorWindow::hexButtonPress(){if(opreate){//判斷是否開始第二次計(jì)算,如果opreate為真,單擊數(shù)字鍵就表示開始新的計(jì)算operateEdit->setText(0);opreate=0;//將文本置為零,將opreate置為0,一邊下一次輸入表達(dá)式}QStringa=operateEdit->text();inttemp=a.toInt();stringresult=decToHex(temp);operateEdit->setText(QString::fromStdString(result));opreate=1;}//功能鍵//等號按鍵的實(shí)現(xiàn)voidcalculatorWindow::equButtonPress(){opreateButtonPress('=');calculate();opreate=1;}//Clear鍵的實(shí)現(xiàn)voidcalculatorWindow::clearButtonPress(){input="0";//把運(yùn)算操作數(shù)2清零operateEdit->setText(input);//更新顯示框中的顯示內(nèi)容}//退格鍵的實(shí)現(xiàn)voidcalculatorWindow::backspaceButtonPress(){if(!opreate){input=operateEdit->text();input.chop(1);if(input.isEmpty()){input="0";}operateEdit->setText(input);}}Calculator.cpp#include<string>#include<stdio.h>#include<iostream>#include<ctype.h>#include<stdlib.h>//用atof()時(shí)需要用到該頭文件#include<math.h>#include"calculatorwindow.h"#include<sstream>usingnamespacestd;#defineMAX30//計(jì)算器輸入的數(shù)字最大的字符個(gè)數(shù)為30//異常處理函數(shù)voidcalculatorWindow::abortOperation(){input="0";operateEdit->setText(tr("####"));}//表達(dá)式計(jì)算voidcalculatorWindow::calculate(){operatorStack.push('#');QStringinput=operateEdit->text();strings=input.toStdString();//cout<<s<<endl;inti=0;intj;chartemp[MAX];floatc;while(s[i]!='\0'){if(isdigit(s[i])){j=0;while(isdigit(s[i])||s[i]=='.'){try{if(j<MAX-1){temp[j]=s[i];j++;i++;}}catch(exceptione){numStack.clear();operatorStack.clear();return;//cout<<"輸入的數(shù)字的位數(shù)超出計(jì)算器的規(guī)定長度!請重新輸入算式"<<endl;abortOperation();}}temp[j]='\0';c=atof(temp);//類型轉(zhuǎn)換,將字符字符數(shù)組轉(zhuǎn)換為數(shù)字try{if(!numStack.full())numStack.push(c);}catch(exceptione){//cout<<"輸入的數(shù)字的位數(shù)超出計(jì)算器的規(guī)定長度!請重新輸入"<<endl;abortOperation();}}//如果s[i]是數(shù)字或者是小數(shù)點(diǎn)那么就存入數(shù)組temp中,直到符號出現(xiàn),然后將數(shù)字壓入數(shù)字棧else{charstackin=operatorStack.pop('a');//取符號棧的棧頂元素/*此處加一個(gè)對負(fù)數(shù)的判斷,因?yàn)橹挥虚_頭時(shí)負(fù)數(shù)才直接可以寫符號*///if(i==0&&s[i]=='-')//{//}while(!operatorCompare(s[i],stackin))//棧頂元素與棧外元素比較,如果棧內(nèi)符號優(yōu)先級大于等于棧外符號優(yōu)先級則執(zhí)行{if(stackin=='#'){//cout<<"計(jì)算結(jié)果:"<<endl;//cout<<numStack.pop(1)<<endl;operateEdit->setText(QString::number(numStack.pop(1)));gotoloop2;//重啟計(jì)算器}if(s[i]==')')//這里可以用等于來判斷{if(stackin=='('){operatorStack.remove('a');}//如果下一個(gè)符號是')'并且棧內(nèi)符號是'(',那么符號'('出棧。gotoloop1;}else{partCalculate(stackin);//棧內(nèi)符號優(yōu)先級較棧外符號優(yōu)先級高,局部計(jì)算operatorStack.remove('a');//使用完的符號從符號棧中移除stackin=operatorStack.pop('a');//再與符號棧中的下一個(gè)符號進(jìn)行比較}}//棧內(nèi)符號比棧外符號優(yōu)先級高,計(jì)算,符號出棧,數(shù)字壓棧operatorStack.push(s[i]);loop1:i++;//這里是為了去掉兩個(gè)相鄰的()進(jìn)行下一步計(jì)算}//如果去到的是符號,那么與棧內(nèi)符號比較}loop2:return;//calculate();//cout<<numStack.pop(1)<<endl;//operateEdit->setText(QString::number(numStack.pop(1)));}//表達(dá)式計(jì)算boolcalculatorWindow::operatorCompare(charstackOut,charstackIn)//operatorA為棧內(nèi)符號,operationB為棧外符號{inttempOut,tempIn;switch(stackOut){case'+':case'-':tempOut=1;break;case'*':case'/':tempOut=3;break;case'(':tempOut=7;break;case')':tempOut=0;break;case'S':case'C':case'T':case'O':case'X':case'Q':case'W':tempOut=5;break;/***修改處*******/case'=':tempOut=-1;case'#':tempOut=-2;break;/***修改處*******/default:abortOperation();//這里要對異常進(jìn)行處理,如何處理后面考慮break;}switch(stackIn){case'+':case'-':tempIn=2;break;case'*':case'/':tempIn=4;break;case'(':tempIn=0;break;case')':tempIn=7;break;case'S':case'C':case'T':case'X':case'Q':case'W':tempIn=5;break;case'#':tempIn=-1;break;default:abortOperation();//這里要對異常進(jìn)行處理,如何處理后面考慮break;//這里可以嘗試用goto語句,或者是用重新調(diào)用一個(gè)函數(shù)}if(tempOut>tempIn){returntrue;}else{returnfalse;}}//該函數(shù)實(shí)現(xiàn)的是對棧外符號和棧內(nèi)符號的比較voidcalculatorWindow::partCalculate(charoper){floattemp1;floattemp2;switch(oper){case'S':temp1=numStack.remove(1);temp1=sin(temp1);numStack.push(temp1);break;case'C':temp1=numStack.remove(1);temp1=cos(temp1);numStack.push(temp1);break;case'T':temp1=numStack.remove(1);temp1=tan(temp1);numStack.push(temp1);break;case'X':temp1=numStack.remove(1);if(temp1==0){abortOperation();}else{temp1=1/temp1;numStack.push(temp1);}break;case'Q':temp1=numStack.remove(1);temp1=sqrt(temp1);numStack.push(temp1);break;case'W':temp1=numStack.remove(1);temp1=pow(temp1,2);numStack.push(temp1);break;case'+':temp1=numStack.remove(1);temp2=numStack.remove(1);temp1=temp1+temp2;numStack.push(temp1);break;case'-':temp1=numStack.remove(1);temp2=numStack.remove(1);temp1=temp2-temp1;numStack.push(temp1);break;case'*':temp1=numStack.remove(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南通科技職業(yè)學(xué)院《數(shù)字通信系統(tǒng)設(shè)計(jì)原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏財(cái)經(jīng)職業(yè)技術(shù)學(xué)院《服務(wù)設(shè)計(jì)專題》2023-2024學(xué)年第二學(xué)期期末試卷
- 大連航運(yùn)職業(yè)技術(shù)學(xué)院《舞蹈專業(yè)教學(xué)法》2023-2024學(xué)年第二學(xué)期期末試卷
- 益陽醫(yī)學(xué)高等??茖W(xué)校《ExportMarketing》2023-2024學(xué)年第二學(xué)期期末試卷
- 滄州幼兒師范高等專科學(xué)?!豆こ淘靸r(jià)管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 冀中職業(yè)學(xué)院《行政職業(yè)能力》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西青年職業(yè)學(xué)院《創(chuàng)業(yè)教育與就業(yè)指導(dǎo)下》2023-2024學(xué)年第二學(xué)期期末試卷
- 黑龍江林業(yè)職業(yè)技術(shù)學(xué)院《小動物臨床用藥專題》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京藝術(shù)傳媒職業(yè)學(xué)院《機(jī)械制圖1(下)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2021年電力工程室外落水管及散水施工作業(yè)指導(dǎo)書
- 學(xué)生心理健康測量表
- GA745-2017銀行自助設(shè)備、自助銀行安全防范要求國標(biāo)
- 邯鄲市垃圾填埋場封場方案
- 2020閩教版信息技術(shù)四年級(下冊)全冊教案
- introduction to pipeline pilot在處理數(shù)據(jù)中的一些應(yīng)用
- 智能中臺數(shù)據(jù)底座解決方案
- 突發(fā)性聾診療指南 (2015版)
- 光伏發(fā)電工程施工組織設(shè)計(jì)施工工程光伏發(fā)電工程光伏發(fā)電施工組織設(shè)計(jì)
- 11鋼的表面淬火解析
- 導(dǎo)數(shù)應(yīng)用舉例
- 第三講文獻(xiàn)的形成與流布1
評論
0/150
提交評論