大整數(shù)的四則運(yùn)算課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  課程設(shè)計(jì)說明書</b></p><p>  日期: 2013年11月16日</p><p><b>  1 設(shè)計(jì)目的</b></p><p>  本課程設(shè)計(jì)是采用C語言,在VC平臺(tái)下實(shí)現(xiàn)大整數(shù)的四則運(yùn)算,該系統(tǒng)運(yùn)行在MS-DOS命令行模式下。本課程設(shè)計(jì)為學(xué)生提供了一個(gè)既動(dòng)手又動(dòng)腦,獨(dú)立實(shí)踐的機(jī)

2、會(huì),將課本上的理論知識(shí)和實(shí)際有機(jī)的結(jié)合起來,鍛煉學(xué)生的分析解決實(shí)際問題的能力。提高學(xué)生適應(yīng)實(shí)際,實(shí)踐編程的能力。</p><p>  1)進(jìn)一步鞏固和復(fù)習(xí)C程序設(shè)計(jì)的基礎(chǔ)知識(shí);</p><p>  2)培養(yǎng)學(xué)生結(jié)構(gòu)化程序、模塊化程序設(shè)計(jì)的方法和能力; </p><p>  3)了解軟件的編制過程及各環(huán)節(jié)的具體內(nèi)容;</p><p>  4)提

3、高學(xué)生程序調(diào)試技巧、軟件設(shè)計(jì)能力和代碼規(guī)范化等素質(zhì);</p><p>  提高學(xué)生分析問題、解決問題以及實(shí)際運(yùn)用能力。</p><p><b>  2 任務(wù)概述</b></p><p>  完成大整數(shù)的四則運(yùn)算任務(wù),假定整數(shù)不超過五十位要求:</p><p>  1) 在屏幕上能夠手動(dòng)輸入待求的兩個(gè)大整數(shù);</p&

4、gt;<p>  2) 輸入完成后通過選擇可以完成大整數(shù)的加、減、乘、除運(yùn)算;</p><p>  3)將結(jié)果分別顯示在屏幕上。</p><p>  4) 驗(yàn)收時(shí)程序能夠演示,自己?jiǎn)为?dú)做。</p><p><b>  3 模塊劃分</b></p><p>  1) 定義c_to_d(char str[N],

5、 char d[N])函數(shù),實(shí)現(xiàn)把str的各位轉(zhuǎn)變成對(duì)應(yīng)整數(shù),右對(duì)齊存入d, start為最高位下標(biāo)</p><p>  2)定義d_to_c(char d[N], char str[N], int start)函數(shù),實(shí)現(xiàn)把d中數(shù)字d[start...N-1]轉(zhuǎn)變?yōu)樽址髮?duì)齊存入str</p><p><b>  3)定義加法函數(shù)</b></p><

6、;p><b>  4)定義減法函數(shù)</b></p><p><b>  5)定義乘法函數(shù)</b></p><p><b>  6)定義除法函數(shù)</b></p><p>  7)定義輸出格式函數(shù)</p><p><b>  8)運(yùn)用主函數(shù)計(jì)算</b>&

7、lt;/p><p>  4 主要函數(shù)說明及其N-S圖</p><p><b>  1)主函數(shù)說明</b></p><p><b>  ①定義變量</b></p><p> ?、谳斎胍M(jìn)行運(yùn)算代碼數(shù)字</p><p><b>  ③輸入數(shù)字</b></p

8、><p><b>  ④調(diào)用函數(shù)進(jìn)行運(yùn)算</b></p><p><b>  2)其他函數(shù)說明</b></p><p> ?、賛in函數(shù),比較兩數(shù)大小</p><p> ?、赾_to_d(char str[N], char d[N])函數(shù),實(shí)現(xiàn)把str的各位轉(zhuǎn)變成對(duì)應(yīng)整數(shù),右對(duì)齊存入d, start為最

9、高位下標(biāo)</p><p> ?、踕_to_c(char d[N], char str[N], int start)函數(shù),實(shí)現(xiàn)把d中數(shù)字d[start...N-1]轉(zhuǎn)變?yōu)樽址髮?duì)齊存入str</p><p> ?、躠dd(char str_a[N], char str_b[N], char str_c[N]),加法函數(shù)</p><p> ?、輘ub(char str_

10、a[N], char str_b[N], char str_c[N]),減法函數(shù)</p><p> ?、辌ompare(char str1[N], char str2[N]) ,實(shí)現(xiàn)str1,str2內(nèi)存的是要進(jìn)行比較的大整數(shù)</p><p> ?、適ul(char str_a[N], char str_b[N], char str_c[N]),乘法函數(shù)</p><p&

11、gt; ?、郿ivd(char str_a[N], char str_b[N], char str_c[N]),除法函數(shù)</p><p>  主要函數(shù)的N-S圖:</p><p>  圖1:函數(shù)c_to_d(char str[N],char d[N]) N-S圖</p><p>  圖2:函數(shù)d_to_c(char d[N],char str[N],int star

12、t) N-S圖</p><p>  圖3:加法運(yùn)算函數(shù)add()的N-S圖</p><p>  圖4:減法運(yùn)算函數(shù)sub()的N-S圖</p><p>  圖5:比較函數(shù)compare()的N-S圖</p><p>  圖6:乘法運(yùn)算函數(shù)的N-S圖</p><p>  圖7:除法運(yùn)算函數(shù)的N-S圖</p>

13、<p>  圖8:運(yùn)行四則運(yùn)算的主函數(shù)的N-S圖</p><p>  5 程序運(yùn)行數(shù)據(jù)及其結(jié)果</p><p><b>  測(cè)試加法</b></p><p><b>  輸入1</b></p><p>  再輸入1234567890和1234567890987</p>&l

14、t;p>  圖一 加法運(yùn)算結(jié)果</p><p><b>  測(cè)試減法</b></p><p><b>  輸入2</b></p><p>  再輸入123123123132和123123123</p><p>  圖二 減法運(yùn)算結(jié)果</p><p><b

15、>  測(cè)試乘法</b></p><p><b>  輸入3</b></p><p>  再輸入12363445234和23452435</p><p>  圖三 乘法運(yùn)算結(jié)果</p><p><b>  測(cè)試除法</b></p><p><b>

16、;  輸入4</b></p><p>  再輸入1234567890和123456789</p><p>  圖四 除法運(yùn)算結(jié)果</p><p><b>  退出</b></p><p><b>  輸入0</b></p><p><b>  圖五

17、 退出程序</b></p><p><b>  6 課程設(shè)計(jì)心得</b></p><p>  這次我的課程設(shè)計(jì)是大整數(shù)的四則運(yùn)算,由于平常使用的32位操作系統(tǒng)上,整形數(shù)的長(zhǎng)度是32位,即四個(gè)字節(jié),對(duì)于一般的應(yīng)用,這個(gè)長(zhǎng)度的整數(shù)已經(jīng)足夠。但是在某些領(lǐng)域,中,經(jīng)常需要用到長(zhǎng)達(dá)128位(16字節(jié))的整數(shù),對(duì)于這種整數(shù),內(nèi)部型是無法進(jìn)行計(jì)算的,所以我將大整數(shù)用字

18、符串,數(shù)組的形式表示出來,用于它的四則運(yùn)算。 </p><p>  通過此次課程設(shè)計(jì),使我更加扎實(shí)的掌握了有關(guān)c語言設(shè)計(jì)方面的知識(shí),在設(shè)計(jì)過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動(dòng)手制作,使我們掌握的知識(shí)不再是紙上談兵。 在課程設(shè)計(jì)過程中,不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲取。在設(shè)計(jì)中遇

19、到了很多問題,最后在老師的指導(dǎo)以及同學(xué)的幫助下,終于迎刃而解。在今后社會(huì)的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘。</p><p><b>  附錄:</b></p><p>  #include<stdio.h></

20、p><p>  #include<string.h></p><p>  #define N 256</p><p>  int min(int x, int y)</p><p><b>  {</b></p><p>  return x<y?x:y;</p>&l

21、t;p><b>  }</b></p><p>  int c_to_d(char str[N], char d[N])</p><p>  {//把str的各位轉(zhuǎn)變成對(duì)應(yīng)整數(shù),右對(duì)齊存入d, start為最高位下標(biāo)</p><p>  int len,start; //strlen(str)=5 N=10 start =10-5=5 &

22、lt;/p><p><b>  int i,j;</b></p><p>  for(i=0;i<N;i++)</p><p><b>  d[i]=0;</b></p><p>  len=strlen(str);</p><p>  start=N-len;</p

23、><p>  for(i=0,j=start;i<len;i++,j++)</p><p>  d[j]=str[i]-'0';</p><p>  return start;</p><p><b>  }</b></p><p>  void d_to_c(char d[N]

24、, char str[N], int start)</p><p><b>  {</b></p><p>  //把d中數(shù)字d[start...N-1]轉(zhuǎn)變?yōu)樽址髮?duì)齊存入str</p><p><b>  int i,j;</b></p><p>  int len=N-start;</p

25、><p>  for(i=0,j=start; i<len; i++,j++)</p><p>  str[i]=d[j]+'0';</p><p>  str[len]='\0';</p><p><b>  }</b></p><p>  //加法additi

26、on</p><p>  void add(char str_a[N], char str_b[N], char str_c[N])</p><p><b>  {</b></p><p>  char a[N], b[N],c[N]; //以右對(duì)齊的方式存儲(chǔ)各位數(shù)</p><p><b>  int i;&l

27、t;/b></p><p>  int start_a,start_b,start_c;//分別存儲(chǔ)a,b,c中最高位的下標(biāo)</p><p>  int carry;//進(jìn)位</p><p>  //把str_a,str_b的各位轉(zhuǎn)變成對(duì)應(yīng)整數(shù),右對(duì)齊存入a,b</p><p>  start_a=c_to_d(str_a, a);&l

28、t;/p><p>  start_b=c_to_d(str_b, b);</p><p>  //從低位到高位,對(duì)應(yīng)位相加</p><p><b>  i=N-1;</b></p><p><b>  carry=0;</b></p><p>  start_c=min(sta

29、rt_a,start_b);</p><p>  while(i>=start_c)</p><p><b>  {</b></p><p>  c[i]=a[i]+b[i]+carry;</p><p>  carry=c[i]/10;</p><p>  c[i]=c[i]%10;<

30、;/p><p><b>  i--;</b></p><p><b>  }</b></p><p><b>  //如果有進(jìn)位</b></p><p>  if(carry>0)</p><p><b>  {</b><

31、;/p><p>  start_c--;</p><p>  c[start_c]=carry;</p><p><b>  }</b></p><p>  //把c轉(zhuǎn)化為字符串str_c</p><p>  d_to_c(c, str_c, start_c);</p><p>

32、;<b>  }</b></p><p>  ////減法,subtration</p><p>  void sub(char str_a[N], char str_b[N], char str_c[N])</p><p><b>  {//已假設(shè)a>b</b></p><p>  char

33、 a[N], b[N],c[N]; //以右對(duì)齊的方式存儲(chǔ)各位數(shù)</p><p><b>  int i;</b></p><p>  int start_a,start_b;//分別存儲(chǔ)a,b,c中最高位的下標(biāo)</p><p>  int borrow;//借位</p><p>  //把str_a,str_b的各位轉(zhuǎn)

34、變成對(duì)應(yīng)整數(shù),右對(duì)齊存入a,b</p><p>  start_a=c_to_d(str_a, a);</p><p>  start_b=c_to_d(str_b, b);</p><p>  //從低位到高位,對(duì)應(yīng)位相減,注意借位</p><p>  memset(c,0,sizeof(c));//將c中有效的個(gè)字節(jié)替換為并返回c;<

35、;/p><p><b>  i=N-1;</b></p><p><b>  borrow=0;</b></p><p>  while(i>=start_a)</p><p><b>  {</b></p><p>  c[i]=a[i]-b[i]-

36、borrow;</p><p>  if(c[i]<0) //借位</p><p><b>  {</b></p><p><b>  borrow=1;</b></p><p><b>  c[i]+=10;</b></p><p><b&

37、gt;  }</b></p><p>  else //注意不可缺省</p><p><b>  borrow=0;</b></p><p><b>  i--;</b></p><p><b>  }</b></p><p><b&g

38、t;  //去掉結(jié)果前面的</b></p><p>  while(i<N && c[i]==0 )i++;</p><p>  //把c轉(zhuǎn)化為字符串str_c</p><p>  d_to_c(c, str_c, i);//i是c中最高位下標(biāo) </p><p><b>  }</b>&

39、lt;/p><p>  int compare(char str1[N], char str2[N]) //str1,str2內(nèi)存的是要進(jìn)行比較的大整數(shù)</p><p>  { //如果前者大于后者,返回正數(shù),若相等返回,否則返回負(fù)數(shù)</p><p>  int len1,len2;</p><p>  len1=strlen(str1);&l

40、t;/p><p>  len2=strlen(str2);</p><p>  if(len1<len2)</p><p>  return -1;</p><p>  else if(len1>len2)return 1;</p><p><b>  else</b></p>

41、<p>  return strcmp(str1,str2);</p><p><b>  }</b></p><p>  //乘法multiplication</p><p>  void mul(char str_a[N], char str_b[N], char str_c[N])</p><p>&

42、lt;b>  {</b></p><p>  int len1, len2,i,j,k,carry;</p><p>  char a[N], b[N], c[N], d[N];</p><p>  int start_a, start_b, start_c, start_d;</p><p>  len1=strlen(s

43、tr_a);</p><p>  len2=strlen(str_b);</p><p>  //把str_a,str_b的各位轉(zhuǎn)變成對(duì)應(yīng)整數(shù),右對(duì)齊存入a,b</p><p>  start_a=c_to_d(str_a, a);</p><p>  start_b=c_to_d(str_b, b);</p><p>

44、;  memset(c, 0, sizeof(c));</p><p>  //用b[j](j=N-1,N-2....,) 乘a,存入d,再把d累加到c中,注意錯(cuò)位問題,d的最低位下標(biāo)不是N-1,而是j</p><p>  for(j=N-1;j>=start_b;j--)</p><p><b>  {</b></p>&

45、lt;p>  memset(d, 0, sizeof(d));</p><p><b>  carry=0;</b></p><p>  for(i=N-1,k=j;i>=start_a;i--,k--) //注意d的最低位下標(biāo)從j開始,而不是從N-1開始</p><p><b>  {</b></p&g

46、t;<p>  d[k]=a[i]*b[j];</p><p>  carry=d[k]/10;</p><p>  d[k]=d[k]%10;</p><p><b>  }</b></p><p><b>  //如果有進(jìn)位</b></p><p>  if

47、(carry>0)</p><p><b>  {</b></p><p>  d[k]=carry;</p><p><b>  k--;</b></p><p><b>  }</b></p><p>  start_d=k+1;</p&

48、gt;<p><b>  //把d累加到c中</b></p><p><b>  carry=0;</b></p><p>  for(i=N-1;i>=start_d;i--)</p><p><b>  {</b></p><p>  c[i]=c[i]

49、+d[i]+carry;</p><p>  carry=c[i]/10;</p><p>  c[i]=c[i]%10;</p><p><b>  }</b></p><p><b>  //如果有進(jìn)位</b></p><p>  if(carry>0)</p

50、><p><b>  {</b></p><p>  c[i]=carry;</p><p><b>  i--;</b></p><p><b>  }</b></p><p><b>  }</b></p><p

51、>  start_c=i+1;</p><p>  //把c轉(zhuǎn)化為字符串str_c</p><p>  d_to_c(c, str_c, start_c);</p><p><b>  }</b></p><p>  ///除法。division</p><p>  void divd(ch

52、ar str_a[N], char str_b[N], char str_c[N])</p><p><b>  {//已假設(shè)a>b</b></p><p>  char c[N]; //以左對(duì)齊的方式存儲(chǔ)各位數(shù)</p><p>  char rmd[N];//存儲(chǔ)余數(shù)</p><p>  char temp[

53、N];</p><p>  int i,k,len_rmd, len1,len2,cur;</p><p>  memset(c,0,sizeof(c));</p><p>  //準(zhǔn)備工作,先在被除數(shù)中取和除數(shù)同樣多的位數(shù)</p><p>  len1=strlen(str_a);</p><p>  len2=st

54、rlen(str_b);</p><p>  strcpy(rmd, str_a);</p><p>  rmd[len2]='\0';</p><p>  cur=len2-1; //cur記下當(dāng)前商對(duì)應(yīng)的a中的下標(biāo)</p><p>  //如果不夠除,再向右取位</p><p>  if(compa

55、re(rmd, str_b)<0)</p><p><b>  {</b></p><p><b>  cur++;</b></p><p>  rmd[cur]=str_a[cur];</p><p>  rmd[cur+1]='\0';</p><p&

56、gt;<b>  }</b></p><p>  //求商的過程是從高位到低位進(jìn)行,商的每一位計(jì)算:需要多次執(zhí)行減法,減法次數(shù)即商的一位。</p><p><b>  k=0;</b></p><p>  while(str_a[cur]!='\0')</p><p><b&g

57、t;  {</b></p><p>  while(compare(rmd,str_b)>=0) //本循環(huán)確定str_a[cur]對(duì)應(yīng)位置的商</p><p><b>  {</b></p><p>  sub(rmd, str_b, temp);</p><p><b>  c[k]++;

58、</b></p><p>  strcpy(rmd, temp);</p><p><b>  }</b></p><p>  //右移一位后繼續(xù)上述過程</p><p><b>  cur++;</b></p><p>  len_rmd=strlen(rmd)

59、;</p><p>  rmd[len_rmd]=str_a[cur];//照抄被除數(shù)的一位</p><p>  rmd[len_rmd+1]='\0';</p><p><b>  k++;</b></p><p><b>  }</b></p><p> 

60、 //將c[0...k-1]轉(zhuǎn)換成字符存入str_c</p><p>  for(i=0;i<k;i++)</p><p>  str_c[i]=c[i]+'0';</p><p>  str_c[i]='\0';</p><p><b>  }</b></p>&l

61、t;p>  void welcome()</p><p><b>  {</b></p><p>  printf("***********************大整數(shù)四則運(yùn)算***********************\n");</p><p>  printf("************** 請(qǐng)選擇要

62、進(jìn)行的四則運(yùn)算對(duì)應(yīng)選項(xiàng):*************\n");</p><p>  printf("************** 1:加法運(yùn)算。 *************\n");</p><p>  printf("************** 2:減法運(yùn)算。 ********

63、*****\n");</p><p>  printf("************** 3:乘法運(yùn)算。 *************\n");</p><p>  printf("************** 4:除法運(yùn)算。 *************\n");</

64、p><p>  printf("************** 0:退出。 *************\n");</p><p>  printf("************************************************************\n");</p><p

65、><b>  }</b></p><p>  int main()</p><p><b>  { </b></p><p><b>  int x,i;</b></p><p>  char str_a[N],str_b[N],str_c[N];</p>

66、<p>  for(i=1; ;i++)</p><p><b>  {</b></p><p>  welcome();</p><p>  scanf("%d",&x);</p><p><b>  if(x==0)</b></p><

67、;p><b>  { </b></p><p>  printf("程序結(jié)束!感謝您的使用!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  else&

68、lt;/b></p><p><b>  { </b></p><p>  while(x>4||x<0)</p><p><b>  {</b></p><p>  printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");</p><p>  s

69、canf("%d",&x);</p><p><b>  }</b></p><p>  printf("請(qǐng)輸入需要的兩個(gè)數(shù)\n");</p><p>  scanf("%s",str_a);</p><p>  scanf("%s"

70、,str_b);</p><p><b>  switch(x)</b></p><p><b>  {</b></p><p>  case 1:add(str_a,str_b,str_c); break;</p><p>  case 2:sub(str_a,str_b,str_c); br

71、eak;</p><p>  case 3:mul(str_a,str_b,str_c); break;</p><p>  case 4:divd(str_a,str_b,str_c); break;</p><p><b>  }</b></p><p>  printf("=%s\n\n",&

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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)論