長整數四則運算+數據結構課程設計_第1頁
長整數四則運算+數據結構課程設計_第2頁
長整數四則運算+數據結構課程設計_第3頁
長整數四則運算+數據結構課程設計_第4頁
長整數四則運算+數據結構課程設計_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、長整數四則運算 +數據結構課程 設計長整數四則運算題目:編制一個演示長整數的四則運算的程序 一、需求分析1. 本程序實現計算任意長的整數的四則運算 . 以用戶和計算機對話的 方式,先后輸入數字的最多位數, 然后程序就計算并顯示出這兩個數的 運算。2. 利用雙向循環鏈表現實長整數的存儲,每個結點含一個整形變量。 輸入的形式以回車結束, 可以直接輸入正數或負數, 程序會過濾掉無效 的字符。按中國對于長整數的表示習慣,每四位一組,除數字和位于首 位置的負號外, 其它一切字符都將作為分隔符, 連續多個分隔符當一個 處理。但不使用分隔符也不影響結果。3. 測試數據(1)0; 0; 輸出“0”;(2) -

2、2345,6789; -7654,3211; 輸出 “-1,000,000 ”;(3) -9999,9999; 1,0000,0000,0000; 輸出 “9999,0000,0001 ”;(4) 1,0001,0001; -1,0001,0001; 輸出 “0”;(5) 1,0001,0001; -1,0001,0001; 輸出 “1”;(6) -9999,9999,9999; -9999,9999,9999; 輸出 “-1,9999,9999,9998 ”;(7) 1,0000,9999,9999; 1; 輸出 1,0001,0000,0000.二、概要設計 為實現上述程序功能,應以雙向循

3、環鏈表表示長整數。為此,需要 定義一個抽象數據類型。1. 抽象數據類型定義為: ADT OrderedList2. 數據對象: D=ai|ai int,i=1,2,.n, n0 基本操作: init(&a,digit4)操作結果:構造一個位數是 digit4*4 長整數。pass(&a,&b,&c)初始條件: a,b,c 都已存在操作結果: c 等于 a 和 b 的和。 nep(&a)初始條件: a 已存在。操作結果: a 變為輸入參數的相反數。printlong(&a) 初始條件: a 已存在。操作結果:按四位一組,分隔符為 , 的格式,在屏幕上輸出 a ston(&S,&a)初始條件: a

4、 已存在。 操作結果:把字符串形式的長數字賦給 a。ADT OrderedList 2.本程序包含兩個模塊:1) 主程序模塊:Void main() 選擇操作: 1:幫助。 2:加法。 3:減法。 4:乘法。 5:除法。 6:退出。 打印結果;三、詳細設計 1.元素類型,結點類型,指針類型 #define NULL 0 #include #include #include typedef struct longnode/* 每個節點的結構 */ int num;/*數字 */struct longnode *low1; /* 指向低一位節點 */ struct longnode *high1;

5、 /* 指向高一位節點 */ longnode;typedef struct xlong /* 每個長整數的結構 */ longnode *High; /* 每個長整數的最高節點 */ longnode *Low;/* 每個長整數的最低節點 */int digit4; /*每個長整數的總位數 (不包括高位的 0)/4 */ *xlong;int init(xlong *a,int digit4)int I ; /*.init.*/ longnode *j;(*a)=(xlong)malloc(sizeof(struct xlong);/*為 a 的頭結構申請空間 ,并賦 初始值 */(*a)H

6、igh=NULL;(*a)-Low=NULL;(*a)-High=NULL; (*a)-Low=NULL;(*a)-digit4=0 ;for(i=0;inum=0;j-high1=NULL; j-low1=(*a)-High;if(*a)-High) (*a)-High-high1=j;else(*a)-Low=j;(*a)-High=j;(*a)-digit4+;int pass(xlong a,xlong b,xlong c)int cf=0; /* 兩個數字的相加 */ longnode *a1=a-Low,*b1=b-Low,*c1=c-Low; while(a1)c1-num=a1

7、-num+b1-num+cf;if(c1-num9999)cf=1; /* 如果產生進位 (借位) */ c1-num-=10000;elsecf=0; a1=a1-high1;b1=b1-high1;c1=c1-high1; return cf; /* 最高位的進位 (借位 ) */int passa(xlong a,xlong b,xlong c)int cf=0; /* 兩個數字的相減 */ longnode *a1=a-Low,*b1=b-Low,*c1=c-Low; while(a1)c1-num=a1-num-b1-num-cf;if(c1-num9999)cf=1;/* 如果產生

8、進位 (借位) */ c1-num-=10000;elsecf=0; a1=a1-high1;b1=b1-high1;c1=c1-high1;return cf; /* 最高位的進位 (借位 ) */int passb(xlong axlong belong c)int cf=oy*兩個數字的相乘*/ longnode*al=a-Low9*bl=b-Low,*cl=c-Low;while(al)cl-num=al-num*bl-num*cf;if(cl-num9999) cf=l; /* 如果產生進位(借位)*/ cl-num=10000;elsecf=O;a l=al-highl ;bl=b

9、l -highl ;c l=cl -highl; return cf;/*最高位的進位(借位嚴/int passc(xlong axlong belong c)int cf=O*兩個數字的相除*/longnode *al=a-Low,*b 1 =b-Low,*cl=c-Low; while(al) cl-num=a 1 -num/bl-num/cf; if(cl-num9999) cf=l; /*如果產生進位(借位嚴/cl-num-=10000;else cfH); a l=al -highl ;bl=bl -highl ;c 1 =cl -high 1;;nep(xlong a) int c

10、f=l;/*求a的相反數*/*因為求相反數是取反加一,所以這里cfM;*/return cf;/*最高位的進位(借位)勺=longnode *al=a-Low; while(al) a 1 -num=9999-(al-num)+cf;if(a 1 -num9999) al-num=10000;elsecfH);a 1 =al-highl;return;printlong(xlong a)longnode *i=a-High* 打印長整數 a *iif(i-nu m=5000) printf(n-n); /*最曲位(bit)=l表示負數,即用補碼表示*/nep(a); /*求反打印其絕對值*/

11、while(i&i-num=O) i=i-lowl;/* 跳過最位的 0 */ if(i)printf(n %dn,i-num);i=i-lowl;if(i) printfelse printf(“O);/* a=0 打 0 */while(i)printf(n%04d,i-num);if(i-Iowl)/*把字符串轉化為數字賦給a */printf(M/1); i=i-Iowl; int ston(char in|9xlong out) int bit,i,jishu=l,numO=O;longnode *j=out-Low;i=strlen(in)-l ;while(i=0&j)/* 循環

12、每一個字節 */bit=in|il09y*把字符形式的值賦給整數形式的bit */ if(bit=0 & bit l&(jishu=10000|bit9) /* 數字以外的字符 */ j-num=num0;j=j-highl; /* 存入一個節點num0=0; jishu=l; if(num0) j-num=numO;j=j-highl ;/*把最后一個沒存入節點的數存入節點*/*最位不足補0 */for(;jy=j-highl) j-num=0;if(out-High-num=5000)return 1;/* 如果高位是1,返回1表示出引if(in|0|=f-f) nep(out);/*如果

13、最后一個字符是,一唄I取反*/ return0;int add() char/*加*/int digit4,cfM);do prlntf(MHovv much digits do you need?);/人 輸入最多位數人/scanf(n %df&digit4);vvhile(digit4=0);a1=(char*)malloc(digit4+1);b1=(char*)malloc(digit4+1); digit4=digit4/4+1;init(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */do cf=0; print

14、f(Enter 2 number:n); scanf(%s,a1);printf(+n); scanf(%s,b1);cf|=ston(a1,a); cf|=ston(b1,b);while(cf);/* 輸入被加數和加數 ,如果轉換出錯 ,則重輸 */ pass(a,b,c); /* 執行相加運算 */ printlong(a);printf(+); /* 打印結果 */ printlong(b);printf(=); printlong(c);printf(n);printf(n);bioskey(0);int subtract()/*減 */char *a1,*b1;int digit4

15、,cf=0;xlong a,b,c;doprintf(How much digits do you need?);/* 輸入最多位 */ scanf(%d,&digit4);while(digit4 啊!p)刖!i|M J(W!Biplp%ll)jueos /半*/ :(MPSU noA op s)i6ip qonui MOH.Jwuud opOqE 6uo|x :0=艮初02)ui jeqo /半規/ OuoisiAip )UI J(0)Aa|SO!qJ(11u11)BUud (,uHU!d:(o)buo|Hi!d J(11=11)BUudJ(q)6uo|)uud / 畜翱曲耳” )Buud

16、J(e)6uo|)uud 滄竟吳進申馬坯(,qE)qssEd /半嗨重皿誨進吐誨進報Y嗨 J(jo)刖!qM J(qq)uo)s=|p (ee)uo)s=|p Bq,s%juEOS (.uu1)BuudJ(te1s%11)jueos (Uu:uaquinu 乙冋 umj)u!d -0=P opwiBipniui+fr/W!Bip=W!B!P 啊!b!p)oo|EUi(Eip)=g啊!b!P)0O|EUl(Eip)=LE:(O= 啊!dp)刖! i|M J(W!Biplp%ll)jueos / 誨多窖Y嗨 */ (ipaau noA op s)i6ip qonui MOH.Jwuud op 口q

17、E 6uo|x :0=艮初02)ui jeqo /半進()A|d!)|nw)U! J(0)Aa|SO!qJ(11u11)BUud :CuHU!d:(o)buo|)U!d J(11=11)BUudJ(q)6uo|)uud 滄畜彩由耳 M .-.JnuudeJBuonuudinit(&a,digit4);init(&b,digit4);init(&c,digit4); /* 初始化 a,b,c */do cf=0;printf(Enter 2 number:n); scanf(%s,a1);printf(/n);scanf(%s,b1);cf|=ston(a1,a);cf|=ston(b1,b);

18、while(cf); /* 輸入被除數和除數 ,如果轉換出錯 ,則重輸 */ passc(a,b,c); /* 執行相除運算 */printlong(a);printf(/); /* 打印結果 */ printlong(b);printf(=); printlong(c);printf(n);printf(n);bioskey(0);2.主函數代碼void main() /*main*/ int c;clrscr();textcolor(BLUE);printf(*n);printf(*Welcome to Thunder studio!*n);printf(*printf(*本程序實現長整數

19、四則運算one: printf(1: HELPn);printf(2: ADDn);printf(3: SUBTRACTn);printf(4: MULTIPLYn);printf(5: DiVISIONn);printf(6: EXITn);for(;)c=getch();switch(atoi(&c)case 1: clrscr(); goto one; break; case 2:a dd(); break;case 3: subtract(); break; case 4:multiply();break;case 5:division();break;case 6: textcolor(BLUE);n);printf(nprintf(Thanks cws work!n);break;default: textcolor(4);printf(Sorry please input right number!n);break;四、調試分析1.由于對基本要求看得不仔細 ,一開始使用的形式是數組 ,并非鏈表 ,導致 空間開銷大 .2.本程序的模塊劃分比較合理 ,且盡可能將指針的操作封裝在結構體中 , 對于一個長整數只需一個指針便可訪問其所有信息 ,所以數

溫馨提示

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

評論

0/150

提交評論