數(shù)據(jù)結(jié)構(gòu)畢業(yè)課程設計-示例文檔_第1頁
數(shù)據(jù)結(jié)構(gòu)畢業(yè)課程設計-示例文檔_第2頁
數(shù)據(jù)結(jié)構(gòu)畢業(yè)課程設計-示例文檔_第3頁
數(shù)據(jù)結(jié)構(gòu)畢業(yè)課程設計-示例文檔_第4頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、( 此文檔為 word 格式,下載后您可任意編輯修改!)韶關學院計算機科學學院數(shù)據(jù)結(jié)構(gòu)課程設計題目:課堂經(jīng)驗值查詢系統(tǒng)學生姓名:呂功名專業(yè):計算機科學與技術班級: 11 級( 1)班指導教師姓名及職稱:陳正銘講師起止時間:2013 年 2 月2013 年 4 月- 0 -1 需求分析1.1課題背景及意義隨著計算機網(wǎng)絡技術的發(fā)展和因特網(wǎng)的廣泛普及,網(wǎng)絡安全事故逐年增加,黑客的攻擊已經(jīng)和病毒并列成為對信息安全影響最嚴重的兩大危害。其很大程度上是被黑客破解了用戶的計算機名及登陸密碼及資料的加密較差,而使得黑客來對網(wǎng)民的資料如同自己般的隨意更改和破壞。而安全的密碼和賬號成為了網(wǎng)民的安全之本,怎么才能提

2、高安全問題成為的人們和社會關注的問題。而加密大部又是以大素數(shù)的計算為基礎的,如非對稱密碼體制 RSA的安全性依賴于對大數(shù)進行因數(shù)分解的耗時性。大數(shù)運算不僅僅運用在密碼學中,還運用在一些物理學研究、生物學,化學等科目中。大數(shù)運算,意味著參加的值和計算結(jié)果通常是上百位數(shù),上千位數(shù)以及更大長度之間的整數(shù)運算。例如大家所熟知圓周率 的值,在一般的數(shù)值計算中用到圓周率的不須要多大的精度,但在計算一些星球或是星系上的體積面積時便顯的誤差很大了,這就要求 值計算的精度達到幾百萬位甚至更高,才能縮小誤差。人工計算是遠遠不行了,而且本身誤差也無法估計。只有在計算機中用大數(shù)運算求 值了。又如,考古學家計算石頭內(nèi)的

3、碳元素衰變來考證地球形成的時間,更是將計算的結(jié)果精確到了百年以內(nèi)。所以說大數(shù)的運算是涉及領域多,應用范廣,與我們生活息息相關。數(shù)據(jù)結(jié)構(gòu)課程設計是一門實踐性的計算機課程,為了學好這門課程,必須在掌握理論知識的同時,加強上機實踐。通過這次課程設計,要求掌握較大程序的設計方法,相應數(shù)據(jù)結(jié)構(gòu)的選擇應用、算法的設計及其實現(xiàn)和性能分析等方面中加深對課程基本內(nèi)容的理解。同時,在設計方法以及上機操作等基本技能和科學作風方面受到比較系統(tǒng)和嚴格的訓練。1.2課題要求A. 支持大數(shù)精確運算的計算器B. 實現(xiàn)一個大數(shù)(要求允許絕對值 >10128)的計算器圖形化程序軟件。C. 要求程序讀入大數(shù) A 和 B,選擇

4、相應的加、減、乘或除法運算符,然后計算精確結(jié)果(不能用科學計數(shù)法,不四舍五入)并輸出到屏幕上,在普通計算機上運算時間不超過1 分鐘。D. 選做內(nèi)容:實現(xiàn)大數(shù)的其他運算(如三角函數(shù)),求出運算時間。1.3軟件格式規(guī)定A輸入的形式 : 正數(shù)的不用輸入符號位,數(shù)值的第一位可以為零。位數(shù)在01000 之間B. 程序所能達到的功能: 能進行位數(shù)在01000(可在源程序里設置位數(shù)大小)之間的所有整型數(shù)和浮點型數(shù)的四則運算。C.輸出的形式 : 是整型或浮點型數(shù)據(jù)D.測試的數(shù)據(jù):1) 、正確的輸入:以下是對兩個大數(shù)進行加減乘除四則運算所得的正確結(jié)果:正確的運算結(jié)果:2) 、windows 版本應用程序錯誤的輸

5、入 :數(shù)A: 112 數(shù)B:01.4設計目標A. 軟件名稱:大數(shù)運算器B. 軟件組成: DosBigMath.exe ( dos 系統(tǒng)應用程序) ; WinBigMath.exe( windows 系統(tǒng)圖形化窗口操作界面應用程序)C. 制作平臺及相關調(diào)試工具: Win32 ;MicrosoftVisuslC+2005 ExpressD. 運行環(huán)境: doswinxpwin7E. 性能特點:(1)軟件由兩個可執(zhí)行文件組成,各具特點:DosBigMath.exe 為 dos 系統(tǒng)應用程序,體積小,高效快捷,適用范圍廣,兼容性好。WinBigMath.exe 為 windows 應用程序,界面友好,

6、使用方便。( 2)輸入的大數(shù)可為整型,也可以是浮點型。( 3)DosBigMath.exe ( dos 系統(tǒng)應用程序)的輸入和輸出形式:運算符選擇按回車鍵輸入 A 的值按回車鍵再輸入 B 的值按回車鍵輸出運算結(jié)果并顯示運算所花時間( ms級)。( 4)WinBigMath.exe ( windows 應用程序)可支持鼠標點擊輸入與鍵盤輸入,可支持黏貼的數(shù)字。( 5)運行時間較短,精確到毫秒級。( 6)個別其他功能可進行再擴展。2 概要設計2.1 問題解決的思路概述首先是確定結(jié)構(gòu)化程序設計的流程圖,利用已存在的數(shù)據(jù)結(jié)構(gòu)來構(gòu)造一個存儲大數(shù)的結(jié)構(gòu),接著把四則運算分成四個主要的模塊:實現(xiàn)加法的模塊、實

7、現(xiàn)減法的模塊、實現(xiàn)乘法的模塊、實現(xiàn)除法的模塊,然后各個模塊里面還要分成若干種情況來考慮并通過函數(shù)的嵌套調(diào)用來實現(xiàn)其功能。最后,編寫main 主函數(shù)以實現(xiàn)大整數(shù)的正確輸入與正確輸出,調(diào)試程序并將不足的地方加以修改??偠灾?,就是先用自頂向下、逐步細化的設計方法來分析并畫出程序設計流程圖;然后用自下而上、逐步積累的設計方法來寫出程序。2.2相關函數(shù)介紹說明在 dos 版本程序和 windows 版本程序下都定義了一個用于存儲大數(shù)的結(jié)構(gòu)體類型變量:typedefstructtagBigNum BigNum;( 1) dos 版本程序下定義的相關函數(shù)void StartCount();計時開始void

8、 EndCount();計時結(jié)束double Time();返回時差void InitBigNumToZero(BigNum *pNum);初始化 BigNum為0intCharLenByBigNum(CONST BigNum* pNum);判斷需要多少個字符空間存儲 BigNum轉(zhuǎn)換的字符串 . void CharToBigNum(CONSTchar *arr,BigNum *pNum);從字符串轉(zhuǎn)換到 BigNum.void BigNumToChar(char *szBuf,CONST BigNum *pNum);從BigNum轉(zhuǎn)換到字符串 .void AdjustBits(BigNum

9、*pNum);調(diào)節(jié)數(shù)位 , 刪除最高整數(shù)位是的和最低小數(shù)位是的數(shù)位.void MoveFloatPoint(BigNum *pNum,intdeta);移動小數(shù)點 ,deta=0 不移動 ,deta<0 往左移動 ,deta>0 往右移動 .void MakeInfinite(BigNum *pNum);使無窮大char *Result(CONSTchar *val1,CONST char *val2,PFNCALC pfnCalc);根據(jù)算術函數(shù)返回結(jié)果int Compare(CONST BigNum* pn1,CONST BigNum* pn2); 比較個數(shù)大小 int IsZ

10、ero(CONST BigNum *pNum); 判斷是否為void Add(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);加法void Mul(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);乘法void Sub(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);減法void Div(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);除法void showmenu(); 顯示菜單信息voi

11、d menu(); 選擇運算符的菜單void GetNum(CHARARR numa,CHARARR numb);從dos界面獲取輸入字符串( 2) windows 版本程序下定義的相關函數(shù)windows 版本程序下定義的相關函數(shù)中除了沒有“void showmenu(); ”“、 voidmenu(); ”、“ void GetNum(CHARARR numa,CHARARR numb);”三個 dos 輸入顯示函數(shù),其他的函數(shù)都和dos 版本程序下定義的一樣。2.3主程序的流程基函數(shù)調(diào)用說明在這里,主程序的流程以dos 版本程序進行說明。( 1)主程序的簡要流程圖圖 1 主程序流程圖( 2

12、)各程序模塊之間的層次(調(diào)用)關系1調(diào)用“ Result( ) ”函數(shù),以調(diào)用“ CharToBigNum( ) ”將輸入的字符型大數(shù)轉(zhuǎn)換成可用于運算的結(jié)構(gòu)體類型大數(shù),然后調(diào)用四則運算的各運算模塊進行相應的運算,再調(diào)用“ BigNumToChar( ) ”將各運算模塊返回的運算結(jié)果轉(zhuǎn)換成字符類型用于輸出顯示,期間還要調(diào)用“ CharLenByBigNum( ) ”來判斷數(shù)據(jù)所需的存取空間。2在每一個運算模塊都涉及到大數(shù)的存取,所以都要調(diào)用“ InitBigNumToZero( ) ”對結(jié)構(gòu)體變量初始化。3 加法運算程序模塊“ Add( ) ”,首先要判斷兩個大數(shù)的符號位,如果是一號相加則調(diào)用減

13、法運算程序“Sub( ) ”;如果是同號相加則直接運行程序。4減法運算程序模塊“ Sub( ) ”,首先要判斷兩個大數(shù)的符號位,如果是異號相減則調(diào)用加法程序“Add( ) ”;如果是同號相減則直接運行,然后調(diào)用“ Compare( ) ”以實現(xiàn)大數(shù)減小數(shù)。5 乘法運算程序模塊“Mul( ) ”,首先調(diào)用“ MoveFloatPoint( )”以實現(xiàn)浮點型數(shù)以整型數(shù)的形式相乘,采用“模擬筆算”的方法,每乘一次都要調(diào)用加法程序“ Add( ) ”將結(jié)果累加起來,然后在調(diào)用“MoveFloatPoint( )”將所得的整型結(jié)果轉(zhuǎn)化成正確的浮點型類型相乘結(jié)果。6 除法運算模塊“ Div( )”,首先調(diào)

14、用“ MoveFloatPoint( )”以實現(xiàn)浮點型數(shù)以整型數(shù)的形式相除,采用“模擬筆算”的方法,以除數(shù)的位數(shù)長度為基準,多次循環(huán)調(diào)用“Compare( ) ”、“MoveFloatPoint() ”、“ Mul( ) ”和“ Sub( ) ”,一直到規(guī)定的小數(shù)位數(shù)為止,最終還要要調(diào)用“MoveFloatPoint( )”將所得的整型結(jié)果轉(zhuǎn)化成對應的浮點型類型相除結(jié)果。3 詳細設計3.1數(shù)字存儲的實現(xiàn)大數(shù)計算的因數(shù)和結(jié)果精度一般是少則數(shù)十位,多則幾萬位。在C 語言中定義的類型中精度最多只有二十多位,由于涉及到浮點型大數(shù)和負數(shù)的運算,因而程序采取定義一個結(jié)構(gòu)體類型存貯的方式來存放大數(shù)符號、小數(shù)

15、點、整數(shù)部分、整數(shù)數(shù)位、小數(shù)部分、小數(shù)有效位數(shù)。在計算中會用到從高位開始計算,和從低位開始計算數(shù)值的兩種情況。其結(jié)構(gòu)為:typedefstructtagBigNum intintbits;整數(shù)數(shù)位intfloatbits;小數(shù)有效數(shù)位char infinite;無窮大char sign;符號char intpartINT_BIT_MAX;char floatpartFLOAT_BIT_MAX; BigNum;整數(shù)部分小數(shù)部分3.2四則運算算法在大數(shù)四則運算的程序設計中,每一部分都會調(diào)用一些其他其它函數(shù)來輔助完成運算(例如:對結(jié)構(gòu)體變量的初始化,比較兩個數(shù)的大小, 將字符型數(shù)據(jù)轉(zhuǎn)換成結(jié)構(gòu)體類型數(shù)

16、據(jù)和將結(jié)構(gòu)體類型數(shù)據(jù)轉(zhuǎn)換成字符型數(shù)據(jù)等),在這里主要說明四則運算的程序設計,其它函數(shù)的程序設計和具體調(diào)用關系請查看程序清單。加法運算的實現(xiàn)加法計算還是比較容易實現(xiàn)的,對于整數(shù)部分的計算,以整數(shù)部分位數(shù)長的作為循環(huán)變量, 先從低位算起, 因為只須要對應的位相加 (相加結(jié)果小于20),再加上前一位的進位,再判斷本位是否有進位,把進位值改為本位除以它的權(quán)(也就是10)取整(既有進位時,給進位賦值1,如果沒有進位,則給進位賦值 0),然后把本位數(shù)字改為本位除以它的權(quán)(也就是10)取余。圖 2 加法運算原理圖對于加法運算中小數(shù)部分的計算,也是從低位算起,以小數(shù)部分位數(shù)長作為循環(huán)變量,相加的原理跟整數(shù)部分

17、一樣。在程序中設計時應注意:1以上加法運算的原理只針對兩個符號位相同的大數(shù)相加,如果是異號相加則要調(diào)用減法運算模塊;2 結(jié)束循環(huán)時,不僅僅是最后一位加完就停止,還應加入如果有進位,也要再循環(huán)一次。如最后一位是9,進位是 1,則相加時進位,要加上進位這一位值。具體看代碼。3 如果是兩個負數(shù)相加,最終結(jié)果還要加負號。減法運算的實現(xiàn)由于使用結(jié)構(gòu)體類型來分別存儲了大數(shù)的整數(shù)及其位數(shù)、小數(shù)及其位數(shù)、符號(正、負),所以對于減法運算的實現(xiàn)也是比較簡單的。對于整部部分,算法從低位開始減。首先判斷兩個數(shù)是否相等,如果相等則直接返回結(jié)果位0;否則要判斷減數(shù)和被減數(shù)那一個位數(shù)長,被減數(shù)位數(shù)長是正常減;減數(shù)位數(shù)長,

18、則減數(shù)減被減數(shù),最后還要加上負號。兩數(shù)位數(shù)長度相等時,比較哪一個數(shù)大,被數(shù)大則正常減;減數(shù)數(shù)大則減數(shù)減被減數(shù)。處理每一項時,如果前一位相減有借位,就先減去上一位的借位,無則不減,再去判斷是否能夠減開被減數(shù),如果減不開,就要借位后再去減,同時置借位為1,否則置借位為0。圖 3 減法運算原理圖對于減法運算中小數(shù)部分的計算,也是從低位算起,減法原理跟整數(shù)部分一樣。在程序設計時應注意:1 兩個浮點型數(shù)的減法運算是從小數(shù)部分開始的,當小數(shù)部分計算完了才開始計算整數(shù)部分;而計算整數(shù)部分的時候還要判斷小數(shù)部分的計算是否有向整數(shù)部分借位。2 以上減法運算的原理只針對兩個符號位相同的大數(shù)相減,如果是異號相減則要

19、調(diào)用加法運算模塊。乘法運算的實現(xiàn)首先說一下乘法計算的算法,從低位向高位乘,在豎式計算中,我們是將乘數(shù)第一位與被乘數(shù)的每一位相乘,記錄結(jié)果,之后,用第二位相乘,記錄結(jié)果并 且左移一位,以此類推,直到計算完最后一位,再將各項結(jié)果相加。得出最后結(jié)果。當然我們可以直接用這種方法,但要用多個結(jié)構(gòu)體變量來保存計算出的分結(jié)果,之后結(jié)果再相加得到最后結(jié)果,但是這樣會浪費很多空間;因此,可以再優(yōu)化一下,就是只用兩個結(jié)構(gòu)體變量來表示結(jié)果,先把第一位乘數(shù)與被乘數(shù)的結(jié)果保存在第一個結(jié)構(gòu)體變量中,然后將此次分結(jié)果與第二個結(jié)構(gòu)體變量中的數(shù)相加并將結(jié)果保存于第二個結(jié)構(gòu)體變量中;在進行下一次相乘,第二位乘數(shù)與被乘數(shù)結(jié)果存在第

20、一個結(jié)構(gòu)體變量中,再與第二個結(jié)構(gòu)體變量中保留的累加結(jié)果相加。以此類推,直到結(jié)束。這樣就可以用兩個結(jié)構(gòu)體變量來存儲相乘后的結(jié)果并節(jié)省了一些空間。圖 4 乘法運算原理圖在程序設計時應注意:1兩個浮點型數(shù)的乘法運算是先將浮點型數(shù)轉(zhuǎn)換成整型數(shù),再從低位開始計算,當計算完后了還要將整型結(jié)果轉(zhuǎn)換成浮點型結(jié)果。2 兩個異號大數(shù)相乘時,結(jié)果要加上負號。3將各分結(jié)果相加時,直接調(diào)用加法運算函數(shù)即可。除法運算的實現(xiàn)首先次除法運算所要得到的結(jié)果,當被除數(shù)除不開除數(shù)時,被除數(shù)補零繼續(xù)向下除,一直除到規(guī)定的小數(shù)位數(shù)。從高位向低位減,減時以被除數(shù)長度為單位,從高位取出大于被除數(shù)的字符串(被除數(shù)),然后將原除數(shù)乘以一個權(quán)值

21、(小于10)得到一個不大于被除數(shù)的新的被除數(shù),再用被除數(shù)減去新的除數(shù),權(quán)值既為結(jié)果,余數(shù)從剩下的被除數(shù)高位再取出幾位做補位,如此類推,循環(huán)減。最終,將相應的小數(shù)結(jié)果返回。圖 5 除法運算原理圖在程序設計時應注意 :1上述除法原理是從兩個整型數(shù)相除的角度來說明的。當兩個大數(shù)中有浮點型數(shù)時,要先將小數(shù)轉(zhuǎn)換成整數(shù)再進行除法運算,運算完畢后,還要將最后的結(jié)果轉(zhuǎn)換成相對應得小數(shù)結(jié)果。2減數(shù)(亦即除數(shù))乘上一個權(quán)值后不能大于被減數(shù)(亦即被除數(shù))。3乘以一個權(quán)值時,可直接調(diào)用乘法運算函數(shù)即可;循環(huán)相減時,可直接調(diào)用減法運算函數(shù)即可。3.3函數(shù)調(diào)用關系圖此函數(shù)調(diào)用關系圖以 dos 版本應用程序來進行說明。此函

22、數(shù)調(diào)用關系圖主要描述了四則運算的實現(xiàn)及實現(xiàn)各運算所要調(diào)用的函數(shù),詳情還請看程序清單。圖 6 函數(shù)調(diào)用關系圖4 調(diào)試分析表 1 調(diào)試過程情況表序時間出現(xiàn)問題號1做減法時由于沒有考慮到 a<b 的情況,出現(xiàn)了輸出結(jié)果錯誤的情況2減法輸出結(jié)果中測試到,當高位的值相減為0 時,也是把 0 給輸出3乘法運算編程算法是逐個轉(zhuǎn)化為數(shù)字, 進行整型運算,結(jié)果存儲很麻煩,需要多次進行加法運算,還要進行移位運算,使數(shù)字的相加位一致。4乘法結(jié)果 c 的存儲大小沒考慮到最大的進位,只是考慮了最高的進位不大于 9,沒有考慮到進位大于 10 的情況,導致溢出位沒有輸出,結(jié)果錯誤。5對于除法,結(jié)果輸出的時候也是遇到了

23、與減法運算時,沒有清零的情況6除法參考別人的算法,發(fā)現(xiàn)當輸入的大整數(shù)a<b 時,商為空7一次輸入兩個大整數(shù)只能運算一次,發(fā)現(xiàn)很麻煩8可以重復輸入下一次的大整數(shù),但是屏幕上的東西太多了,但是一次清理就會使屏幕清空,不能做下一次的運解決方法將減法分成三部分,a>b,a<b,a=b, 做 a<b 時將 a 和 b 互換,執(zhí)行 a>b 時的操作, a=b 時就直接輸出 0存儲數(shù)組c,用一個for語句,if(ci!=0)break;到第一個非0開始,將后面的字符串逐個輸出 cout<<ci;可以這樣做乘法,先將每一位上有的每一個數(shù)字相乘在相加,求模作為那一位的數(shù)

24、字再轉(zhuǎn)化為字符,求整除則將結(jié)果加到高一位的結(jié)果中,如此循環(huán),直到最后一位,并存到 c 中。(運算方法在詳細設計的乘法中給出。 )對于乘法的進位,最大的不會超過 99,但有會有超過 10 的情況,所以存放結(jié)果的 c 的大小應該為兩個大整數(shù)的個數(shù)的和加上 2,當進位沒達到 c0 時,則將這些位置為 0 ,在進行結(jié)果輸出。參考減法運算的算法,將商的無效的 0將除法的情況也分為兩種:a>=b,a<b;當 a<b 時將商賦值為 0,然后將 a 作為余數(shù)也一并輸出。用 for 語句將四個運算符加入里面,用第二次輸入來判斷運算,只有當運算符不是四個中的一個時才跳出到下一次運算輸入。用一個

25、while (1)一個永真語句進入一個循環(huán),在循環(huán)的開始就設置清屏語句 system("cls"); 然后輸入是否選擇是否進入計算系統(tǒng),不進入的話就跳出循環(huán),結(jié)算。束執(zhí)行。9在輸入運算選擇符時用 getch()輸入就沒出現(xiàn)內(nèi)存問一開始用了 scanf (), 題,但是同時使用者也不知道自發(fā)現(xiàn)會導致內(nèi)存己輸入的是什么選擇符,再使用written 出錯一個 pirntf (),將輸入的字符顯示出來。10在輸入大整數(shù)運算后,將輸入的兩個數(shù)再次初始化,復進入到多重運算符多制到另外的兩個數(shù)組中,并顯示次操作的時候,結(jié)果會出來運算的兩個數(shù),發(fā)現(xiàn)沒有問出現(xiàn)亂碼。題了。11再進行結(jié)果的測試

26、的詢問了別人,原來不但要將進行過程中又再次出現(xiàn)結(jié)計算的兩個數(shù)進行初始化,還要果為亂碼的情況。將存儲結(jié)果的數(shù)組 c 一并清空,將 ci 的每一位都賦值為空。5 用戶使用說明分兩部分來分別說明dos 版本應用程序的操作和windows 版本應用程序的操作:5.1 dos版本應用程序操作說明(1)運行 DosBigMath.exe 應用程序后會出現(xiàn)主界面;(2)選擇所要做的運算,按下回車鍵;( 3)輸入第一個操作數(shù),按下回車界;( 4)再輸入第二個操作數(shù),按下回車,顯示結(jié)果。5.2 windows 版本應用程序操作說明(1)運行 WinBigMath.exe 應用程序后會出現(xiàn)主界面:圖 7 主界面效

27、果圖圖 8 運行效果圖(2)按下數(shù)字鍵( 09)在輸入框A 中輸入第一個大數(shù),如果發(fā)現(xiàn)按錯數(shù)字鍵可按“退格”鍵從后往前一個一個地刪除;然后按下“+”“- ”“ * ”“”鍵,自動切換到 B 輸入框,按下數(shù)字鍵( 09)輸入第二個大數(shù) ,同樣,如果發(fā)現(xiàn)按錯數(shù)字鍵可按“退格”鍵從后往前一個一個地刪除;最后按下“=”鍵,輸出顯示運算結(jié)果并顯示運算時間;( 3)如果在按下運算符按鍵后發(fā)現(xiàn)第一個輸入有錯,則可再按一次同樣的運算符按鍵,就自動切換到輸入框 A,這是按下“退格”鍵可從后往前一個一個地刪除。6 測試結(jié)果6.1 dos版本應用程序測試結(jié)果:圖 9 dos 版本測試結(jié)果圖6.2 windows 版

28、本應用程序測試結(jié)果:圖 10 windows 版本測試結(jié)果圖參考文獻1 陳元春,王中華等 . 實用數(shù)據(jù)結(jié)構(gòu) M. 北京:中國鐵道出版社, 2003.18-40.附錄:程序清單本程序設計由三部分組成(“ BigMath.c”,“ BigMath.c ” ):* BigMath.;char intpartINT_BIT_MAX;char floatpartFLOAT_BIT_MAX;符號整數(shù)部分小數(shù)部分 BigNum;算術函數(shù)指針類型.typedefvoid(*PFNCALC)(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);計時開始void S

29、tartCount();計時結(jié)束void EndCount() ;返回時差floatTime();初始化 BigNum為 .void InitBigNumToZero(BigNum *pNum);判斷需要多少個字符空間存儲BigNum轉(zhuǎn)換的字符串.intCharLenByBigNum(CONST BigNum* pNum);從字符串轉(zhuǎn)換到BigNum.void CharToBigNum(CONST char *arr,BigNum *pNum);從 BigNum轉(zhuǎn)換到字符串 .void BigNumToChar( char *szBuf,CONST BigNum *pNum);調(diào)節(jié)數(shù)位 , 刪

30、除最高整數(shù)位是0的和最低小數(shù)位是0的數(shù)位 .void AdjustBits(BigNum *pNum);移動小數(shù)點 ,deta=0 不移動 ,deta<0 往左移動 ,deta>0 往右移動 .void MoveFloatPoint(BigNum *pNum,intdeta);使無窮大void MakeInfinite(BigNum *pNum);根據(jù)算術函數(shù)返回結(jié)果char *Result(CONSTchar *val1,CONSTchar *val2,PFNCALC pfnCalc);比較個數(shù)大小intCompare(CONST BigNum* pn1,CONST BigNum

31、* pn2);判斷是否為intIsZero(CONST BigNum *pNum);加法void Add(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);乘法void Mul(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);減法void Sub(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);除法void Div(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);#endif AFX_BIG

32、MATH_H_FC9C727A_5204_4798_9686_0CC00C25729C_INCLUDED_ * BigMath.c: implementation*#include <stdio. (TimeEnd.QuadPart-TimeStart.QuadPart)*1000Freq; 返回時差void InitBigNumToZero(BigNum *pNum)初始化BigNum為memset(pNum,0, sizeof(BigNum);void AdjustBits(BigNum *pNum)調(diào)節(jié)數(shù)位 , 刪除最高整數(shù)位是0的和最低小數(shù)位是0的數(shù)位 .while (pNum-

33、>intbits>1&&pNum->intpartpNum->intbits-1=0)pNum->intbits-;while (pNum->floatbits>1&&pNum->floatpartpNum->floatbits-1=0)pNum->floatbits-;voidMoveFloatPoint(BigNum*pNum,intdeta)deta<0則往左移動小數(shù)點,deta>0則向右移動小數(shù)點if (deta)BigNum n=*pNum;InitBigNumToZero(pNu

34、m);pNum->sign=n.sign;if (deta<0)inti;deta=-deta;for (i=deta;i<bits;i+)pNum->intpartpNum->intbits+=parti;for (i=deta-1;i>=0;i-)pNum->floatpartpNum->floatbits+=parti;for (i=0;i<n.floatbits;i+)pNum->floatpartpNum->floatbits+=n.floatparti;elseinti;for (i=d

35、eta;i<n.floatbits;i+)處理小數(shù)部分pNum->floatpartpNum->floatbits+=n.floatparti;for (i=deta-1;i>=0;i-)小數(shù)到整數(shù)的部分pNum->intpartpNum->intbits+=n.floatparti;for (i=0;i<bits;i+)整數(shù)部分pNum->intpartpNum->intbits+=parti;AdjustBits(pNum);intCharLenByBigNum(CONST BigNum* pNum)判斷需要多少個字

36、符空間存儲BigNum轉(zhuǎn)換的字符串 .intlen = pNum->floatbits+pNum->intbits+1;if(pNum->intbits=0) len+;.1 -> 0.1if(pNum->floatbits) len+;'.'if(pNum->sign) len+;'-'if(pNum->infinite)return 11;#INFINITEreturnlen;void CharToBigNum(CONST char *arr,BigNum *pNum)從字符串轉(zhuǎn)換到BigNum.char *poin

37、t;InitBigNumToZero(pNum);if (*arr='-')如果是負數(shù)arr+;pNum->sign=1;point=strchr(arr,'.');if (point)找到小數(shù)點intn=pNum->intbits=point-arr;while (n)整數(shù)數(shù)位不 =0則循環(huán)計算出整數(shù)數(shù)位pNum->intpartpNum->intbits-n=arrn-1-'0' ;將數(shù)字低位存在低下標元素n-;while (*+point)pNum->floatpartpNum->floatbits=*p

38、oint-'0' ;pNum->floatbits+;else說明沒寫小數(shù)點, 全是整數(shù).intn=pNum->intbits=strlen(arr);while (n)pNum->intpartpNum->intbits-n=arrn-1-n-;'0' ;AdjustBits(pNum);處理 -0和的情況if (pNum->floatbits=0)if (pNum->intbits=0 | pNum->intbits=1&&pNum->intpart0=0)pNum->sign=0;voi

39、d BigNumToChar( char *szBuf,CONST BigNum* pNum)從 BigNum轉(zhuǎn)換到字符串.intn=pNum->intbits,c;memset(szBuf,0,CharLenByBigNum(pNum);if (pNum->sign)如果是負數(shù)*szBuf+= '-'if (pNum->infinite)strcat(szBuf,return;"#INFINITE");while (n)szBufpNum->intbits-n=pNum->intpartn-1+ n-;'0'

40、;c=0;是否加了if (pNum->intbits=0) strcat(szBuf,c=1;"0" );if (pNum->floatbits) strcat(szBuf,n=0;while (n<pNum->floatbits)"." );szBufpNum->intbits+1+n+c=pNum->floatpartn+'0'n+;char *Result(CONSTchar *val1,CONSTchar *val2,PFNCALC pfnCalc)根據(jù)算術函數(shù)返回結(jié)果staticchar *s

41、_szRes=NULL;BigNum n1,n2,res;if (s_szRes) delete s_szRes;free(s_szRes);s_szRes=NULL;CharToBigNum(val1,&n1);CharToBigNum(val2,&n2);pfnCalc(&n1,&n2,&res);s_szRes = new charCharArrLenByBigNum(&res);s_szRes=( char *)malloc(CharLenByBigNum(&res)* sizeof ( char ); BigNumToChar(

42、s_szRes,&res);returns_szRes;intCompare(CONST BigNum* pn1,CONST BigNum* pn2)比較個數(shù)大小首先是比較符號if (pn1->sign=0&&pn2->sign!=0)pn1是正數(shù),pn2 是負數(shù)return1;>elseif (pn1->sign!=0&&pn2->sign=0)pn1 是負數(shù) ,pn2是正數(shù)return-1;<else同號狀態(tài)比較整數(shù)部分if (pn1->intbits>pn2->intbits)returnpn1

43、->sign?-1:1;pn1 整數(shù)數(shù)位多elseif (pn1->intbits<pn2->intbits)returnpn1->sign?1:-1;else整數(shù)數(shù)位相同inti=pn1->intbits-1;指到最高位while (i>=0)if (pn1->intparti>pn2->intparti)returnpn1->sign?-1:1;elseif (pn1->intparti<pn2->intparti)returnpn1->sign?1:-1;else i-;整數(shù)部分相同, 比較小數(shù)部分

44、for (i=0;i<pn1->floatbits&&i<pn2->floatbits;)if (pn1->floatparti>pn2->floatparti)returnpn1->sign?-1:1;elseif (pn1->floatparti<pn2->floatparti)returnpn1->sign?1:-1;else i+;if (i<pn1->floatbits)if (i<pn2->floatbits)return0;相等returnreturnpn1->s

45、ign?-1:1;pn1->sign?1:-1;void MakeInfinite(BigNum *pNum)使無窮大pNum->infinite=1;intIsZero(CONST BigNum* pNum)判斷是否為if (pNum->floatbits=0&&pNum->intbits=0)return1;if (pNum->floatbits=0&&pNum->intbits=1&&pNum->intpart0=0)return1;return0;void Add(CONST BigNum* pn

46、1,CONST BigNum* pn2,BigNum* pRes)加法InitBigNumToZero(pRes);if (pn1->signpn2->sign)異號BigNum n2=*pn2;n2.sign=pn1->sign;Sub(pn1,&n2,pRes);else同號intmaxfloatbits=pn1->floatbits>pn2->floatbits?pn1->floatbits:pn2->floatbits;intaddbit=0;進位值inti,j;StartCount();計時開始for (i=maxfloatbi

47、ts-1;i>=0;i-)intvalue=pn1->floatparti+pn2->floatparti+addbit;addbit=value10;看看是否超過.設置進位值pRes->floatparti=value%10;pRes->floatbits=maxfloatbits;到此 , 小數(shù)部分計算完畢.for (j=0;j<pn1->intbits|j<pn2->intbits;j+)整數(shù)部分相加intvalue=pn1->intpartj+pn2->intpartj+addbit;addbit=value10;pRes->intpartj=value%10;pRes-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論