c實(shí)現(xiàn)任意長整數(shù)的四則運(yùn)算_第1頁
c實(shí)現(xiàn)任意長整數(shù)的四則運(yùn)算_第2頁
c實(shí)現(xiàn)任意長整數(shù)的四則運(yùn)算_第3頁
c實(shí)現(xiàn)任意長整數(shù)的四則運(yùn)算_第4頁
c實(shí)現(xiàn)任意長整數(shù)的四則運(yùn)算_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)題目:設(shè)計(jì)一數(shù)據(jù)結(jié)構(gòu)可處理任意長度的整數(shù)概要設(shè)計(jì)1.數(shù)據(jù)結(jié)構(gòu)的定義采用雙向鏈表存儲任意長整數(shù)。雙向鏈表的定義如下:class dbllist private: dblnode *head, *tail; dblnode *current; int sign; public: dbllist(); /構(gòu)造函數(shù)dbllist(); /析構(gòu)函數(shù)bool creatlist(string); /生成一個(gè)雙向鏈表,存儲整數(shù)int getcount(); /獲取整數(shù)的長度void insert(dblnode *); /從表尾插入一個(gè)結(jié)點(diǎn)void insertfront(dblnode *); /從表

2、頭插入void clear(); /清除該鏈表void operator+(dbllist &); /實(shí)現(xiàn)兩個(gè)任意整數(shù)的加法void operator*(dbllist &); /實(shí)現(xiàn)兩個(gè)任意整數(shù)的乘法dbllist & operator=(dbllist &); /重載賦值運(yùn)算符int compare(dbllist &); /兩個(gè)整數(shù)的絕對值比較void display(); /任意長度整數(shù)的標(biāo)準(zhǔn)化輸出;說明: 數(shù)據(jù)的存儲,無外乎順序或者鏈表。順序存儲時(shí),定義數(shù)組無法實(shí)現(xiàn)任意長度,而且需要預(yù)設(shè)一個(gè)maxsize,不是特別的方便。所以采用鏈?zhǔn)酱鎯Ψ绞健?/p>

3、而且任意長數(shù)據(jù)通過字符串輸入。在鏈表的每一個(gè)結(jié)點(diǎn)中, 數(shù)據(jù)域是在該數(shù)位上的數(shù)字大小。2主要功能模塊的功能任意長整數(shù)的輸入任意長整數(shù)的標(biāo)準(zhǔn)化輸出兩個(gè)整數(shù)的加法兩個(gè)整數(shù)的乘法三詳細(xì)設(shè)計(jì)(主模塊流程圖)五、使用說明及測試結(jié)果1. 使用說明:點(diǎn)擊打開應(yīng)用程序pro1.exe 。依次輸入任意兩個(gè)整數(shù) (例如 123456,+1234567) ,按回車,會出現(xiàn)菜單,如下圖:按1則實(shí)現(xiàn)兩整數(shù)的加法按2則實(shí)現(xiàn)兩整數(shù)的乘法按#結(jié)束注:菜單可重復(fù)出現(xiàn)直至#退出。實(shí)現(xiàn)加法,乘法如下圖:2.測試結(jié)果:(1) 123456 (2) +1234567 (3) -987654321 (4) 12a3 (5) + 注:當(dāng)輸入

4、錯(cuò)誤時(shí),允許重新輸入。六、源程序/* 主函數(shù)*/ /*/ #include cal.h void main() string s; string p; dbllist list1; while(1) /輸入錯(cuò)誤時(shí),允許重新輸入coutinput num1s; bool ok1=list1.creatlist(s); if (!ok1) couterror!endl; else coutnum1:; list1.display(); break; dbllist list2; while(1) coutinput num2:p; bool ok2=list2.creatlist(p); if (

5、!ok2) couterror!endl; else coutnum2:; list2.display(); break; string choose; while (1) cout 請選擇運(yùn)算法:endl; cout-endl; /*菜單 */ cout|1.num1+num2 |endl; /*可以重復(fù)輸入運(yùn)算符,按#退出 */ cout|2.num1*num2 |endl; cout|#.exit |endl; cout-choose; if (choose=1) list1+list2; break; else if (choose=2) list1*list2; break; els

6、e if (choose=#) return; else cout輸入有誤,請重新輸入!endl; continue; /*頭文件,包括長整數(shù)數(shù)據(jù)結(jié)構(gòu)的定義,成員函數(shù)的定義*/ /*/ #include #include #include using namespace std; struct dblnode int data; dblnode * prior; dblnode * next; ; bool isnum(char a) /判斷字符a 是否是便是數(shù)字int s=a-0; if(s=0&s=1&snext=null; head-prior=null; tail=he

7、ad; current=null; sign=0; dbllist:dbllist() /析構(gòu)函數(shù)while (head-next!=null) current=head-next; head-next=current-next; delete current; current=null; sign=0; delete head; head=null; tail=null; int dbllist:getcount() /返回該數(shù)字的長度(不包括符號位)current=head-next; int count=0; while (current) count+; current=current

8、-next; current=null; return count; void dbllist:insert(dblnode *p) /從鏈表尾部插入一個(gè)結(jié)點(diǎn)tail-next=p; p-prior=tail; tail=p; void dbllist:insertfront(dblnode *q) /從鏈表頭部插入一個(gè)結(jié)點(diǎn)if (head-next=null) head-next=q; q-prior=head; tail=q; else q-next=head-next; head-next-prior=q; head-next=q; q-prior=head; bool dbllist:

9、creatlist(string s) /輸入的任意長度的表示數(shù)字的字符串bool j=isint(s); /以此生成雙向鏈表if (!j) return j; else int i=0; sign=judsign(s); if (s0=+|s0=-) i+; while (si!=0) int ia=ctoi(si); current=new dblnode(); current-data=ia; current-next=null; current-prior=null; insert(current); i+; current=null; return true; void dbllis

10、t:clear() while (head-next) current=head-next; head-next=current-next; delete current; tail=head; sign=0; current=null; int dbllist:compare(dbllist & s) /任意兩個(gè)長度數(shù)字絕對值比較int a=getcount(); int b=s.getcount(); if (ab) return 1; else if (anext; s.current=s.head-next; while (current!=null) int re=curre

11、nt-data-s.current-data; if (re0) return 1; else if (renext; s.current=s.current-next; current=null; s.current=null; return 0; dbllist & dbllist:operator =(dbllist &s) clear(); sign=s.sign; s.current=s.head-next; while (s.current!=null) current=new dblnode(); current-data=s.current-data; inse

12、rt(current); s.current=s.current-next; s.current=null; current=null; return *this; void dbllist:operator +(dbllist & s) /實(shí)現(xiàn)加法(包括減法)dbllist temp; int da; int f=0; int si=compare(s); if (si=0&(sign+s.sign=0) temp.sign=0; else if (si=0) temp.sign=sign; else if(si0) temp.sign=sign; else temp.sig

13、n=s.sign; current=tail; s.current=s.tail; while (1) if (current=head&s.current=s.head) if (f) da=f; temp.current=new dblnode(); temp.current-data=f; temp.insertfront(temp.current); if (!f) break; f=0; else if (current!=head&s.current=s.head) temp.current=new dblnode(); temp.current-data=curr

14、ent-data+f; temp.insertfront(temp.current); current=current-prior; f=0; else if (current=head&s.current!=s.head) temp.current=new dblnode(); temp.current-data=s.current-data+f; temp.insertfront(temp.current); s.current=s.current-prior; f=0; else da=current-data*sign+s.current-data*s.sign+f; if (

15、da*temp.sign=10) da=da-10*temp.sign; f=temp.sign; else if (da*temp.signnext=null; temp.current-data=abs(da); temp.insertfront(temp.current); current=current-prior; s.current=s.current-prior; current=null; s.current=null; temp.current=temp.head-next; if (temp.current!=null) while (temp.current-data=0

16、) temp.head-next=temp.current-next; delete temp.current; temp.current=temp.head-next; temp.current=null; coutnum1+num2=; temp.display(); void dbllist:operator*(dbllist & s) /實(shí)現(xiàn)乘法int cf=0; int ans; int i,j; int count=0; dbllist temp; temp.sign=sign*s.sign; int a1=getcount(); int a2=s.getcount();

17、int a=a1+a2; for (i=0;idata=0; temp.current-next=null; temp.current-prior=null; temp.insertfront(temp.current); s.current=s.tail; while (s.current!=s.head) current=tail; temp.current=temp.tail; for (i=0;iprior; for(j=0;jdata*current-data+temp.current-data+cf; temp.current-data=ans%10; cf=ans/10; current=current-prior; temp.current=temp.current-prior; if (cf!=0) temp.current-data=temp.current-data+cf; cf=0; s.current=s.current-prior; temp.current=temp.tail; count+; if(temp.head-next-data=0) temp.current=temp.head-next; temp.head-next=temp.current-next; delete temp.current; temp.cur

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論