版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、( 此文檔為 word 格式,下載后您可任意編輯修改!)韶關(guān)學(xué)院計(jì)算機(jī)科學(xué)學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目:課堂經(jīng)驗(yàn)值查詢系統(tǒng)學(xué)生姓名:呂功名專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級: 11 級( 1)班指導(dǎo)教師姓名及職稱:陳正銘講師起止時間:2013 年 2 月2013 年 4 月- 0 -1 需求分析1.1課題背景及意義隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展和因特網(wǎng)的廣泛普及,網(wǎng)絡(luò)安全事故逐年增加,黑客的攻擊已經(jīng)和病毒并列成為對信息安全影響最嚴(yán)重的兩大危害。其很大程度上是被黑客破解了用戶的計(jì)算機(jī)名及登陸密碼及資料的加密較差,而使得黑客來對網(wǎng)民的資料如同自己般的隨意更改和破壞。而安全的密碼和賬號成為了網(wǎng)民的安全之本,怎么才能提
2、高安全問題成為的人們和社會關(guān)注的問題。而加密大部又是以大素?cái)?shù)的計(jì)算為基礎(chǔ)的,如非對稱密碼體制 RSA的安全性依賴于對大數(shù)進(jìn)行因數(shù)分解的耗時性。大數(shù)運(yùn)算不僅僅運(yùn)用在密碼學(xué)中,還運(yùn)用在一些物理學(xué)研究、生物學(xué),化學(xué)等科目中。大數(shù)運(yùn)算,意味著參加的值和計(jì)算結(jié)果通常是上百位數(shù),上千位數(shù)以及更大長度之間的整數(shù)運(yùn)算。例如大家所熟知圓周率 的值,在一般的數(shù)值計(jì)算中用到圓周率的不須要多大的精度,但在計(jì)算一些星球或是星系上的體積面積時便顯的誤差很大了,這就要求 值計(jì)算的精度達(dá)到幾百萬位甚至更高,才能縮小誤差。人工計(jì)算是遠(yuǎn)遠(yuǎn)不行了,而且本身誤差也無法估計(jì)。只有在計(jì)算機(jī)中用大數(shù)運(yùn)算求 值了。又如,考古學(xué)家計(jì)算石頭內(nèi)的
3、碳元素衰變來考證地球形成的時間,更是將計(jì)算的結(jié)果精確到了百年以內(nèi)。所以說大數(shù)的運(yùn)算是涉及領(lǐng)域多,應(yīng)用范廣,與我們生活息息相關(guān)。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是一門實(shí)踐性的計(jì)算機(jī)課程,為了學(xué)好這門課程,必須在掌握理論知識的同時,加強(qiáng)上機(jī)實(shí)踐。通過這次課程設(shè)計(jì),要求掌握較大程序的設(shè)計(jì)方法,相應(yīng)數(shù)據(jù)結(jié)構(gòu)的選擇應(yīng)用、算法的設(shè)計(jì)及其實(shí)現(xiàn)和性能分析等方面中加深對課程基本內(nèi)容的理解。同時,在設(shè)計(jì)方法以及上機(jī)操作等基本技能和科學(xué)作風(fēng)方面受到比較系統(tǒng)和嚴(yán)格的訓(xùn)練。1.2課題要求A. 支持大數(shù)精確運(yùn)算的計(jì)算器B. 實(shí)現(xiàn)一個大數(shù)(要求允許絕對值 >10128)的計(jì)算器圖形化程序軟件。C. 要求程序讀入大數(shù) A 和 B,選擇
4、相應(yīng)的加、減、乘或除法運(yùn)算符,然后計(jì)算精確結(jié)果(不能用科學(xué)計(jì)數(shù)法,不四舍五入)并輸出到屏幕上,在普通計(jì)算機(jī)上運(yùn)算時間不超過1 分鐘。D. 選做內(nèi)容:實(shí)現(xiàn)大數(shù)的其他運(yùn)算(如三角函數(shù)),求出運(yùn)算時間。1.3軟件格式規(guī)定A輸入的形式 : 正數(shù)的不用輸入符號位,數(shù)值的第一位可以為零。位數(shù)在01000 之間B. 程序所能達(dá)到的功能: 能進(jìn)行位數(shù)在01000(可在源程序里設(shè)置位數(shù)大?。┲g的所有整型數(shù)和浮點(diǎn)型數(shù)的四則運(yùn)算。C.輸出的形式 : 是整型或浮點(diǎn)型數(shù)據(jù)D.測試的數(shù)據(jù):1) 、正確的輸入:以下是對兩個大數(shù)進(jìn)行加減乘除四則運(yùn)算所得的正確結(jié)果:正確的運(yùn)算結(jié)果:2) 、windows 版本應(yīng)用程序錯誤的輸
5、入 :數(shù)A: 112 數(shù)B:01.4設(shè)計(jì)目標(biāo)A. 軟件名稱:大數(shù)運(yùn)算器B. 軟件組成: DosBigMath.exe ( dos 系統(tǒng)應(yīng)用程序) ; WinBigMath.exe( windows 系統(tǒng)圖形化窗口操作界面應(yīng)用程序)C. 制作平臺及相關(guān)調(diào)試工具: Win32 ;MicrosoftVisuslC+2005 ExpressD. 運(yùn)行環(huán)境: doswinxpwin7E. 性能特點(diǎn):(1)軟件由兩個可執(zhí)行文件組成,各具特點(diǎn):DosBigMath.exe 為 dos 系統(tǒng)應(yīng)用程序,體積小,高效快捷,適用范圍廣,兼容性好。WinBigMath.exe 為 windows 應(yīng)用程序,界面友好,
6、使用方便。( 2)輸入的大數(shù)可為整型,也可以是浮點(diǎn)型。( 3)DosBigMath.exe ( dos 系統(tǒng)應(yīng)用程序)的輸入和輸出形式:運(yùn)算符選擇按回車鍵輸入 A 的值按回車鍵再輸入 B 的值按回車鍵輸出運(yùn)算結(jié)果并顯示運(yùn)算所花時間( ms級)。( 4)WinBigMath.exe ( windows 應(yīng)用程序)可支持鼠標(biāo)點(diǎn)擊輸入與鍵盤輸入,可支持黏貼的數(shù)字。( 5)運(yùn)行時間較短,精確到毫秒級。( 6)個別其他功能可進(jìn)行再擴(kuò)展。2 概要設(shè)計(jì)2.1 問題解決的思路概述首先是確定結(jié)構(gòu)化程序設(shè)計(jì)的流程圖,利用已存在的數(shù)據(jù)結(jié)構(gòu)來構(gòu)造一個存儲大數(shù)的結(jié)構(gòu),接著把四則運(yùn)算分成四個主要的模塊:實(shí)現(xiàn)加法的模塊、實(shí)
7、現(xiàn)減法的模塊、實(shí)現(xiàn)乘法的模塊、實(shí)現(xiàn)除法的模塊,然后各個模塊里面還要分成若干種情況來考慮并通過函數(shù)的嵌套調(diào)用來實(shí)現(xiàn)其功能。最后,編寫main 主函數(shù)以實(shí)現(xiàn)大整數(shù)的正確輸入與正確輸出,調(diào)試程序并將不足的地方加以修改??偠灾?,就是先用自頂向下、逐步細(xì)化的設(shè)計(jì)方法來分析并畫出程序設(shè)計(jì)流程圖;然后用自下而上、逐步積累的設(shè)計(jì)方法來寫出程序。2.2相關(guān)函數(shù)介紹說明在 dos 版本程序和 windows 版本程序下都定義了一個用于存儲大數(shù)的結(jié)構(gòu)體類型變量:typedefstructtagBigNum BigNum;( 1) dos 版本程序下定義的相關(guān)函數(shù)void StartCount();計(jì)時開始void
8、 EndCount();計(jì)時結(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ù)點(diǎn) ,deta=0 不移動 ,deta<0 往左移動 ,deta>0 往右移動 .void MakeInfinite(BigNum *pNum);使無窮大char *Result(CONSTchar *val1,CONST char *val2,PFNCALC pfnCalc);根據(jù)算術(shù)函數(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(); 選擇運(yùn)算符的菜單void GetNum(CHARARR numa,CHARARR numb);從dos界面獲取輸入字符串( 2) windows 版本程序下定義的相關(guān)函數(shù)windows 版本程序下定義的相關(guān)函數(shù)中除了沒有“void showmenu(); ”“、 voidmenu(); ”、“ void GetNum(CHARARR numa,CHARARR numb);”三個 dos 輸入顯示函數(shù),其他的函數(shù)都和dos 版本程序下定義的一樣。2.3主程序的流程基函數(shù)調(diào)用說明在這里,主程序的流程以dos 版本程序進(jìn)行說明。( 1)主程序的簡要流程圖圖 1 主程序流程圖( 2
12、)各程序模塊之間的層次(調(diào)用)關(guān)系1調(diào)用“ Result( ) ”函數(shù),以調(diào)用“ CharToBigNum( ) ”將輸入的字符型大數(shù)轉(zhuǎn)換成可用于運(yùn)算的結(jié)構(gòu)體類型大數(shù),然后調(diào)用四則運(yùn)算的各運(yùn)算模塊進(jìn)行相應(yīng)的運(yùn)算,再調(diào)用“ BigNumToChar( ) ”將各運(yùn)算模塊返回的運(yùn)算結(jié)果轉(zhuǎn)換成字符類型用于輸出顯示,期間還要調(diào)用“ CharLenByBigNum( ) ”來判斷數(shù)據(jù)所需的存取空間。2在每一個運(yùn)算模塊都涉及到大數(shù)的存取,所以都要調(diào)用“ InitBigNumToZero( ) ”對結(jié)構(gòu)體變量初始化。3 加法運(yùn)算程序模塊“ Add( ) ”,首先要判斷兩個大數(shù)的符號位,如果是一號相加則調(diào)用減
13、法運(yùn)算程序“Sub( ) ”;如果是同號相加則直接運(yùn)行程序。4減法運(yùn)算程序模塊“ Sub( ) ”,首先要判斷兩個大數(shù)的符號位,如果是異號相減則調(diào)用加法程序“Add( ) ”;如果是同號相減則直接運(yùn)行,然后調(diào)用“ Compare( ) ”以實(shí)現(xiàn)大數(shù)減小數(shù)。5 乘法運(yùn)算程序模塊“Mul( ) ”,首先調(diào)用“ MoveFloatPoint( )”以實(shí)現(xiàn)浮點(diǎn)型數(shù)以整型數(shù)的形式相乘,采用“模擬筆算”的方法,每乘一次都要調(diào)用加法程序“ Add( ) ”將結(jié)果累加起來,然后在調(diào)用“MoveFloatPoint( )”將所得的整型結(jié)果轉(zhuǎn)化成正確的浮點(diǎn)型類型相乘結(jié)果。6 除法運(yùn)算模塊“ Div( )”,首先調(diào)
14、用“ MoveFloatPoint( )”以實(shí)現(xiàn)浮點(diǎn)型數(shù)以整型數(shù)的形式相除,采用“模擬筆算”的方法,以除數(shù)的位數(shù)長度為基準(zhǔn),多次循環(huán)調(diào)用“Compare( ) ”、“MoveFloatPoint() ”、“ Mul( ) ”和“ Sub( ) ”,一直到規(guī)定的小數(shù)位數(shù)為止,最終還要要調(diào)用“MoveFloatPoint( )”將所得的整型結(jié)果轉(zhuǎn)化成對應(yīng)的浮點(diǎn)型類型相除結(jié)果。3 詳細(xì)設(shè)計(jì)3.1數(shù)字存儲的實(shí)現(xiàn)大數(shù)計(jì)算的因數(shù)和結(jié)果精度一般是少則數(shù)十位,多則幾萬位。在C 語言中定義的類型中精度最多只有二十多位,由于涉及到浮點(diǎn)型大數(shù)和負(fù)數(shù)的運(yùn)算,因而程序采取定義一個結(jié)構(gòu)體類型存貯的方式來存放大數(shù)符號、小數(shù)
15、點(diǎn)、整數(shù)部分、整數(shù)數(shù)位、小數(shù)部分、小數(shù)有效位數(shù)。在計(jì)算中會用到從高位開始計(jì)算,和從低位開始計(jì)算數(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四則運(yùn)算算法在大數(shù)四則運(yùn)算的程序設(shè)計(jì)中,每一部分都會調(diào)用一些其他其它函數(shù)來輔助完成運(yùn)算(例如:對結(jié)構(gòu)體變量的初始化,比較兩個數(shù)的大小, 將字符型數(shù)據(jù)轉(zhuǎn)換成結(jié)構(gòu)體類型數(shù)
16、據(jù)和將結(jié)構(gòu)體類型數(shù)據(jù)轉(zhuǎn)換成字符型數(shù)據(jù)等),在這里主要說明四則運(yùn)算的程序設(shè)計(jì),其它函數(shù)的程序設(shè)計(jì)和具體調(diào)用關(guān)系請查看程序清單。加法運(yùn)算的實(shí)現(xiàn)加法計(jì)算還是比較容易實(shí)現(xiàn)的,對于整數(shù)部分的計(jì)算,以整數(shù)部分位數(shù)長的作為循環(huán)變量, 先從低位算起, 因?yàn)橹豁氁獙?yīng)的位相加 (相加結(jié)果小于20),再加上前一位的進(jìn)位,再判斷本位是否有進(jìn)位,把進(jìn)位值改為本位除以它的權(quán)(也就是10)取整(既有進(jìn)位時,給進(jìn)位賦值1,如果沒有進(jìn)位,則給進(jìn)位賦值 0),然后把本位數(shù)字改為本位除以它的權(quán)(也就是10)取余。圖 2 加法運(yùn)算原理圖對于加法運(yùn)算中小數(shù)部分的計(jì)算,也是從低位算起,以小數(shù)部分位數(shù)長作為循環(huán)變量,相加的原理跟整數(shù)部分
17、一樣。在程序中設(shè)計(jì)時應(yīng)注意:1以上加法運(yùn)算的原理只針對兩個符號位相同的大數(shù)相加,如果是異號相加則要調(diào)用減法運(yùn)算模塊;2 結(jié)束循環(huán)時,不僅僅是最后一位加完就停止,還應(yīng)加入如果有進(jìn)位,也要再循環(huán)一次。如最后一位是9,進(jìn)位是 1,則相加時進(jìn)位,要加上進(jìn)位這一位值。具體看代碼。3 如果是兩個負(fù)數(shù)相加,最終結(jié)果還要加負(fù)號。減法運(yùn)算的實(shí)現(xiàn)由于使用結(jié)構(gòu)體類型來分別存儲了大數(shù)的整數(shù)及其位數(shù)、小數(shù)及其位數(shù)、符號(正、負(fù)),所以對于減法運(yùn)算的實(shí)現(xiàn)也是比較簡單的。對于整部部分,算法從低位開始減。首先判斷兩個數(shù)是否相等,如果相等則直接返回結(jié)果位0;否則要判斷減數(shù)和被減數(shù)那一個位數(shù)長,被減數(shù)位數(shù)長是正常減;減數(shù)位數(shù)長,
18、則減數(shù)減被減數(shù),最后還要加上負(fù)號。兩數(shù)位數(shù)長度相等時,比較哪一個數(shù)大,被數(shù)大則正常減;減數(shù)數(shù)大則減數(shù)減被減數(shù)。處理每一項(xiàng)時,如果前一位相減有借位,就先減去上一位的借位,無則不減,再去判斷是否能夠減開被減數(shù),如果減不開,就要借位后再去減,同時置借位為1,否則置借位為0。圖 3 減法運(yùn)算原理圖對于減法運(yùn)算中小數(shù)部分的計(jì)算,也是從低位算起,減法原理跟整數(shù)部分一樣。在程序設(shè)計(jì)時應(yīng)注意:1 兩個浮點(diǎn)型數(shù)的減法運(yùn)算是從小數(shù)部分開始的,當(dāng)小數(shù)部分計(jì)算完了才開始計(jì)算整數(shù)部分;而計(jì)算整數(shù)部分的時候還要判斷小數(shù)部分的計(jì)算是否有向整數(shù)部分借位。2 以上減法運(yùn)算的原理只針對兩個符號位相同的大數(shù)相減,如果是異號相減則要
19、調(diào)用加法運(yùn)算模塊。乘法運(yùn)算的實(shí)現(xiàn)首先說一下乘法計(jì)算的算法,從低位向高位乘,在豎式計(jì)算中,我們是將乘數(shù)第一位與被乘數(shù)的每一位相乘,記錄結(jié)果,之后,用第二位相乘,記錄結(jié)果并 且左移一位,以此類推,直到計(jì)算完最后一位,再將各項(xiàng)結(jié)果相加。得出最后結(jié)果。當(dāng)然我們可以直接用這種方法,但要用多個結(jié)構(gòu)體變量來保存計(jì)算出的分結(jié)果,之后結(jié)果再相加得到最后結(jié)果,但是這樣會浪費(fèi)很多空間;因此,可以再優(yōu)化一下,就是只用兩個結(jié)構(gòu)體變量來表示結(jié)果,先把第一位乘數(shù)與被乘數(shù)的結(jié)果保存在第一個結(jié)構(gòu)體變量中,然后將此次分結(jié)果與第二個結(jié)構(gòu)體變量中的數(shù)相加并將結(jié)果保存于第二個結(jié)構(gòu)體變量中;在進(jìn)行下一次相乘,第二位乘數(shù)與被乘數(shù)結(jié)果存在第
20、一個結(jié)構(gòu)體變量中,再與第二個結(jié)構(gòu)體變量中保留的累加結(jié)果相加。以此類推,直到結(jié)束。這樣就可以用兩個結(jié)構(gòu)體變量來存儲相乘后的結(jié)果并節(jié)省了一些空間。圖 4 乘法運(yùn)算原理圖在程序設(shè)計(jì)時應(yīng)注意:1兩個浮點(diǎn)型數(shù)的乘法運(yùn)算是先將浮點(diǎn)型數(shù)轉(zhuǎn)換成整型數(shù),再從低位開始計(jì)算,當(dāng)計(jì)算完后了還要將整型結(jié)果轉(zhuǎn)換成浮點(diǎn)型結(jié)果。2 兩個異號大數(shù)相乘時,結(jié)果要加上負(fù)號。3將各分結(jié)果相加時,直接調(diào)用加法運(yùn)算函數(shù)即可。除法運(yùn)算的實(shí)現(xiàn)首先次除法運(yùn)算所要得到的結(jié)果,當(dāng)被除數(shù)除不開除數(shù)時,被除數(shù)補(bǔ)零繼續(xù)向下除,一直除到規(guī)定的小數(shù)位數(shù)。從高位向低位減,減時以被除數(shù)長度為單位,從高位取出大于被除數(shù)的字符串(被除數(shù)),然后將原除數(shù)乘以一個權(quán)值
21、(小于10)得到一個不大于被除數(shù)的新的被除數(shù),再用被除數(shù)減去新的除數(shù),權(quán)值既為結(jié)果,余數(shù)從剩下的被除數(shù)高位再取出幾位做補(bǔ)位,如此類推,循環(huán)減。最終,將相應(yīng)的小數(shù)結(jié)果返回。圖 5 除法運(yùn)算原理圖在程序設(shè)計(jì)時應(yīng)注意 :1上述除法原理是從兩個整型數(shù)相除的角度來說明的。當(dāng)兩個大數(shù)中有浮點(diǎn)型數(shù)時,要先將小數(shù)轉(zhuǎn)換成整數(shù)再進(jìn)行除法運(yùn)算,運(yùn)算完畢后,還要將最后的結(jié)果轉(zhuǎn)換成相對應(yīng)得小數(shù)結(jié)果。2減數(shù)(亦即除數(shù))乘上一個權(quán)值后不能大于被減數(shù)(亦即被除數(shù))。3乘以一個權(quán)值時,可直接調(diào)用乘法運(yùn)算函數(shù)即可;循環(huán)相減時,可直接調(diào)用減法運(yùn)算函數(shù)即可。3.3函數(shù)調(diào)用關(guān)系圖此函數(shù)調(diào)用關(guān)系圖以 dos 版本應(yīng)用程序來進(jìn)行說明。此函
22、數(shù)調(diào)用關(guān)系圖主要描述了四則運(yùn)算的實(shí)現(xiàn)及實(shí)現(xiàn)各運(yùn)算所要調(diào)用的函數(shù),詳情還請看程序清單。圖 6 函數(shù)調(diào)用關(guān)系圖4 調(diào)試分析表 1 調(diào)試過程情況表序時間出現(xiàn)問題號1做減法時由于沒有考慮到 a<b 的情況,出現(xiàn)了輸出結(jié)果錯誤的情況2減法輸出結(jié)果中測試到,當(dāng)高位的值相減為0 時,也是把 0 給輸出3乘法運(yùn)算編程算法是逐個轉(zhuǎn)化為數(shù)字, 進(jìn)行整型運(yùn)算,結(jié)果存儲很麻煩,需要多次進(jìn)行加法運(yùn)算,還要進(jìn)行移位運(yùn)算,使數(shù)字的相加位一致。4乘法結(jié)果 c 的存儲大小沒考慮到最大的進(jìn)位,只是考慮了最高的進(jìn)位不大于 9,沒有考慮到進(jìn)位大于 10 的情況,導(dǎo)致溢出位沒有輸出,結(jié)果錯誤。5對于除法,結(jié)果輸出的時候也是遇到了
23、與減法運(yùn)算時,沒有清零的情況6除法參考別人的算法,發(fā)現(xiàn)當(dāng)輸入的大整數(shù)a<b 時,商為空7一次輸入兩個大整數(shù)只能運(yùn)算一次,發(fā)現(xiàn)很麻煩8可以重復(fù)輸入下一次的大整數(shù),但是屏幕上的東西太多了,但是一次清理就會使屏幕清空,不能做下一次的運(yùn)解決方法將減法分成三部分,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 中。(運(yùn)算方法在詳細(xì)設(shè)計(jì)的乘法中給出。 )對于乘法的進(jìn)位,最大的不會超過 99,但有會有超過 10 的情況,所以存放結(jié)果的 c 的大小應(yīng)該為兩個大整數(shù)的個數(shù)的和加上 2,當(dāng)進(jìn)位沒達(dá)到 c0 時,則將這些位置為 0 ,在進(jìn)行結(jié)果輸出。參考減法運(yùn)算的算法,將商的無效的 0將除法的情況也分為兩種:a>=b,a<b;當(dāng) a<b 時將商賦值為 0,然后將 a 作為余數(shù)也一并輸出。用 for 語句將四個運(yùn)算符加入里面,用第二次輸入來判斷運(yùn)算,只有當(dāng)運(yùn)算符不是四個中的一個時才跳出到下一次運(yùn)算輸入。用一個
25、while (1)一個永真語句進(jìn)入一個循環(huán),在循環(huán)的開始就設(shè)置清屏語句 system("cls"); 然后輸入是否選擇是否進(jìn)入計(jì)算系統(tǒng),不進(jìn)入的話就跳出循環(huán),結(jié)算。束執(zhí)行。9在輸入運(yùn)算選擇符時用 getch()輸入就沒出現(xiàn)內(nèi)存問一開始用了 scanf (), 題,但是同時使用者也不知道自發(fā)現(xiàn)會導(dǎo)致內(nèi)存己輸入的是什么選擇符,再使用written 出錯一個 pirntf (),將輸入的字符顯示出來。10在輸入大整數(shù)運(yùn)算后,將輸入的兩個數(shù)再次初始化,復(fù)進(jìn)入到多重運(yùn)算符多制到另外的兩個數(shù)組中,并顯示次操作的時候,結(jié)果會出來運(yùn)算的兩個數(shù),發(fā)現(xiàn)沒有問出現(xiàn)亂碼。題了。11再進(jìn)行結(jié)果的測試
26、的詢問了別人,原來不但要將進(jìn)行過程中又再次出現(xiàn)結(jié)計(jì)算的兩個數(shù)進(jìn)行初始化,還要果為亂碼的情況。將存儲結(jié)果的數(shù)組 c 一并清空,將 ci 的每一位都賦值為空。5 用戶使用說明分兩部分來分別說明dos 版本應(yīng)用程序的操作和windows 版本應(yīng)用程序的操作:5.1 dos版本應(yīng)用程序操作說明(1)運(yùn)行 DosBigMath.exe 應(yīng)用程序后會出現(xiàn)主界面;(2)選擇所要做的運(yùn)算,按下回車鍵;( 3)輸入第一個操作數(shù),按下回車界;( 4)再輸入第二個操作數(shù),按下回車,顯示結(jié)果。5.2 windows 版本應(yīng)用程序操作說明(1)運(yùn)行 WinBigMath.exe 應(yīng)用程序后會出現(xiàn)主界面:圖 7 主界面效
27、果圖圖 8 運(yùn)行效果圖(2)按下數(shù)字鍵( 09)在輸入框A 中輸入第一個大數(shù),如果發(fā)現(xiàn)按錯數(shù)字鍵可按“退格”鍵從后往前一個一個地刪除;然后按下“+”“- ”“ * ”“”鍵,自動切換到 B 輸入框,按下數(shù)字鍵( 09)輸入第二個大數(shù) ,同樣,如果發(fā)現(xiàn)按錯數(shù)字鍵可按“退格”鍵從后往前一個一個地刪除;最后按下“=”鍵,輸出顯示運(yùn)算結(jié)果并顯示運(yùn)算時間;( 3)如果在按下運(yùn)算符按鍵后發(fā)現(xiàn)第一個輸入有錯,則可再按一次同樣的運(yùn)算符按鍵,就自動切換到輸入框 A,這是按下“退格”鍵可從后往前一個一個地刪除。6 測試結(jié)果6.1 dos版本應(yīng)用程序測試結(jié)果:圖 9 dos 版本測試結(jié)果圖6.2 windows 版
28、本應(yīng)用程序測試結(jié)果:圖 10 windows 版本測試結(jié)果圖參考文獻(xiàn)1 陳元春,王中華等 . 實(shí)用數(shù)據(jù)結(jié)構(gòu) M. 北京:中國鐵道出版社, 2003.18-40.附錄:程序清單本程序設(shè)計(jì)由三部分組成(“ BigMath.c”,“ BigMath.c ” ):* BigMath.;char intpartINT_BIT_MAX;char floatpartFLOAT_BIT_MAX;符號整數(shù)部分小數(shù)部分 BigNum;算術(shù)函數(shù)指針類型.typedefvoid(*PFNCALC)(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);計(jì)時開始void S
29、tartCount();計(jì)時結(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ù)點(diǎn) ,deta=0 不移動 ,deta<0 往左移動 ,deta>0 往右移動 .void MoveFloatPoint(BigNum *pNum,intdeta);使無窮大void MakeInfinite(BigNum *pNum);根據(jù)算術(shù)函數(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ù)點(diǎn),deta>0則向右移動小數(shù)點(diǎn)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='-')如果是負(fù)數(shù)arr+;pNum->sign=1;point=strchr(arr,'.');if (point)找到小數(shù)點(diǎn)intn=pNum->intbits=point-arr;while (n)整數(shù)數(shù)位不 =0則循環(huán)計(jì)算出整數(shù)數(shù)位pNum->intpartpNum->intbits-n=arrn-1-'0' ;將數(shù)字低位存在低下標(biāo)元素n-;while (*+point)pNum->floatpartpNum->floatbits=*p
38、oint-'0' ;pNum->floatbits+;else說明沒寫小數(shù)點(diǎn), 全是整數(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)如果是負(fù)數(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ù)函數(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 是負(fù)數(shù)return1;>elseif (pn1->sign!=0&&pn2->sign=0)pn1 是負(fù)數(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;進(jìn)位值inti,j;StartCount();計(jì)時開始for (i=maxfloatbi
47、ts-1;i>=0;i-)intvalue=pn1->floatparti+pn2->floatparti+addbit;addbit=value10;看看是否超過.設(shè)置進(jìn)位值pRes->floatparti=value%10;pRes->floatbits=maxfloatbits;到此 , 小數(shù)部分計(jì)算完畢.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)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年證件分揀機(jī)項(xiàng)目資金需求報(bào)告
- 項(xiàng)目工程后期服務(wù)總結(jié)報(bào)告-文書模板
- 《高級財(cái)務(wù)管理教程》課件
- 技術(shù)投資(合作)協(xié)議(30篇)
- 湖北6·15一般蒸汽爆炸事故調(diào)查報(bào)告
- 學(xué)年第一學(xué)期工作總結(jié)(26篇)
- 陜西省咸陽市涇陽縣2023-2024學(xué)年八年級上學(xué)期期末考試數(shù)學(xué)試卷(含解析)
- 高考一輪歷史總復(fù)習(xí)人教版必修1第八單元
- 《保險(xiǎn)的本質(zhì)》課件
- 《數(shù)字集成電路》課件
- 2019第五版新版PFMEA-注塑實(shí)例
- 《中國民間故事》整本書閱讀交流展示課課件(完美版)小學(xué)語文五年級必讀書目快樂讀書吧
- 相聲劇本大全相聲劇本范文 3篇
- 環(huán)境的清潔與消毒及消毒藥械一次性使用醫(yī)療用品管理課件
- 六年級數(shù)學(xué)上冊典型例題系列之期中復(fù)習(xí)應(yīng)用題部分(解析版)
- 35千伏輸電線路施工方案
- 新團(tuán)員入團(tuán)儀式PPT模板
- 八年級歷史上冊教案:第16課 毛澤東開辟井岡山道路
- 優(yōu)質(zhì)下落市政排水檢查井滲水率qc結(jié)果全國教學(xué)課件
- 好書推薦玫瑰與教育
- 合作意向協(xié)議
評論
0/150
提交評論