數(shù)據(jù)結(jié)構(gòu)長(zhǎng)整數(shù)四則運(yùn)算_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)長(zhǎng)整數(shù)四則運(yùn)算_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)長(zhǎng)整數(shù)四則運(yùn)算_第3頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)習(xí) 1 1.4 長(zhǎng)整數(shù)四那么運(yùn)算 實(shí)習(xí)報(bào)告 題目: 設(shè)計(jì)一個(gè)實(shí)現(xiàn)任意長(zhǎng)的整數(shù)進(jìn)行加法運(yùn)算的演示程序。一、 需求分析1. 本演示程序中, 利用雙向循環(huán)鏈表實(shí)現(xiàn)長(zhǎng)整數(shù)的存儲(chǔ), 每個(gè)結(jié)點(diǎn)含一個(gè)整型變量任何整型 變量的范圍是 - 215-1 215-1 。在每個(gè)結(jié)點(diǎn)中僅存十進(jìn)制數(shù)的 4位,即不超過(guò) 9999 的非負(fù)整數(shù), 整個(gè)鏈表表示為萬(wàn)進(jìn)制數(shù)。 輸入和輸出形式按中國(guó)對(duì)于長(zhǎng)整數(shù)的習(xí)慣, 每四位 一組,組間用逗號(hào)隔開(kāi)。2. 演示程序以用戶和計(jì)算機(jī)的對(duì)話方式執(zhí)行,即在計(jì)算機(jī)終端上顯示“提示信息之后, 由用戶在鍵盤上輸入演示程序中規(guī)定的運(yùn)算命令; 相應(yīng)的輸入數(shù)據(jù) 濾去輸入數(shù)據(jù)中的非法 字符和運(yùn)算結(jié)果顯示在

2、其后。3. 程序執(zhí)行的命令包括:1構(gòu)造鏈表; 2輸入數(shù)據(jù); 3數(shù)據(jù)處理; 4結(jié)束4. 測(cè)試數(shù)據(jù)1) 0; 0;應(yīng)輸出 0。2) -2345,6789 ; -7654,3211 ;應(yīng)輸出 -1,0000,0000.3) -9999,9999 ; 1,0000,0000,0000 ;應(yīng)輸出 9999,0000,00014) 1,0001,0001 ;-1,0001,0001 ;應(yīng)輸出 0。5) 1,0001,0001 ;-1,0001,0000 ;應(yīng)輸出 1.6)-9999,9999,9999; -9999,9999,9999 ;應(yīng)輸出 -1,9999,9999,99987)1,0000,9999

3、,9999; 1;應(yīng)輸出 1,0001,0000,0000概要設(shè)計(jì)struct LinkNode /定義結(jié)構(gòu)體 LinkNodeint data; /LinkNode *next;/LinkNode *pre;/記錄每個(gè)節(jié)點(diǎn)的整數(shù)小于 10000記錄下一個(gè)節(jié)點(diǎn)的地址記錄前一個(gè)節(jié)點(diǎn)的地址;class LinkList /定義類 LinkListprivate:LinkNode *head0,*head1; /head0, head1 分別記錄兩個(gè)整數(shù)鏈表的頭指針public:LinkList();/LinkList();/void Creat(string a); / void Add();/L

4、inkNode *currptr;記錄結(jié)果鏈表的頭指針LinkNode *result; /result構(gòu)造函數(shù),初始化鏈表析構(gòu)函數(shù),釋放空間 引入字符串,創(chuàng)立兩個(gè)鏈表,分別表示兩個(gè)整數(shù) 實(shí)現(xiàn)兩個(gè)整數(shù)相加void Display(); /顯示結(jié)果void addtwo(); /節(jié)點(diǎn)多的作為被加數(shù),少的作為加數(shù),實(shí)現(xiàn)整 / 數(shù)絕對(duì)值大的加小的;void main() / 主函數(shù)do while(Yes_No='y'|Yes_No='Y'); /Yes_No不等于 'Y' 或 'y' 時(shí),程序退出三、詳細(xì)設(shè)計(jì) #include<

5、iostream> #include<string> #include<math.h> using namespace std; struct LinkNode int data; / LinkNode *next; /記錄每個(gè)節(jié)點(diǎn)的整數(shù)小于 10000記錄下一個(gè)節(jié)點(diǎn)的地址LinkNode *pre;/記錄前一個(gè)節(jié)點(diǎn)的地址;class LinkListprivate:LinkNode *head0,*head1; /head0, head1 分別記錄兩個(gè)整數(shù)鏈表的頭指針LinkNode *currptr;LinkNode *result; /result記錄結(jié)果鏈

6、表的頭指針public:LinkList();/LinkList();/void Creat(string a); / void Add();/void Display();/void addtwo();/構(gòu)造函數(shù),初始化鏈表析構(gòu)函數(shù),釋放空間 引入字符串,創(chuàng)立兩個(gè)鏈表,分別表示兩個(gè)整數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)相加顯示結(jié)果 節(jié)點(diǎn)多的作為被加數(shù),少的作為加數(shù),實(shí)現(xiàn)整 / 大的加小的數(shù)絕對(duì)值;/ 鏈表的實(shí)現(xiàn)局部int sum(int n);LinkList:LinkList() /構(gòu)造函數(shù),初始化鏈表head0=new LinkNode;/ 申請(qǐng)一個(gè)空間記錄整數(shù)的符號(hào)和節(jié)點(diǎn)數(shù)head1=new LinkNod

7、e;head0->next=head0;初始化鏈表,建立雙向循環(huán)鏈表head0->pre=head0; /head1->next=head1;head1->pre=head1;result=new LinkNode;result->next=result;result->pre=result;currptr=NULL;LinkList:LinkList() / 析構(gòu)函數(shù),釋放空間LinkNode *p1=head0,*p2=head1,*p3=result;/ 三個(gè)指針?lè)謩e指向三條鏈表的頭指針while(p1!=p1->pre)p1->pre-&

8、gt;next=p1->next;p1->next->pre=p1->pre;currptr=p1;p1=p1->next;delete currptr;while(p2!=p2->pre) / 逐個(gè)刪除節(jié)點(diǎn),釋放空間 p2->pre->next=p2->next;p2->next->pre=p2->pre;currptr=p2;p2=p2->next;delete currptr;while(p3!=p3->pre)p3->pre->next=p3->next;p3->next->

9、;pre=p3->pre;currptr=p3;p3=p3->next;delete currptr;/ delete p1;/ delete p2;/ delete p3;void LinkList:Creat(string a) /int i=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0;/i 記錄字符串, j 記錄加數(shù)節(jié)點(diǎn)數(shù);/w 標(biāo)記字符串中的 - '號(hào)/k 記錄字符串中的字符轉(zhuǎn)化為整數(shù)的值, while(am!='') m+;/mn=m;while(an!='0') n+;/nif(a0='-')hea

10、d0->data=(-1); /w=1;elsehead0->data=1;for(i=m-1;i>=w;i-)引入字符串,創(chuàng)立兩/ 個(gè)鏈表,分別表示兩個(gè)整數(shù)s 記錄被加數(shù)節(jié)點(diǎn)數(shù)l 使每個(gè)節(jié)點(diǎn)記錄 4 位記錄字符串中被加數(shù)的字符數(shù)記錄字符串的總字符數(shù)記錄整數(shù)符號(hào)if(ai!=',')/把字符轉(zhuǎn)化為整數(shù)k+=(ai-'0')*sum(l);l+;if(ai=','|i=w)currptr=new LinkNode;/currptr->data=k;currptr->next=head0;currptr->pre=

11、head0->pre;head0->pre->next=currptr;head0->pre=currptr;head0=currptr;s+;/k=0;/l=0;head0->pre->data*=s; /把整數(shù)存到雙向循環(huán)鏈表中節(jié)點(diǎn)數(shù)加 1 重新初始化 k 和 l存儲(chǔ)整數(shù)符號(hào)和節(jié)點(diǎn)數(shù)/ 與建第一個(gè)整數(shù)鏈表一樣,建立第二個(gè)整數(shù)鏈表 head1 k=0;l=0;if(am+1='-')head1->data=(-1);m+;else head1->data=1;for(i=n-1;i>m;i-)if(ai!=',&#

12、39;)k+=(ai-'0')*sum(l);l+;if(ai=','|i=m+1)currptr=new LinkNode;currptr->data=k;currptr->next=head1;currptr->pre=head1->pre;head1->pre->next=currptr;head1->pre=currptr;head1=currptr;j+;k=0;l=0;head1->pre->data*=j;實(shí)現(xiàn)兩個(gè)整數(shù)相加void LinkList:Add() /LinkNode *temp;i

13、f(abs(head0->pre->data)>abs(head1->pre->data)/ 兩個(gè)整數(shù)中,絕對(duì)值大的為被加數(shù) addtwo();else if(abs(head0->pre->data)<abs(head1->pre->data)temp=head0;head0=head1;head1=temp;addtwo();else if(abs(head0->pre->data)=abs(head1->pre->data)int k1,k2;LinkNode *p=head0,*q=head1;/ 如果

14、節(jié)點(diǎn)數(shù)相同,那么判斷節(jié)點(diǎn)中數(shù)值大小while(p->data=q->data&&p!=head0->pre->pre&&q!=head1->pre->pre)p=p->next;q=q->next;k1=p->data;k2=q->data;if(k1>k2)addtwo();elsetemp=head0;head0=head1;head1=temp;addtwo();void LinkList:addtwo()/ 節(jié)點(diǎn)多的作為被加數(shù),少的作為加數(shù),實(shí)現(xiàn)整數(shù)絕對(duì)值大的加小的/ 默認(rèn) head0 存

15、的整數(shù)絕對(duì)值比 head1 大int s=0,m1=head0->data,m2=head1->data;m1=(head0->pre->data/abs(head0->pre->data);/head0的符號(hào)m2=(head1->pre->data/abs(head1->pre->data);/head1的符號(hào)LinkNode *p=head0->pre->pre,*q=head1->pre->pre;result->data=head0->pre->data; / 存結(jié)果的節(jié)點(diǎn)數(shù)和符號(hào) w

16、hile(q!=head1->pre)/head0 存的整數(shù)絕對(duì)值比 head1 大,即 head0 的節(jié)點(diǎn)數(shù)大于或等于 head1/ 兩整數(shù)相加如果符號(hào)相同相加后超過(guò) 10000,那么進(jìn)位,不進(jìn)位currptr=new LinkNode;currptr->data=(p->data)*m1+(q->data)*m2+s;if(m1*m2)>0) /if(abs(currptr->data)-10000>=0) /s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;

17、else /abs(currptr->data)-10000<0s=0;currptr->data=abs(currptr->data);else if(m1>0&&m2<0)/ 符號(hào)不同,在此相當(dāng)于實(shí)現(xiàn)兩個(gè)正整數(shù)相減s=0;if(currptr->data<0) /小于 0 ,向前一位借 1currptr->data+=10000;s=-1;else if(m1<0&&m2>0)/ 符號(hào)不同,在此相當(dāng)于實(shí)現(xiàn)負(fù)整數(shù)加上正整數(shù)s=0;if(currptr->data>0) /大于 0 ,

18、currptr->data=10000-currptr->data;s=1;else currptr->data=abs(currptr->data);currptr->next=result; / 存入鏈表 currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;p=p->pre;q=q->pre;/ 當(dāng) head0 節(jié)點(diǎn)數(shù)比 head1 長(zhǎng)時(shí),繼續(xù)建鏈while(p!=head0->pre)curr

19、ptr=new LinkNode;currptr->data=p->data*m1+s;s=currptr->data/10000;if(m1*m2)>0)if(abs(currptr->data)-10000>=0)s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;else s=0;currptr->data=abs(currptr->data);else if(m1>0&&m2<0)s=0;if(currptr->dat

20、a<0)currptr->data+=10000;s=-1;else if(m1<0&&m2>0)s=0;if(currptr->data>0)currptr->data=10000-currptr->data;s=1;else currptr->data=abs(currptr->data);currptr->data=abs(currptr->data)%10000;currptr->next=result;currptr->pre=result->pre;result->pre

21、->next=currptr;result->pre=currptr;result=currptr;p=p->pre;if(s!=0) / 處理相加后,進(jìn)位問(wèn)題 currptr=new LinkNode; currptr->data=abs(s);currptr->next=result; currptr->pre=result->pre;result->pre->next=currptr; result->pre=currptr;result=currptr; result->pre->data=m1*(abs(resu

22、lt->pre->data)+1);void LinkList:Display()/顯示結(jié)果結(jié)果的符號(hào)LinkNode *p=result;int FuHao=result->pre->data/abs(result->pre->data);/ while(p->data=0&&p!=result->pre->pre)/ 當(dāng)運(yùn)算后前幾個(gè)節(jié)點(diǎn)的數(shù)據(jù)為 0 時(shí),不輸出p=p->next;result->pre->data=(abs(result->pre->data)-1)*FuHao;/ 結(jié)果記錄

23、非 0 節(jié)點(diǎn)數(shù)cout<<FuHao*p->data; / 首先顯示符號(hào)和第一個(gè)節(jié)點(diǎn)中的數(shù) if(abs(result->pre->data)!=1) p=p->next; /判斷非 0 節(jié)點(diǎn)數(shù)是否為 1while(p!=result->pre->pre) / 繼續(xù)輸出cout<<"," /每 4 位一組,并用, '隔開(kāi)cout.width(4);cout.fill('0');cout<<p->data;p=p->next;if(p=result->pre-&g

24、t;pre&&abs(result->pre->data)!=1)/ 顯示最后一個(gè)節(jié)點(diǎn)數(shù)據(jù)cout<<","cout.width(4);cout.fill('0');cout<<p->data;cout<<endl;int sum(int n) / 計(jì)算 10 的乘方int i,s=1;for(i=1;i<=n;i+)s=s*10;return s;/ 主函數(shù)和其他函數(shù)的實(shí)現(xiàn)void main() /主函數(shù)cout<<"*cout<<"*

25、歡送使用任意長(zhǎng)整數(shù)加法系統(tǒng) *n"cout<<"*cout<<"n"cout<<" 在此系統(tǒng)中,可以輸入任意長(zhǎng)的整數(shù) 。 |n" string ch;char Yes_No;docout<<"n"cout<<"|輸入形式為:/ * * *(-)*,*,*/ * * * *(-)*,*,*,*|n"cout<<" 即符號(hào) +數(shù),每 4 位加一個(gè) ',' ,兩個(gè)數(shù)之間用 '' 隔開(kāi) |n

26、" cout<<" 請(qǐng)輸入你要計(jì)算的兩個(gè)數(shù) : |n"cin>>ch;/輸入任意長(zhǎng)字符串LinkList List;/定義鏈表對(duì)象List.Creat(ch);/把字符串轉(zhuǎn)化為整數(shù),并存到鏈表中List.Add();/實(shí)現(xiàn)兩個(gè)整數(shù)相加List.Display();/輸出結(jié)果cout<<" 是否繼續(xù)計(jì)算 (Y/N):"/詢問(wèn)是否繼續(xù)計(jì)算cin>>Yes_No;不等于'Y'或'y'時(shí),程序退出while(Yes_No='y'|Yes_No='Y&

27、#39;); Yes_Nocout<<"*ncout<<*感謝使用本系統(tǒng)!*n"cout<<*n"四調(diào)試分析在設(shè)計(jì)初期采用 C語(yǔ)言設(shè)計(jì),在編譯上出現(xiàn)了好多問(wèn)題,導(dǎo)致了代碼利用率不高并且結(jié) 構(gòu)松散,進(jìn)而采用 C+勺思想,利用類之后,不僅代碼量減少,效率也提高了不少。在編譯 的時(shí)候,程序不能很好地檢測(cè)出輸入形式,如果輸入格式不正確,就不能很好地計(jì)算出正確結(jié)果,對(duì)于這一問(wèn)題,沒(méi)找到很好地解決方法??傮w來(lái)說(shuō),這個(gè)程序相對(duì)簡(jiǎn)單,但在指針的利用方面,編程的時(shí)候出現(xiàn)了一些問(wèn)題。經(jīng)過(guò)仔細(xì)檢查與屢次修改,成功的解決了指針問(wèn)題。五、用戶手冊(cè)1、本程序的運(yùn)行環(huán)境為 DOS操作系統(tǒng),執(zhí)行文件為長(zhǎng)整數(shù)四那么運(yùn)算.exe。2、進(jìn)入演示程序后即顯示文本方式的用戶界面:石'E:6Oe四那么運(yùn)算.exh*歡送使用任意股整數(shù)加法系纟充*;在此系統(tǒng)中,可以輸入任意長(zhǎng)的整數(shù).!輸 A.形式詢* *#*:<'>» *» *» «-*弊號(hào)搖 疑唯加一個(gè),宀 兩

溫馨提示

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

評(píng)論

0/150

提交評(píng)論