長(zhǎng)整數(shù)運(yùn)算說明書_第1頁
長(zhǎng)整數(shù)運(yùn)算說明書_第2頁
長(zhǎng)整數(shù)運(yùn)算說明書_第3頁
長(zhǎng)整數(shù)運(yùn)算說明書_第4頁
長(zhǎng)整數(shù)運(yùn)算說明書_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、目目 錄錄摘摘 要要1前前 言言21.采用類C語言定義相關(guān)的數(shù)據(jù)類型33 函數(shù)的調(diào)用關(guān)系圖164.調(diào)試分析165.測(cè)試結(jié)果176源程序(帶注釋)21總總 結(jié)結(jié)35參考文獻(xiàn)參考文獻(xiàn)37致致 謝謝38附件附件 部分源程序部分源程序代代碼碼391摘摘 要要該設(shè)計(jì)該設(shè)計(jì)要求學(xué)生要求學(xué)生設(shè)計(jì)設(shè)計(jì)程序,程序,實(shí)現(xiàn)實(shí)現(xiàn)兩個(gè)任意兩個(gè)任意長(zhǎng)長(zhǎng)的整數(shù)求和及差的運(yùn)算的整數(shù)求和及差的運(yùn)算問題問題。通。通過該題過該題目的目的設(shè)計(jì)過設(shè)計(jì)過程,可以加深理解程,可以加深理解線線性表的性表的邏輯結(jié)邏輯結(jié)構(gòu)、存構(gòu)、存儲(chǔ)結(jié)儲(chǔ)結(jié)構(gòu),掌握構(gòu),掌握線線性表性表上基本運(yùn)算的上基本運(yùn)算的實(shí)現(xiàn)實(shí)現(xiàn),進(jìn)進(jìn)一步理解和熟一步理解和熟練練掌握掌握課課

2、本中所學(xué)的各種數(shù)據(jù)本中所學(xué)的各種數(shù)據(jù)結(jié)結(jié)構(gòu),學(xué)會(huì)如構(gòu),學(xué)會(huì)如何把學(xué)到的知何把學(xué)到的知識(shí)識(shí)用于解決用于解決實(shí)際問題實(shí)際問題,培養(yǎng)學(xué)生的,培養(yǎng)學(xué)生的動(dòng)動(dòng)手能力。手能力。關(guān)鍵詞: 數(shù)據(jù)結(jié)構(gòu);長(zhǎng)整數(shù);運(yùn)算問題;C 語言2前前 言言在計(jì)算機(jī)及相關(guān)專業(yè)眾多的基礎(chǔ)課程里面,算法與數(shù)據(jù)結(jié)構(gòu)是基礎(chǔ)而又十分重要的課程。本學(xué)期開設(shè)的算法與數(shù)據(jù)結(jié)構(gòu)課程,在學(xué)習(xí)科目的第一節(jié)課起,張老師就為我們闡述了它的重要性。它對(duì)我們來說具有一定的難度。它是其它編程語言的一門基本學(xué)科。盡管不好學(xué),但是我們必須學(xué)好這門課程,這對(duì)于我們計(jì)算機(jī)專業(yè)的學(xué)生來說意義重大。經(jīng)過一個(gè)學(xué)期的理論知識(shí)的學(xué)習(xí),對(duì)于數(shù)據(jù)結(jié)構(gòu)相關(guān)的知識(shí)有了一定的了解。這是一

3、門純屬于設(shè)計(jì)的科目,它需用把理論變?yōu)樯蠙C(jī)調(diào)試和具體實(shí)踐。在課程結(jié)束之后。老師為我們安排了這次為期兩周的課程設(shè)計(jì)。目的就是讓我們自己在計(jì)算機(jī)上自己設(shè)計(jì)算法來實(shí)現(xiàn)相應(yīng)的功能以及鍛煉學(xué)生的動(dòng)手能力和實(shí)踐能力,最重要的是要把我們所學(xué)的數(shù)據(jù)結(jié)構(gòu)的理論知識(shí)應(yīng)運(yùn)到實(shí)踐中去。這次課程設(shè)計(jì)的題目是“長(zhǎng)整數(shù)運(yùn)算”,要求學(xué)生自己查閱相關(guān)資料,完成相應(yīng)的任務(wù),自己上機(jī)設(shè)計(jì)算法,調(diào)試程序,運(yùn)行出結(jié)果,以此來加深理解線性表、查找表的邏輯結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu),掌握查找、排序等基本運(yùn)算的實(shí)現(xiàn),進(jìn)一步理解和熟練掌握課本中所學(xué)的各種數(shù)據(jù)結(jié)構(gòu),學(xué)會(huì)如何把學(xué)到的知識(shí)用于解決實(shí)際問題,培養(yǎng)自己的動(dòng)手能力。3正正 文文1.1. 采用類采用類

4、c c 語言定義相關(guān)的數(shù)據(jù)類型語言定義相關(guān)的數(shù)據(jù)類型#include#includetypedef struct dnodeint data;/頭節(jié)點(diǎn)的 data 域保存數(shù)的正負(fù)。1 正,0 負(fù)。 struct dnode *prior,*next;dnode;dnode *r1,*r2,*head1,*head2,*head3;dnode *head_temp;dnode *creat()/表尾插入法產(chǎn)生一個(gè)帶頭節(jié)點(diǎn)的雙向循環(huán)鏈表,結(jié)果:表頭是高位,表尾是低位,返回頭指針dnode *head,*p,*s; int x,flag=1;/flag-是否繼續(xù)輸入的標(biāo)志head=(dnode*)m

5、alloc(sizeof(dnode);p=head;while(flag) scanf(%c);scanf(%d,&x);if(x=0&xdata=x;p-next=s;s-prior=p;p=s;4if(x=10000)/輸入過大,判錯(cuò) printf(input overflow); flag=0;return NULL;if(xprior=p;p-next=head;return head;/creat().checked!dnode *core_add(dnode *h1,dnode *h2)/部分加法-兩個(gè)正數(shù)相加。傳入兩個(gè)頭指針。返回結(jié)果:表頭是高位,表尾是低位,返

6、回頭指針int sum=0,inc=0;/inc=1 進(jìn)位,inc=0 不進(jìn)位dnode *p1,*p2,*p,*s,*h3;h3=(dnode*)malloc(sizeof(dnode);p=h3;/動(dòng)指針 pfor(p1=h1-prior,p2=h2-prior;(p1!=h1)&(p2!=h2);p1=p1-prior,p2=p2-prior)/從表尾開始,至某個(gè)指針(p1,p2)回到頭節(jié)點(diǎn)為止sum=p1-data+p2-data+inc;if(sum=10000)/進(jìn)位inc=1;sum-=10000;elseinc=0;s=(dnode*)malloc(sizeof(dno

7、de);s-data=sum;s-next=p;5p-prior=s;p=s;/表頭是高位,表尾是低位,建立結(jié)果鏈表/forif(p1=h1&p2=h2)/兩數(shù)節(jié)數(shù)相同if(!inc)/不進(jìn)位s-prior=h3;h3-next=s; return h3;/if(不進(jìn)位)else/進(jìn)位s=(dnode*)malloc(sizeof(dnode);s-data=1;s-next=p;p-prior=s;s-prior=h3;h3-next=s;return h3;/else/if(兩數(shù)節(jié)數(shù)相同)if(p1=h1)&(p2!=h2)/h1 加完,h2 有剩余段while(p2!=h

8、2)if(sum=p2-data+inc)10000)/進(jìn)位,只進(jìn)一次inc=1;sum-=10000;elseinc=0;s=(dnode*)malloc(sizeof(dnode);s-data=sum;s-next=p;p-prior=s;6p=s;p2=p2-prior;/while(p2!=h2)s-prior=h3;h3-next=s; return h3;/if(h1 加完,h2 有剩余段)if(p2=h2)&(p1!=h1)/h2 加完,h1 有剩余段while(p1!=h1)if(sum=p1-data+inc)=10000)/進(jìn)位,只進(jìn)一次inc=1;sum-=10

9、000;elseinc=0;s=(dnode*)malloc(sizeof(dnode);s-data=sum;s-next=p;p-prior=s;p=s;p1=p1-prior;/while(p1!=h1)s-prior=h3;h3-next=s; return h3;/if(h2 加完,h1 有剩余段)return NULL;/仍未出口就判錯(cuò)/core_add().checkeddnode *core_sub(dnode *h1,dnode *h2)/部分減法-大數(shù)減小數(shù)。傳入兩個(gè)頭指針。返回結(jié)果:表頭是高位,表尾是低位,返回頭指針dnode *p1,*p2,*p,*s,*h3;7int

10、 dec=0,resl=0;/dec 借位標(biāo)志,resl 暫存相減的結(jié)果h3=(dnode*)malloc(sizeof(dnode); p=h3;/動(dòng)指針 pfor(p1=h1-prior,p2=h2-prior;p2!=h2;p1=p1-prior,p2=p2-prior)/從 h1,h2 尾節(jié)點(diǎn)開始,至指針 p2 回到頭節(jié)點(diǎn)為止resl=(p1-data)-(p2-data)-dec;if(resldata=resl;s-next=p;p-prior=s;p=s;/for()if(p2=h2)&(p1=h2)/兩數(shù)的段數(shù)一樣s-prior=h3;h3-next=s;return

11、h3;/if(兩數(shù)的段數(shù)一樣)else/被減數(shù) h1 有剩余段while(p1!=h1)resl=p1-data-dec;if(resldata=resl;s-next=p;p-prior=s;p=s;p1=p1-prior;/while(p1!=h1)s-prior=h3;h3-next=s;return h3;/else(被減數(shù) h1 有剩余段)return NULL;/仍未出口就判錯(cuò)/core_sub().checkedint cmp(dnode *h1,dnode *h2)/比較絕對(duì)值的函數(shù)。|h1|h2|,返回 1;|h1|next)c1+;for(p2=h2;p2!=h2;p2=p

12、2-next)c2+;/先比較段數(shù)if(c1c2)return 1;if(c2c1)return -1;else/段數(shù)相同的情況下,從高位(頭)到低位(尾)逐段比較大小for(p1=h1-next,p2=p2-next;p1!=h1;p1=p1-next,p2=p2-next)if(p1-data=p2-data) continue;if(p1-data)(p2-data) return 1;9else return -1;return 0;/比到最后不分大小,就是一樣大/else/cmp().checkedvoid print(int data)/補(bǔ)零打印一個(gè)數(shù)。只被 display()調(diào)用

13、。if(data=1000)printf(%d,data);else if(data=100)printf(0%d,data);else if(data=10)printf(00%d,data);elseprintf(000%d,data);/print()void display(dnode *h)/顯示一個(gè)長(zhǎng)整數(shù)的數(shù)值部分,傳入的參數(shù)是頭指針dnode *p;p=h-next;/p 指頭while(p!=h-prior)/從高位到地位輸出長(zhǎng)整數(shù)print(p-data);printf(,);p=p-next;printf(%04d,p-data);printf(n);/display().

14、checkedvoid add(dnode *h1,dnode *h2)/加法,a+b=cdnode *h3;10int flag=0;if(h1-data)&(h2-data)/a+,b+h3=core_add(h1,h2);h3-data=1;printf(+ );display(h3);if(!(h1-data)&!(h2-data)/a-,b-h3=core_add(h1,h2);h3-data=0;printf(- );display(h3);if(h1-data)&!(h2-data)/a+,b-switch(flag=cmp(h1,h2)case 1: /

15、 |a|b|h3=core_sub(h1,h2);h3-data=1;printf(+ );display(h3);break;case 0:break;case -1: / |a|data=0;printf(- );11display(h3);break;/switch(flag)/if(a+,b-)if(!h1-data)&(h2-data)/a-,b+switch(flag=cmp(h1,h2)case 1: / |a|b|h3=core_sub(h1,h2);h3-data=0;printf(- );display(h3);break;case 0:break;case -1:

16、 / |a|data=1;printf(+ );display(h3);break;/switch(flag)/if(a-,b+)/add().checkedvoid sub(dnode *h1,dnode*h2)/減法,a-b=cdnode *h3;12int flag=0;if(h1-data)&!(h2-data)/a+,b-h3=core_add(h1,h2);h3-data=1;printf(+ );display(h3);/if(a+,b-)if(!(h1-data)&(h2-data)/a-,b+h3=core_add(h1,h2);h3-data=0;print

17、f(- );display(h3);/if(a-,b+)if(h1-data)&(h2-data)/a+,b+switch(flag=cmp(h1,h2)case 1:/ |a|b|h3=core_sub(h1,h2);h3-data=1;printf(+ );display(h3);break;case 0:break;case -1:/ |a|data=0;printf(- );13display(h3);break;/switch(flag)/if(a+,b+)if(!(h1-data)&!(h2-data)/a-,b-switch(flag=cmp(h1,h2)case

18、 1:/ |a|b|h3=core_sub(h1,h2);h3-data=0;printf(- );display(h3);break;case 0:break;case -1:/ |a|data=1;printf(+ );display(h3);break;/switch(flag)/if(a-,b-)/sub().checked!int char_to_int(char a)/存儲(chǔ)符號(hào)位switch(a)case +:return 1;break;14case -:return 0;break;return -1;/char_to_int().checked!void input_and_

19、init()/初始化 2 個(gè)數(shù)據(jù)的大小char a;int flag1,flag2;printf(輸入第一個(gè)數(shù)字的正負(fù)符號(hào) (+,-)n);/輸入符號(hào)scanf(%c,&a);scanf(%c,&a);flag1=char_to_int(a);printf(輸入第一個(gè)數(shù)字每次輸入 4 位用逗號(hào)隔開 輸入負(fù)數(shù)結(jié)束輸入n);head1=creat(); /產(chǎn)生第一個(gè)數(shù),得到它的頭指針head1-data=flag1;printf(輸入第二個(gè)數(shù)字的正負(fù)符號(hào) (+,-)n);scanf(%c,&a);scanf(%c,&a);flag2=char_to_int(a);p

20、rintf(輸入第二個(gè)數(shù)字每次輸入 4 位用逗號(hào)隔開 輸入負(fù)數(shù)結(jié)束輸入n);head2=creat(); /產(chǎn)生第 2 個(gè)數(shù),得到它的頭指針head2-data=flag2;/input_and_init().checked!void main_messsage()/菜單信息 printf( * * * * * * * * * * * * * * * * * * * * * * *n);printf( * 算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-長(zhǎng)整數(shù)的運(yùn)算 *n);printf( * *n);printf( * 1:輸入 *n);15printf( * 2:加法 *n);printf( * 3:減法 *n)

21、;printf( * 4:退出 *n); printf( * * * * * * * * * * * * * * * * * * * * * * *n);printf(n);printf(n);void main() int flag;main_messsage();/菜單信息scanf(%d,&flag);/輸入選擇while(flag!=4)/輸入 4 退出switch(flag) case 1:input_and_init();break;/輸入 1:初始 2 個(gè)數(shù)據(jù)case 2:add(head1,head2);break;/輸入 2:求和case 3:sub(head1,he

22、ad2);break;/輸入 3:求差/switch()main_messsage();scanf(%d,&flag);/while/main163 3 函數(shù)的調(diào)用關(guān)系圖函數(shù)的調(diào)用關(guān)系圖main()main_messsage()input_and_init()sub()add()char_to_int()creat()core_add()display()core_sub()print()cmp()4.4.調(diào)試分析調(diào)試分析a、 調(diào)試中遇到的問題及對(duì)問題的解決方法本程序在一開始,基本上沒有太大的問題,大部分功能都能完整的實(shí)現(xiàn),但是本程序結(jié)構(gòu)嚴(yán)謹(jǐn),要明確函數(shù)的嵌套關(guān)系以及執(zhí)行過程。此程序執(zhí)

23、行時(shí)不可忽略操作者選擇整數(shù)的正負(fù),先說明正負(fù),在進(jìn)行數(shù)據(jù)的輸入,然后選擇菜單欄里執(zhí)行的運(yùn)算。b、 算法的時(shí)間復(fù)雜度和空間復(fù)雜度設(shè)該算法的結(jié)點(diǎn)記錄為 n,則通過計(jì)算可得該算法的時(shí)間復(fù)雜度為 O(n2),該算法的空間復(fù)雜度為 8.76KB。175.5.測(cè)試結(jié)果測(cè)試結(jié)果1 選擇菜單界面如下所示:2 選擇 1 進(jìn)入輸入:183 輸入第一個(gè)數(shù)字正負(fù)號(hào)(比如+號(hào)):4 輸入第一個(gè)數(shù)字每次輸入 4 位用逗號(hào)隔開,輸入負(fù)數(shù)結(jié)束(如以-1 結(jié)束):195 輸入第二個(gè)數(shù)字正負(fù)號(hào):6 輸入第二個(gè)數(shù)字每次輸入 4 位用逗號(hào)隔開,輸入負(fù)數(shù)結(jié)尾:207 選擇運(yùn)算:同樣步驟可以進(jìn)行其他運(yùn)算,如下列兩長(zhǎng)整數(shù)想減:216 6源

24、程序(帶注釋)源程序(帶注釋)#include#include22typedef struct dnodeint data;/頭節(jié)點(diǎn)的 data 域保存數(shù)的正負(fù)。1 正,0 負(fù)。 struct dnode *prior,*next;dnode;dnode *r1,*r2,*head1,*head2,*head3;dnode *head_temp;dnode *creat()/表尾插入法產(chǎn)生一個(gè)帶頭節(jié)點(diǎn)的雙向循環(huán)鏈表,結(jié)果:表頭是高位,表尾是低位,返回頭指針dnode *head,*p,*s; int x,flag=1;/flag-是否繼續(xù)輸入的標(biāo)志head=(dnode*)malloc(siz

25、eof(dnode);p=head;while(flag) scanf(%c);scanf(%d,&x);if(x=0&xdata=x;p-next=s;s-prior=p;p=s;if(x=10000)/輸入過大,判錯(cuò) printf(input overflow); flag=0;return NULL;if(xprior=p;p-next=head;return head;/creat().checked!dnode *core_add(dnode *h1,dnode *h2)/部分加法-兩個(gè)正數(shù)相加。傳入兩個(gè)頭指針。返回結(jié)果:表頭是高位,表尾是低位,返回頭指針int su

26、m=0,inc=0;/inc=1 進(jìn)位,inc=0 不進(jìn)位dnode *p1,*p2,*p,*s,*h3;h3=(dnode*)malloc(sizeof(dnode);p=h3;/動(dòng)指針 pfor(p1=h1-prior,p2=h2-prior;(p1!=h1)&(p2!=h2);p1=p1-prior,p2=p2-prior)/從表尾開始,至某個(gè)指針(p1,p2)回到頭節(jié)點(diǎn)為止sum=p1-data+p2-data+inc;if(sum=10000)/進(jìn)位inc=1;sum-=10000;elseinc=0;s=(dnode*)malloc(sizeof(dnode);s-data

27、=sum;s-next=p;p-prior=s;p=s;/表頭是高位,表尾是低位,建立結(jié)果鏈表/forif(p1=h1&p2=h2)/兩數(shù)節(jié)數(shù)相同if(!inc)/不進(jìn)位s-prior=h3;h3-next=s; return h3;24/if(不進(jìn)位)else/進(jìn)位s=(dnode*)malloc(sizeof(dnode);s-data=1;s-next=p;p-prior=s;s-prior=h3;h3-next=s;return h3;/else/if(兩數(shù)節(jié)數(shù)相同)if(p1=h1)&(p2!=h2)/h1 加完,h2 有剩余段while(p2!=h2)if(sum=

28、p2-data+inc)10000)/進(jìn)位,只進(jìn)一次inc=1;sum-=10000;elseinc=0;s=(dnode*)malloc(sizeof(dnode);s-data=sum;s-next=p;p-prior=s;p=s;p2=p2-prior;/while(p2!=h2)s-prior=h3;h3-next=s; return h3;/if(h1 加完,h2 有剩余段)if(p2=h2)&(p1!=h1)/h2 加完,h1 有剩余段25while(p1!=h1)if(sum=p1-data+inc)=10000)/進(jìn)位,只進(jìn)一次inc=1;sum-=10000;else

29、inc=0;s=(dnode*)malloc(sizeof(dnode);s-data=sum;s-next=p;p-prior=s;p=s;p1=p1-prior;/while(p1!=h1)s-prior=h3;h3-next=s; return h3;/if(h2 加完,h1 有剩余段)return NULL;/仍未出口就判錯(cuò)/core_add().checkeddnode *core_sub(dnode *h1,dnode *h2)/部分減法-大數(shù)減小數(shù)。傳入兩個(gè)頭指針。返回結(jié)果:表頭是高位,表尾是低位,返回頭指針dnode *p1,*p2,*p,*s,*h3;int dec=0,re

30、sl=0;/dec 借位標(biāo)志,resl 暫存相減的結(jié)果h3=(dnode*)malloc(sizeof(dnode); p=h3;/動(dòng)指針 pfor(p1=h1-prior,p2=h2-prior;p2!=h2;p1=p1-prior,p2=p2-prior)/從 h1,h2 尾節(jié)點(diǎn)開始,至指針 p2 回到頭節(jié)點(diǎn)為止resl=(p1-data)-(p2-data)-dec;if(resldata=resl;s-next=p;p-prior=s;p=s;/for()if(p2=h2)&(p1=h2)/兩數(shù)的段數(shù)一樣s-prior=h3;h3-next=s;return h3;/if(兩數(shù)

31、的段數(shù)一樣)else/被減數(shù) h1 有剩余段while(p1!=h1)resl=p1-data-dec;if(resldata=resl;s-next=p;p-prior=s;p=s;p1=p1-prior;/while(p1!=h1)27s-prior=h3;h3-next=s;return h3;/else(被減數(shù) h1 有剩余段)return NULL;/仍未出口就判錯(cuò)/core_sub().checkedint cmp(dnode *h1,dnode *h2)/比較絕對(duì)值的函數(shù)。|h1|h2|,返回 1;|h1|next)c1+;for(p2=h2;p2!=h2;p2=p2-next)

32、c2+;/先比較段數(shù)if(c1c2)return 1;if(c2c1)return -1;else/段數(shù)相同的情況下,從高位(頭)到低位(尾)逐段比較大小for(p1=h1-next,p2=p2-next;p1!=h1;p1=p1-next,p2=p2-next)if(p1-data=p2-data) continue;if(p1-data)(p2-data) return 1;else return -1;return 0;/比到最后不分大小,就是一樣大/else/cmp().checkedvoid print(int data)/補(bǔ)零打印一個(gè)數(shù)。只被 display()調(diào)用。if(data

33、=1000)printf(%d,data);28else if(data=100)printf(0%d,data);else if(data=10)printf(00%d,data);elseprintf(000%d,data);/print()void display(dnode *h)/顯示一個(gè)長(zhǎng)整數(shù)的數(shù)值部分,傳入的參數(shù)是頭指針dnode *p;p=h-next;/p 指頭while(p!=h-prior)/從高位到地位輸出長(zhǎng)整數(shù)print(p-data);printf(,);p=p-next;printf(%04d,p-data);printf(n);/display().checke

34、dvoid add(dnode *h1,dnode *h2)/加法,a+b=cdnode *h3;int flag=0;if(h1-data)&(h2-data)/a+,b+h3=core_add(h1,h2);h3-data=1;printf(+ );display(h3);if(!(h1-data)&!(h2-data)/a-,b-29h3=core_add(h1,h2);h3-data=0;printf(- );display(h3);if(h1-data)&!(h2-data)/a+,b-switch(flag=cmp(h1,h2)case 1: / |a|b|

35、h3=core_sub(h1,h2);h3-data=1;printf(+ );display(h3);break;case 0:break;case -1: / |a|data=0;printf(- );display(h3);break;/switch(flag)/if(a+,b-)if(!h1-data)&(h2-data)/a-,b+switch(flag=cmp(h1,h2)case 1: / |a|b|30h3=core_sub(h1,h2);h3-data=0;printf(- );display(h3);break;case 0:break;case -1: / |a|

36、data=1;printf(+ );display(h3);break;/switch(flag)/if(a-,b+)/add().checkedvoid sub(dnode *h1,dnode*h2)/減法,a-b=cdnode *h3;int flag=0;if(h1-data)&!(h2-data)/a+,b-h3=core_add(h1,h2);h3-data=1;printf(+ );display(h3);/if(a+,b-)if(!(h1-data)&(h2-data)/a-,b+31h3=core_add(h1,h2);h3-data=0;printf(- );

37、display(h3);/if(a-,b+)if(h1-data)&(h2-data)/a+,b+switch(flag=cmp(h1,h2)case 1:/ |a|b|h3=core_sub(h1,h2);h3-data=1;printf(+ );display(h3);break;case 0:break;case -1:/ |a|data=0;printf(- );display(h3);break;/switch(flag)/if(a+,b+)if(!(h1-data)&!(h2-data)/a-,b-switch(flag=cmp(h1,h2)case 1:/ |a|

38、b|32h3=core_sub(h1,h2);h3-data=0;printf(- );display(h3);break;case 0:break;case -1:/ |a|data=1;printf(+ );display(h3);break;/switch(flag)/if(a-,b-)/sub().checked!int char_to_int(char a)/存儲(chǔ)符號(hào)位switch(a)case +:return 1;break;case -:return 0;break;return -1;/char_to_int().checked!void input_and_init()/初

39、始化 2 個(gè)數(shù)據(jù)的大小char a;int flag1,flag2;printf(輸入第一個(gè)數(shù)字的正負(fù)符號(hào) (+,-)n);/輸入符號(hào)33scanf(%c,&a);scanf(%c,&a);flag1=char_to_int(a);printf(輸入第一個(gè)數(shù)字每次輸入 4 位用逗號(hào)隔開 輸入負(fù)數(shù)結(jié)束輸入n);head1=creat(); /產(chǎn)生第一個(gè)數(shù),得到它的頭指針head1-data=flag1;printf(輸入第二個(gè)數(shù)字的正負(fù)符號(hào) (+,-)n);scanf(%c,&a);scanf(%c,&a);flag2=char_to_int(a);printf(

40、輸入第二個(gè)數(shù)字每次輸入 4 位用逗號(hào)隔開 輸入負(fù)數(shù)結(jié)束輸入n);head2=creat(); /產(chǎn)生第 2 個(gè)數(shù),得到它的頭指針head2-data=flag2;/input_and_init().checked!void main_messsage()/菜單信息 printf( * * * * * * * * * * * * * * * * * * * * * * *n);printf( * 算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-長(zhǎng)整數(shù)的運(yùn)算 *n);printf( * *n);printf( * 1:輸入 *n);printf( * 2:加法 *n);printf( * 3:減法 *n);printf(

41、 * 4:退出 *n); printf( * * * * * * * * * * * * * * * * * * * * * * *n);printf(n);34printf(n);void main() int flag;main_messsage();/菜單信息scanf(%d,&flag);/輸入選擇while(flag!=4)/輸入 4 退出switch(flag) case 1:input_and_init();break;/輸入 1:初始 2 個(gè)數(shù)據(jù)case 2:add(head1,head2);break;/輸入 2:求和case 3:sub(head1,head2);b

42、reak;/輸入 3:求差/switch()main_messsage();scanf(%d,&flag);/while/main35總總 結(jié)結(jié)歷經(jīng)三星期的課程設(shè)計(jì),收獲頗深。首先從一個(gè)課程的角度而言,課程的設(shè)計(jì)波及知識(shí)的廣度,學(xué)生的動(dòng)手能力,實(shí)踐能力,解決問題的能力。在此次課設(shè)中,我了解到寫一個(gè)程序是多么的不易,它不但需要一定的專業(yè)知識(shí),還要有足夠的耐心和細(xì)心。這對(duì)于我們一個(gè)初學(xué)者來說,無疑是一個(gè)具大的挑戰(zhàn)。一個(gè)小小的算法雖然不是很難,但你只要有一點(diǎn)點(diǎn)的錯(cuò)誤, ,它就不能運(yùn)行,它就不是一個(gè)完整的好程序。在編譯過程中就遇到很多這樣的情況,比如輸入錯(cuò)誤的頻率很高,證明自己對(duì)程序的熟練程度

43、很低,不上手,容易漏掉東西,最后單個(gè)程序都沒錯(cuò)誤了,但放到一起就總出現(xiàn)錯(cuò)誤,經(jīng)過仔細(xì)檢查發(fā)現(xiàn)時(shí)函數(shù)輸入時(shí)出現(xiàn)了錯(cuò)誤,經(jīng)改正,程序正常運(yùn)行了??梢姵绦虿辉试S有一丁點(diǎn)的錯(cuò)誤。在課設(shè)剛剛開始的時(shí)候就遇到好多問題不知道怎么辦,靜下心來,仔細(xì)去寫程序。老師會(huì)給我們需要編程的內(nèi)容一些講解,順著老師的思路,來完成自己的設(shè)計(jì),我們可以開始運(yùn)行自己的程序,可是好多處的錯(cuò)誤讓人看的可怕,還看不出到底是哪里出現(xiàn)了錯(cuò)誤,但是程序還是得繼續(xù)下去,我多次請(qǐng)教了老師和同學(xué),逐漸能自己找出錯(cuò)誤,并加以改正。TC 里檢查錯(cuò)誤都是用英文來顯示出來的,經(jīng)過了這次課程設(shè)計(jì),現(xiàn)在已經(jīng)可以了解很多錯(cuò)誤在英文里的提示,這對(duì)我來說是一個(gè)突破

44、性的進(jìn)步,眼看著一個(gè)個(gè)錯(cuò)誤通過自己的努力在我眼前消失,36覺得很是開心。此次的程序設(shè)計(jì)能夠成功,是我努力作用的結(jié)果。在這一段努力學(xué)習(xí)的過程中,我的編程設(shè)計(jì)有了明顯的提高。其實(shí)現(xiàn)在想起來,收獲還真是不少,雖然說以前非常不懂這門語言,在它上面花費(fèi)了好多心血,覺得它很難,是需用花費(fèi)了大量的時(shí)間編寫出來的。現(xiàn)在真正的明白了一些代碼的應(yīng)用,每個(gè)程序都有一些共同點(diǎn),通用的結(jié)構(gòu),相似的格式。只要努力去學(xué)習(xí),就會(huì)靈活的去應(yīng)用它。 37參考文獻(xiàn)參考文獻(xiàn)1 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C 語言版).清華大學(xué)出版社.2 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)題集(C 語言版).清華大學(xué)出版社.3 DATA STRUCTURE WI

45、TH C+. William Ford,William Topp .清華大學(xué)出版社(影印版). 4 譚浩強(qiáng).c 語言程序設(shè)計(jì). 清華大學(xué)出版社. 5數(shù)據(jù)結(jié)構(gòu)與算法分析(Java 版) , A Practical Introduction to Data Structures and Algorithm Analysis Java Edition Clifford A. Shaffer , 張銘,劉曉丹譯 電子工業(yè)出版社 2001 年 1 月38致致 謝謝首先感謝我的指導(dǎo)老師王旭陽老師,她在我的課程設(shè)計(jì)過程中提出了指導(dǎo)性的方案和架構(gòu),并指引我閱讀相關(guān)的資料和書籍,使我在不熟悉的領(lǐng)域中仍能迅速掌握

46、新的技術(shù)。還要感謝我的數(shù)據(jù)結(jié)構(gòu)老師張永老師在以往的基礎(chǔ)課學(xué)習(xí)中為我打下良好的基礎(chǔ),這是我這次課程設(shè)計(jì)能夠順利完成的前提。最后,我要感謝我的同學(xué)。感謝他們?cè)谠O(shè)計(jì)完成后對(duì)程序的測(cè)試以及在設(shè)計(jì)過程中的幫助,沒有他們,也許就難以發(fā)現(xiàn)一些潛在的錯(cuò)誤,在此一并表示感謝。39附件附件 部分源程序代碼部分源程序代碼 #include#includetypedef struct dnodeint data;/頭節(jié)點(diǎn)的 data 域保存數(shù)的正負(fù)。1 正,0 負(fù)。 struct dnode *prior,*next;dnode;dnode *r1,*r2,*head1,*head2,*head3;dnode *he

47、ad_temp;dnode *creat()/表尾插入法產(chǎn)生一個(gè)帶頭節(jié)點(diǎn)的雙向循環(huán)鏈表,結(jié)果:表頭是高位,表尾是低位,返回頭指針dnode *head,*p,*s; int x,flag=1;/flag-是否繼續(xù)輸入的標(biāo)志head=(dnode*)malloc(sizeof(dnode);p=head;while(flag) scanf(%c);scanf(%d,&x);if(x=0&xdata=x;p-next=s;s-prior=p;p=s;if(x=10000)/輸入過大,判錯(cuò)40 printf(input overflow); flag=0;return NULL;if

48、(xprior=p;p-next=head;return head;/creat().checked!dnode *core_add(dnode *h1,dnode *h2)/部分加法-兩個(gè)正數(shù)相加。傳入兩個(gè)頭指針。返回結(jié)果:表頭是高位,表尾是低位,返回頭指針int sum=0,inc=0;/inc=1 進(jìn)位,inc=0 不進(jìn)位dnode *p1,*p2,*p,*s,*h3;h3=(dnode*)malloc(sizeof(dnode);p=h3;/動(dòng)指針 pfor(p1=h1-prior,p2=h2-prior;(p1!=h1)&(p2!=h2);p1=p1-prior,p2=p2-

49、prior)/從表尾開始,至某個(gè)指針(p1,p2)回到頭節(jié)點(diǎn)為止sum=p1-data+p2-data+inc;if(sum=10000)/進(jìn)位inc=1;sum-=10000;elseinc=0;s=(dnode*)malloc(sizeof(dnode);s-data=sum;s-next=p;p-prior=s;41p=s;/表頭是高位,表尾是低位,建立結(jié)果鏈表/forif(p1=h1&p2=h2)/兩數(shù)節(jié)數(shù)相同if(!inc)/不進(jìn)位s-prior=h3;h3-next=s; return h3;/if(不進(jìn)位)else/進(jìn)位s=(dnode*)malloc(sizeof(dn

50、ode);s-data=1;s-next=p;p-prior=s;s-prior=h3;h3-next=s;return h3;/else/if(兩數(shù)節(jié)數(shù)相同)if(p1=h1)&(p2!=h2)/h1 加完,h2 有剩余段while(p2!=h2)if(sum=p2-data+inc)10000)/進(jìn)位,只進(jìn)一次inc=1;sum-=10000;elseinc=0;s=(dnode*)malloc(sizeof(dnode);s-data=sum;s-next=p;p-prior=s;p=s;42p2=p2-prior;/while(p2!=h2)s-prior=h3;h3-next

51、=s; return h3;/if(h1 加完,h2 有剩余段)if(p2=h2)&(p1!=h1)/h2 加完,h1 有剩余段while(p1!=h1)if(sum=p1-data+inc)=10000)/進(jìn)位,只進(jìn)一次inc=1;sum-=10000;elseinc=0;s=(dnode*)malloc(sizeof(dnode);s-data=sum;s-next=p;p-prior=s;p=s;p1=p1-prior;/while(p1!=h1)s-prior=h3;h3-next=s; return h3;/if(h2 加完,h1 有剩余段)return NULL;/仍未出口

52、就判錯(cuò)/core_add().checkeddnode *core_sub(dnode *h1,dnode *h2)/部分減法-大數(shù)減小數(shù)。傳入兩個(gè)頭指針。返回結(jié)果:表頭是高位,表尾是低位,返回頭指針dnode *p1,*p2,*p,*s,*h3;int dec=0,resl=0;/dec 借位標(biāo)志,resl 暫存相減的結(jié)果43h3=(dnode*)malloc(sizeof(dnode); p=h3;/動(dòng)指針 pfor(p1=h1-prior,p2=h2-prior;p2!=h2;p1=p1-prior,p2=p2-prior)/從 h1,h2 尾節(jié)點(diǎn)開始,至指針 p2 回到頭節(jié)點(diǎn)為止res

53、l=(p1-data)-(p2-data)-dec;if(resldata=resl;s-next=p;p-prior=s;p=s;/for()if(p2=h2)&(p1=h2)/兩數(shù)的段數(shù)一樣s-prior=h3;h3-next=s;return h3;/if(兩數(shù)的段數(shù)一樣)else/被減數(shù) h1 有剩余段while(p1!=h1)resl=p1-data-dec;if(resldata=resl;s-next=p;p-prior=s;p=s;p1=p1-prior;/while(p1!=h1)s-prior=h3;h3-next=s;return h3;/else(被減數(shù) h1

54、有剩余段)return NULL;/仍未出口就判錯(cuò)/core_sub().checkedint cmp(dnode *h1,dnode *h2)/比較絕對(duì)值的函數(shù)。|h1|h2|,返回 1;|h1|next)c1+;for(p2=h2;p2!=h2;p2=p2-next)c2+;/先比較段數(shù)if(c1c2)return 1;if(c2c1)return -1;else/段數(shù)相同的情況下,從高位(頭)到低位(尾)逐段比較大小for(p1=h1-next,p2=p2-next;p1!=h1;p1=p1-next,p2=p2-next)if(p1-data=p2-data) continue;if(

55、p1-data)(p2-data) return 1;else return -1;45return 0;/比到最后不分大小,就是一樣大/else/cmp().checkedvoid print(int data)/補(bǔ)零打印一個(gè)數(shù)。只被 display()調(diào)用。if(data=1000)printf(%d,data);else if(data=100)printf(0%d,data);else if(data=10)printf(00%d,data);elseprintf(000%d,data);/print()void display(dnode *h)/顯示一個(gè)長(zhǎng)整數(shù)的數(shù)值部分,傳入的參數(shù)是頭指針dnode *p;p=h-next;/p 指頭while(p!=h-prior)/從高位到地位輸出長(zhǎng)整數(shù)print(p-data);printf(,);p=p-next;printf(%04d,p-data);printf(n);/display().checkedvoid add(dnode *h1,dnode *h2)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論