課程設(shè)計(jì) 長(zhǎng)整數(shù)四則運(yùn)算_第1頁(yè)
已閱讀1頁(yè),還剩78頁(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、<p>  課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告:1.4 長(zhǎng)整數(shù)四則運(yùn)算</p><p>  題目:長(zhǎng)整數(shù)四則運(yùn)算一、實(shí)驗(yàn)內(nèi)容【問(wèn)題描述】 設(shè)計(jì)一個(gè)實(shí)現(xiàn)任意長(zhǎng)的整數(shù)進(jìn)行加法運(yùn)算的演示程序</p><p><b>  【基本要求】</b></p><p>  利用雙向循環(huán)鏈表實(shí)現(xiàn)長(zhǎng)整數(shù)的存儲(chǔ),每個(gè)結(jié)點(diǎn)含一個(gè)整形變量。任何整形變量的范圍是 -(2^1

2、5 - 1)~(2^15 - 1)。輸入和輸出形式:按中國(guó)對(duì)于長(zhǎng)整數(shù)的表示習(xí)慣,每四位一組,組間用逗號(hào)隔開(kāi)。</p><p><b>  【實(shí)現(xiàn)基本功能】</b></p><p>  (i)是想長(zhǎng)整數(shù)的四則運(yùn)算;</p><p>  (ii)實(shí)現(xiàn)長(zhǎng)整數(shù)的乘方和階乘運(yùn)算;</p><p>  (iii)整形量范圍是-(2^

3、n-1)~(2^n-1),其中n是由程序讀入的參量。輸入數(shù)據(jù)的分組方法另行規(guī)定;</p><p>  【實(shí)現(xiàn)加強(qiáng)版本的功能】</p><p>  (i)四則運(yùn)算在原來(lái)版本的基礎(chǔ)上支持小數(shù)運(yùn)算,除法還可以通過(guò)輸入整數(shù)后加小數(shù)點(diǎn)與相應(yīng)要求取的精確位數(shù)求出精確值,如:求取3666除以7的后三位精確值,可以在輸入時(shí)將除數(shù)輸入為3666.000或3666.0000,就能得出相應(yīng)的精確位數(shù),當(dāng)然求取后

4、,沒(méi)有余數(shù)的輸出;</p><p>  (ii)乘方的功能也進(jìn)行了強(qiáng)化,支持小數(shù)操作;</p><p>  (iii)添加了多個(gè)出錯(cuò)處理(即輸入重操作)對(duì)相應(yīng)數(shù)據(jù)輸入與輸出進(jìn)行提示;</p><p>  【加強(qiáng)版的實(shí)現(xiàn)原理】</p><p>  (i)加減法運(yùn)算加強(qiáng):在原來(lái)版本的基礎(chǔ)上依照基本的加減法操作將數(shù)據(jù)用小數(shù)點(diǎn)進(jìn)行分隔,記錄下連個(gè)輸入

5、數(shù)的小數(shù)位長(zhǎng)度,并將小數(shù)位較短的一個(gè)數(shù)據(jù)后補(bǔ)0直至小數(shù)位數(shù)相同,然后用函數(shù)處理輸出的數(shù)據(jù);</p><p>  (ii)乘除法、乘方:其處理方法較為簡(jiǎn)單,主要是記錄數(shù)據(jù)中小數(shù)位數(shù)的長(zhǎng)度,然后通過(guò)每種運(yùn)算方式不同的運(yùn)算原理截取小數(shù)位,再按照輸出格式將數(shù)據(jù)處理進(jìn)行輸出;</p><p>  (iii)根據(jù)定義,階乘保持不變;</p><p><b>  【特色

6、分析】</b></p><p>  (i)加強(qiáng)版程序加上了簡(jiǎn)單的聲音提示,無(wú)論是輸入與輸出均會(huì)有八個(gè)音符的其中之一對(duì)輸入與輸出與否進(jìn)行提示,同時(shí)在輸入輸出數(shù)據(jù)出錯(cuò)時(shí),還會(huì)用三個(gè)音符對(duì)重輸入進(jìn)行提示,增強(qiáng)了人性化操作;【測(cè)試數(shù)據(jù)】 (1)0;0;應(yīng)輸出“0”。(2)-2345,6789;-7654,3211;應(yīng)輸出“-1,0000,0000”。(3)-9999,9999;1,0000,00

7、00,0000;應(yīng)輸出“9999,0000,0001”。(4)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,9998”。(7)1,0000,9999,9999;1;應(yīng)輸出“1,0001,0000,0000”。</p>&

8、lt;p>  二、實(shí)驗(yàn)?zāi)康模?、熟悉掌握雙向循環(huán)鏈表的基本操作;2、熟悉任意長(zhǎng)字符串的輸入,并實(shí)現(xiàn)把字符串轉(zhuǎn)化為整數(shù);3、熟悉任意長(zhǎng)整數(shù)的加法運(yùn)算;4、更進(jìn)一步掌握有關(guān)類的操作</p><p>  實(shí)驗(yàn)文檔: 長(zhǎng)整數(shù)四則運(yùn)算需求分析(i)本程序?qū)崿F(xiàn)計(jì)算任意長(zhǎng)的整數(shù)的加法運(yùn)算. 以用戶和計(jì)算機(jī)對(duì)話的方式,即在計(jì)算機(jī)終端上顯示“提示信息”之后,由

9、用戶在鍵盤(pán)上輸入演示程序中規(guī)定的運(yùn)算命令,然后程序就計(jì)算并顯示出這兩個(gè)數(shù)的運(yùn)算。(ii)本演示程序中,集合的元素限定為數(shù)字字符[‘0’~’9’]和字符‘,’與‘;’,輸入字符可以任意長(zhǎng),輸入形式以“回車符”為結(jié)束標(biāo)志,串中字符順序不限,且允許出現(xiàn)重復(fù)字符。(iii)利用雙向循環(huán)鏈表現(xiàn)實(shí)長(zhǎng)整數(shù)的存儲(chǔ),每個(gè)結(jié)點(diǎn)含一個(gè)整形變量。輸入的形式以回車結(jié)束,可以直接輸入正數(shù)或負(fù)數(shù)。按中國(guó)對(duì)于長(zhǎng)整數(shù)的表示習(xí)慣,每四位一組,除數(shù)字和位于首位置的負(fù)

10、號(hào)外,其它一切字符都將作為分隔符,連續(xù)多個(gè)分隔符當(dāng)一個(gè)處理。但不使用分隔符也不影響結(jié)果。(iv)自行定義的測(cè)試數(shù)據(jù)(1)0; 0; 輸出“0”;(2)-2345,6789;;-7654,3211;;加法輸出 “-1,000,000”;(3)-9999,9999;;1,0000,0000,0000;;加法輸出 “9999,0000,</p><p>  (8)10;8;乘方輸出"1,

11、0000,0000";</p><p>  -98,9997;3;除法輸出-32,9999;</p><p>  6;階乘輸出720;</p><p>  四、概要設(shè)計(jì)為實(shí)現(xiàn)上述程序功能,應(yīng)以雙向循環(huán)鏈表表示長(zhǎng)整數(shù)。為此,需要定義一個(gè)抽象數(shù)據(jù)類型。1、抽象數(shù)據(jù)類型定義為:ADT OrderedOperation{數(shù)據(jù)對(duì)象:D={ai|ai∈int

12、,i=1,2,...n, n≥0}數(shù)據(jù)關(guān)系:R1={|ai-1,ai∈D|=2,……n }基本操作:</p><p>  Status conversion(str,oprh)</p><p>  //操作結(jié)果:輸入轉(zhuǎn)換函數(shù),將字符串形式的操作數(shù)轉(zhuǎn)換成所需的類型</p><p>  cmplinklen( opr1, opr2)</p><p

13、>  //操作結(jié)果:比較鏈表長(zhǎng)度函數(shù),opr1鏈比opr2鏈長(zhǎng)則返回1,短則返回-1,否則返//回0</p><p>  length( oprr)</p><p>  //操作結(jié)果:求鏈表長(zhǎng)度</p><p>  Status Creat(oprr,len)</p><p>  //操作結(jié)果:生成指定長(zhǎng)度鏈表</p>

14、<p>  compare(opr1,opr2)</p><p>  //操作結(jié)果:比較opr1、opr2絕對(duì)值的大小</p><p>  Status init(oppr)</p><p><b>  //初始化鏈表函數(shù)</b></p><p>  Status distroy(oprr)</p>

15、<p><b>  //銷毀鏈表函數(shù)</b></p><p>  Status evaluate(opri,i)</p><p>  //操作結(jié)果:鏈表短賦值函數(shù),將i的值轉(zhuǎn)換成萬(wàn)進(jìn)制類型,i為整形變量</p><p>  Status add_bas(opr1,opr2,oprr)</p><p>  /

16、/操作結(jié)果:加法基本操作,本算法實(shí)現(xiàn)A,B相加的操作。</p><p>  Status sub_bas(opr1,opr2,oprr)</p><p>  //減法基本操作,本算法實(shí)現(xiàn)A,B相減的操作</p><p>  Status add(opr1,opr2,oprr)</p><p>  //操作結(jié)果:帶符號(hào)加法運(yùn)算</p&

17、gt;<p>  Status sub(opr1,opr2,oprr)</p><p>  //操作結(jié)果:帶符號(hào)減法函數(shù)</p><p>  Status imul(opr1,opr2,oprr)</p><p>  //操作結(jié)果:乘法運(yùn)算</p><p>  Status idiv(opr1,opr2,quti,remand)

18、</p><p>  //操作結(jié)果:除法運(yùn)算</p><p>  Status imul_power(opr1,n,oprr)</p><p>  //操作結(jié)果:乘方運(yùn)算,運(yùn)用了二分思想,時(shí)間長(zhǎng)度為lgN </p><p>  Status imul_factorial(opr1,oprr)</p><p>  

19、//操作結(jié)果:階乘運(yùn)算</p><p>  Status output(oprr,str)</p><p>  //操作結(jié)果:輸出的數(shù)據(jù)按四位一組,分隔符為","的格式}ADT OrderedOperation</p><p>  鏈表抽象數(shù)據(jù)類型的定義:</p><p><b>  ADT List{<

20、/b></p><p>  數(shù)據(jù)對(duì)象:D={ai|ai∈ElemSet, i=1,2, …,n, n≧0}</p><p>  數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai∈D, i=1,2, …,n }</p><p><b>  基本操作:</b></p><p>  Status init

21、buf(char str[])</p><p>  //操作結(jié)果:緩沖區(qū)部分初始化函數(shù),返回OK</p><p>  int cmplinklen(NodeList opr1,NodeList opr2)</p><p>  //操作結(jié)果:opr1鏈比opr2鏈長(zhǎng)則返回1,短則返回-1,否則返回0</p><p>  int length(N

22、odeList oprr)</p><p>  //操作結(jié)果:計(jì)算鏈表長(zhǎng)度,并返回鏈表長(zhǎng)度的操作數(shù)</p><p>  Status Creat(NodeList &oprr,int len)</p><p>  //操作結(jié)果:生成指定長(zhǎng)度鏈表,返回OK</p><p>  int compare(NodeList opr1,Node

23、List opr2)</p><p>  //操作結(jié)果:比較opr1、opr2絕對(duì)值的大小</p><p>  Status init(NodeList &oppr)</p><p>  //操作結(jié)果:初始化鏈表函數(shù)</p><p>  Status distroy(NodeList &oprr)</p>&l

24、t;p>  //操作結(jié)果:銷毀鏈表函數(shù),返回OK</p><p>  Status evaluate(NodeList &opri,int i)</p><p>  //操作結(jié)果:鏈表短賦值函數(shù),將i的值轉(zhuǎn)換成萬(wàn)進(jìn)制類型,i為整形變量</p><p>  }ADT OrderedList</p><p>  本程序大體包含三個(gè)模

25、塊:</p><p>  (i)主程序模塊:void main()</p><p>  { 初始化;do</p><p>  { 接受命令; 處理命令;}while(“命令”=”退出”)}</p><p>  (ii)集合單元模塊——實(shí)現(xiàn)集合的抽象數(shù)據(jù)類型(iii)結(jié)點(diǎn)結(jié)構(gòu)單元模塊——

26、定義集合的結(jié)點(diǎn)結(jié)構(gòu)</p><p>  各模塊之間的關(guān)系如下:</p><p>  3、本程序細(xì)分為以下幾大功能模塊:</p><p><b>  (i)輸入模塊;</b></p><p><b>  (ii)輸出模塊;</b></p><p>  (iii)預(yù)處理及相關(guān)操作

27、模塊</p><p>  (iv)四則預(yù)算模塊及(包含乘方、階乘);</p><p><b>  (v)主操作模塊;</b></p><p>  五、詳細(xì)設(shè)計(jì)(偽代碼)1、頭文件的定義部分</p><p>  #include <stdio.h> </p><p>  #includ

28、e<cstdio></p><p>  #include<cstring></p><p>  #include<malloc.h></p><p>  #include<conio.h></p><p>  #include<stdlib.h></p><p&g

29、t;  #define LEN sizeof(struct Node)</p><p>  #define MAX 1000</p><p>  #define OK 1</p><p>  #define ERROR 0</p><p>  #define OVERFLOW -1</p><p>

30、;  #define TRUE 1</p><p>  #define FALSE 0</p><p>  typedef char _TCHAR; </p><p>  typedef int Status;</p><p><b>  2、輸入模塊:</b></p><p><b>

31、;  //求指數(shù)函數(shù)值</b></p><p>  int axp(int a,int k)</p><p><b>  {</b></p><p><b>  if(k==0)</b></p><p>  return 1; //k指數(shù)為零的情況</p><p&

32、gt;  for(;k>0;k--) //指數(shù)結(jié)果處理</p><p><b>  r=r*a;</b></p><p><b>  return r;</b></p><p><b>  }</b></p><p><b>  //輸入轉(zhuǎn)換函數(shù)</

33、b></p><p>  Status conversion(char str[],NodeList &oprh)</p><p>  {//將字符串形式的操作數(shù)轉(zhuǎn)換成所需的類型</p><p>  k=buffer=0;</p><p>  oprh=(NodeList)malloc(LEN); //申請(qǐng)長(zhǎng)整數(shù)由字符串轉(zhuǎn)換為

34、鏈表的存儲(chǔ)空間</p><p>  oprh->next=oprh;</p><p>  oprh->prior=oprh;</p><p>  //初始化鏈表的前驅(qū)指針prior指針與后驅(qū)指針next</p><p>  for(i=strlen(str)-1;i>=0;i--) </p><p>

35、;<b>  {</b></p><p>  //出錯(cuò)判斷處理,規(guī)范輸入格式;若輸入格式出錯(cuò),則跳出轉(zhuǎn)換程,并序重新輸入</p><p>  if(str[i]!='-' && str[i]!='+')</p><p><b>  {</b></p><p

36、>  buffer=buffer+(str[i]-'0')*axp(10,k);</p><p><b>  k++;</b></p><p>  if(k==4 || str[i-1]=='-' || str[i-1]=='+' || i==0)</p><p>  {//將新建結(jié)點(diǎn)插入到

37、頭結(jié)點(diǎn)之后 </p><p>  p=(NodeList)malloc(LEN);</p><p>  oprh->next->prior=p;</p><p>  p->prior=oprh;</p><p>  p->next=oprh->next;</p&

38、gt;<p>  oprh->next=p;</p><p>  p->data=buffer;</p><p>  buffer=k=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b&

39、gt;  }</b></p><p>  //根據(jù)字符串輸入的首位字符,確定鏈表的數(shù)據(jù)類型是正整數(shù)還是負(fù)整數(shù),返回OK</p><p><b>  }</b></p><p><b>  //輸入函數(shù)</b></p><p>  Status input(NodeList &op

40、r1,NodeList &opr2,char str[])</p><p><b>  {</b></p><p>  //分別輸入連個(gè)字符串并進(jìn)行判斷,直至輸入成功則返回OK</p><p><b>  }</b></p><p>  Status input1(NodeList &

41、;opr1,int &n,char str[])</p><p><b>  {</b></p><p>  //分別輸入乘方的底數(shù)和指數(shù)兩個(gè)操作數(shù),直至輸入成功返回OK</p><p><b>  }</b></p><p>  Status input2(NodeList &op

42、rr,char str[])</p><p><b>  {</b></p><p>  //只是輸入階乘的一個(gè)正整數(shù),直至輸入成功返回OK</p><p><b>  }</b></p><p><b>  3、輸出模塊:</b></p><p>&l

43、t;b>  //輸出函數(shù)</b></p><p>  Status output(NodeList oprr,char str[])</p><p><b>  {</b></p><p><b>  if(!oprr)</b></p><p>  return ERROR; /

44、/判斷用鏈表記錄的運(yùn)算結(jié)果是否為空(出錯(cuò)),返回FALSE</p><p>  p=oprr; //指針對(duì)鏈表進(jìn)行遍歷</p><p>  initbuf(str); //清空字符串?dāng)?shù)組str的內(nèi)容</p><p>  //符號(hào)位判斷,若為負(fù)數(shù),在字符串的首位加‘—’</p><p>  p=p->nex

45、t;</p><p>  if(p->next==oprr && p->data==0)//若要輸出的數(shù)為0則執(zhí)行</p><p>  str[i++]='0';</p><p><b>  else</b></p><p>  while(p!=oprr)</p>

46、<p><b>  {</b></p><p>  //每千位進(jìn)行取余數(shù)運(yùn)算</p><p>  while(j<4)</p><p><b>  {</b></p><p>  if(num[j]!=0 || (str[0]=='-' && st

47、r[1]!='\0')||(str[0]!='-' && str[0]!='\0'))</p><p>  //此判斷語(yǔ)句是為了避免輸出諸如:00123…的情況</p><p>  //規(guī)范字符串的處理,消除長(zhǎng)整數(shù)前面的0,每四位進(jìn)行一個(gè)循環(huán)操作</p><p><b>  }</b&

48、gt;</p><p>  //指針后移,并重新計(jì)算操作位</p><p><b>  }</b></p><p><b>  //取字符串長(zhǎng)度</b></p><p>  //從低位到高位開(kāi)始,按每四位數(shù)用一個(gè)‘,’將數(shù)據(jù)進(jìn)行分割,并記錄在新的字//符串?dāng)?shù)組str1翻轉(zhuǎn)輸出,并返回OK<

49、;/p><p><b>  }</b></p><p>  預(yù)處理相關(guān)項(xiàng)操作模塊(雙向鏈表的相關(guān)ADT的操作):</p><p>  typedef struct Node </p><p><b>  {</b></p><p>  int data; //數(shù)據(jù)域<

50、/p><p>  struct Node *prior,*next; //前驅(qū)指針prior,后驅(qū)指針next</p><p>  }Node,*NodeList;</p><p>  雙向鏈表的基本操作設(shè)計(jì)如下:</p><p>  Status initbuf(char str[])</p><p>  //操作結(jié)果

51、:緩沖區(qū)部分初始化函數(shù),返回OK</p><p>  int cmplinklen(NodeList opr1,NodeList opr2)</p><p>  //操作結(jié)果:opr1鏈比opr2鏈長(zhǎng)則返回1,短則返回-1,否則返回0</p><p>  int length(NodeList oprr)</p><p>  //操作結(jié)果:計(jì)

52、算鏈表長(zhǎng)度,并返回鏈表長(zhǎng)度的操作數(shù)</p><p>  Status Creat(NodeList &oprr,int len)</p><p>  //操作結(jié)果:生成指定長(zhǎng)度鏈表,返回OK</p><p>  int compare(NodeList opr1,NodeList opr2)</p><p>  //操作結(jié)果:比較op

53、r1、opr2絕對(duì)值的大小</p><p>  Status init(NodeList &oppr)</p><p>  //操作結(jié)果:初始化鏈表函數(shù)</p><p>  Status distroy(NodeList &oprr)</p><p>  //操作結(jié)果:銷毀鏈表函數(shù),返回OK</p><p

54、>  Status evaluate(NodeList &opri,int i)</p><p>  //操作結(jié)果:鏈表短賦值函數(shù),將i的值轉(zhuǎn)換成萬(wàn)進(jìn)制類型,i為整形變量</p><p>  其中部分操作的偽代碼如下:</p><p>  Status initbuf(char str[])</p><p><b> 

55、 {</b></p><p>  //緩沖區(qū)部分初始化函數(shù),返回OK</p><p><b>  }</b></p><p>  //比較鏈表長(zhǎng)度函數(shù)</p><p>  int cmplinklen(NodeList opr1,NodeList opr2)</p><p><b

56、>  {</b></p><p>  //opr1鏈比opr2鏈長(zhǎng)則返回1,短則返回-1,否則返回0</p><p><b>  }</b></p><p>  int length(NodeList oprr)</p><p><b>  {</b></p><

57、;p>  //計(jì)算鏈表長(zhǎng)度,并返回鏈表長(zhǎng)度的操作數(shù)</p><p><b>  }</b></p><p>  Status Creat(NodeList &oprr,int len)</p><p><b>  {</b></p><p>  //生成指定長(zhǎng)度鏈表,返回OK</

58、p><p><b>  }</b></p><p>  int compare(NodeList opr1,NodeList opr2)</p><p>  {//比較opr1、opr2絕對(duì)值的大小</p><p>  p1=opr1->next;</p><p>  p2=opr2->n

59、ext; //取指針進(jìn)行操作</p><p>  if(cmplinklen(opr1,opr2)==1)//opr1比較長(zhǎng)</p><p>  return 1; </p><p>  else if(cmplinklen(opr1,opr2)==-1)//opr2比較長(zhǎng)</p&

60、gt;<p>  return -1; </p><p>  else//長(zhǎng)度相等的情況 </p><p><b>  {</b></p><p>  while(p1->data==p2->data && p1->next!=opr1)&l

61、t;/p><p>  //注意不要少了p1->next!=opr1這個(gè)條件</p><p><b>  {</b></p><p>  p1=p1->next;</p><p>  p2=p2->next;</p><p><b>  }</b></p&g

62、t;<p>  //比較長(zhǎng)度,分別返回操作值-1,0,1</p><p><b>  }</b></p><p><b>  }</b></p><p>  Status init(NodeList &oppr)</p><p><b>  {</b>&l

63、t;/p><p><b>  //初始化鏈表函數(shù)</b></p><p><b>  }</b></p><p>  Status distroy(NodeList &oprr)</p><p><b>  {</b></p><p>  //銷毀鏈

64、表函數(shù),返回OK</p><p>  }//distroy</p><p>  Status evaluate(NodeList &opri,int i)</p><p>  {//鏈表短賦值函數(shù),將i的值轉(zhuǎn)換成萬(wàn)進(jìn)制類型,i為整形變量</p><p>  opri=(NodeList)malloc(LEN);</p>

65、<p>  opri->data='+';</p><p>  opri->next=(NodeList)malloc(LEN);</p><p>  opri->next->data=i;</p><p>  opri->next->next=opri;</p><p>  op

66、ri->prior=opri->next;</p><p>  opri->next->prior=opri;</p><p>  return OK;</p><p>  }//evaluate</p><p><b>  5、加減法模塊</b></p><p><

67、b>  //加法基本操作</b></p><p>  Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr)</p><p>  {//本算法實(shí)現(xiàn)A,B相加的操作。</p><p>  oprr=(NodeList)malloc(LEN);</p><p>

68、;  //初始化前驅(qū)指針prior與后驅(qū)指針next,并用p1,p2進(jìn)行指針操作</p><p>  CF=buffer=0;</p><p>  while(p1!=opr1 && p2!=opr2)</p><p><b>  {</b></p><p>  buffer=p1->data+p2

69、->data+CF;</p><p>  CF=buffer/10000;//若buffer的值大于9999則產(chǎn)生進(jìn)位,賦給CF</p><p>  //將新建結(jié)點(diǎn)插入到頭結(jié)點(diǎn)之后</p><p>  p3=(NodeList)malloc(LEN); //結(jié)點(diǎn)存儲(chǔ)空間</p><p>  oprr->next->prio

70、r=p3;</p><p>  //前驅(qū)指針與后驅(qū)指針互換</p><p>  p3->data=buffer%10000;//應(yīng)該將buffer的第四位賦給p3->data</p><p>  //..........................</p><p>  //指針進(jìn)入下一個(gè)雙向鏈表的結(jié)點(diǎn) </p>

71、;<p><b>  }</b></p><p>  while(p1!=opr1)</p><p>  {//處理opr1鏈的剩余部分</p><p>  buffer=p1->data+CF;</p><p>  CF=buffer/10000;</p><p>  //將

72、新建結(jié)點(diǎn)插入到頭結(jié)點(diǎn)之后</p><p>  p3=(NodeList)malloc(LEN);</p><p>  oprr->next->prior=p3;</p><p>  p3->prior=oprr;</p><p>  p3->next=oprr->next;</p><p>

73、;  oprr->next=p3;</p><p>  p3->data=buffer%10000;</p><p>  //..........................</p><p>  p1=p1->prior;</p><p><b>  }</b></p><p&g

74、t;  while(p2!=opr2)</p><p>  {//處理opr2鏈的剩余部分</p><p>  buffer=p2->data+CF;</p><p>  CF=buffer/10000;</p><p>  //將新建結(jié)點(diǎn)插入到頭結(jié)點(diǎn)之后</p><p>  p3=(NodeList)mallo

75、c(LEN);</p><p>  oprr->next->prior=p3;</p><p>  //前驅(qū)指針與后驅(qū)指針互換</p><p>  p3->data=buffer%10000;</p><p>  //..........................</p><p>  p2=p2

76、->prior;</p><p><b>  }</b></p><p><b>  if(CF)</b></p><p>  {//判定進(jìn)位,并進(jìn)行進(jìn)位操作</p><p>  p3=(NodeList)malloc(LEN);</p><p>  oprr->

77、next->prior=p3;</p><p>  p3->prior=oprr;</p><p>  p3->next=oprr->next;</p><p>  oprr->next=p3;</p><p>  p3->data=CF;</p><p><b>  }&

78、lt;/b></p><p>  //添加長(zhǎng)整數(shù)類型符號(hào),并返回OK</p><p><b>  }</b></p><p><b>  //減法基本操作</b></p><p>  Status sub_bas(NodeList opr1,NodeList opr2,NodeList &am

79、p;oprr)</p><p>  {//本算法實(shí)現(xiàn)A,B相減的操作。</p><p>  //將A鏈分成與B鏈長(zhǎng)相等的底位部分,和剩余的高位部分,并做相應(yīng)處理。</p><p>  oprr=(NodeList)malloc(LEN);</p><p>  //前驅(qū)指針prior與后驅(qū)指針next置空,并用p1,p2進(jìn)行指針操作</p

80、><p>  CF=buffer=flag=0;</p><p>  while(p2!=opr2)</p><p>  {//opr2鏈的長(zhǎng)度小于等于opr1鏈的</p><p>  if(p1->data<(p2->data+CF))</p><p>  //判斷進(jìn)位CF,并進(jìn)行進(jìn)位操作</p&

81、gt;<p>  p3=(NodeList)malloc(LEN);</p><p>  oprr->next->prior=p3;</p><p>  //前驅(qū)指針與后驅(qū)指針互換</p><p>  p3->data=buffer;</p><p>  p1=p1->prior;</p>

82、<p>  p2=p2->prior;</p><p><b>  }</b></p><p>  while(p1!=opr1)</p><p>  {//處理opr1鏈?zhǔn)O碌牟糠?lt;/p><p>  if(p1->data<CF)</p><p>  //判斷進(jìn)位C

83、F,并進(jìn)行進(jìn)位操作</p><p>  p3=(NodeList)malloc(LEN);</p><p>  oprr->next->prior=p3;</p><p>  //前驅(qū)指針與后驅(qū)指針互換</p><p>  p3->data=buffer;</p><p>  p1=p1->p

84、rior;</p><p><b>  }</b></p><p>  //處理鏈表開(kāi)頭結(jié)點(diǎn)值為0的無(wú)意義情況,若鏈表本身表示0,則不做如下處理</p><p>  p3=oprr->next;</p><p>  while(p3->data==0 && p3->next!=oprr)

85、</p><p><b>  {</b></p><p>  p3=p3->next;</p><p><b>  flag=1;</b></p><p><b>  }</b></p><p><b>  if(flag)</b&

86、gt;</p><p><b>  {</b></p><p>  qh=oprr->next;//保存無(wú)用結(jié)點(diǎn)的頭尾指針</p><p>  qt=p3->prior;//為釋放做準(zhǔn)備</p><p>  oprr->next=p3;//重接next鏈</p><p>  p3

87、->prior=oprr;//重接prior鏈</p><p>  qt->next=NULL;</p><p>  while(qh!=NULL)</p><p><b>  {//釋放無(wú)用結(jié)點(diǎn)</b></p><p><b>  qq=qh;</b></p><p

88、>  qh=qh->next;</p><p><b>  free(qq);</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //-------------------------------------

89、-------------------</p><p>  //添加符號(hào),返回OK</p><p><b>  }</b></p><p><b>  //帶符號(hào)加法函數(shù)</b></p><p>  Status add(NodeList opr1,NodeList opr2,NodeList &a

90、mp;oprr)</p><p><b>  {</b></p><p>  //出錯(cuò)處理:若opr1或opr2為空,返回FALSE</p><p>  if(opr1->data==opr2->data)</p><p>  {//opr1,opr2符號(hào)相同</p><p>  ad

91、d_bas(opr1,opr2,oprr);</p><p>  if(opr1->data=='+')//opr1與opr2均為正數(shù),即A+B的形式(A,B均是正數(shù),下同)</p><p>  oprr->data='+';</p><p>  else//opr1與opr2均為負(fù)數(shù),即(-A)+(-B)的形式</

92、p><p>  oprr->data='-';</p><p>  }//if(opr1->data==opr2->data)</p><p><b>  else</b></p><p><b>  {//符號(hào)不相同</b></p><p> 

93、 if(opr1->data=='+')</p><p>  {//A+(-B)的情況</p><p>  if(compare(opr1,opr2)==-1)</p><p><b>  {//A<B的情況</b></p><p>  sub_bas(opr2,opr1,oprr);<

94、/p><p>  oprr->data='-';</p><p>  }//if(compare(opr1,opr2)==-1)</p><p><b>  else</b></p><p>  {//A>=B的情況</p><p>  sub_bas(opr1,opr2,

95、oprr);</p><p>  oprr->data='+';</p><p><b>  }//else</b></p><p>  }//if(opr1->data='+' && opr2->data='-')</p><p><

96、;b>  else</b></p><p>  {//(-A)+B的情況</p><p>  if(compare(opr1,opr2)==1)</p><p><b>  {//A>B的情況</b></p><p>  sub_bas(opr1,opr2,oprr);</p>&l

97、t;p>  oprr->data='-';</p><p>  }//if(compare(opr1,opr2)==1)</p><p><b>  else</b></p><p>  {//A<=B的情況</p><p>  sub_bas(opr2,opr1,oprr);</

98、p><p>  oprr->data='+';</p><p><b>  }//else</b></p><p><b>  }//else</b></p><p><b>  }//else</b></p><p>  return

99、 OK;</p><p><b>  }//add</b></p><p><b>  //帶符號(hào)減法函數(shù)</b></p><p>  Status sub(NodeList opr1,NodeList opr2,NodeList &oprr)</p><p><b>  {<

100、;/b></p><p>  if(opr1==NULL || opr2==NULL)</p><p>  return ERROR;</p><p>  if(opr1->data==opr2->data)</p><p>  {//opr1,opr2符號(hào)相同</p><p>  if(opr1-&

101、gt;data=='+')</p><p><b>  {//A-B的情況</b></p><p>  if(compare(opr1,opr2)==-1)</p><p><b>  {//A<B的情況</b></p><p>  sub_bas(opr2,opr1,oprr

102、);</p><p>  oprr->data='-';</p><p>  }//if(compare(opr1,opr2)==-1)</p><p><b>  else</b></p><p>  {//A>=B的情況</p><p>  sub_bas(opr1

103、,opr2,oprr);</p><p>  oprr->data='+';</p><p><b>  }//else</b></p><p>  }//if(opr1->data='+')</p><p><b>  else</b></p>

104、;<p>  {//(-A)-(-B)的情況</p><p>  if(compare(opr1,opr2)==1)</p><p><b>  {//A>B的情況</b></p><p>  sub_bas(opr1,opr2,oprr);</p><p>  oprr->data='

105、-';</p><p>  }//if(compare(opr1,opr2)==1)</p><p><b>  else</b></p><p>  {//A<=B的情況</p><p>  sub_bas(opr2,opr1,oprr);</p><p>  oprr->d

106、ata='+';</p><p><b>  }//else</b></p><p><b>  }//else</b></p><p>  }//if(opr1->data!=opr2->data)</p><p><b>  else</b>&l

107、t;/p><p>  {//opr1,opr2符號(hào)不同</p><p>  add_bas(opr1,opr2,oprr);</p><p>  if(opr1->data=='+')//A-(-B)</p><p>  oprr->data='+';</p><p>  els

108、e//(-A)-B</p><p>  oprr->data='-';</p><p><b>  }//else</b></p><p>  return OK;</p><p><b>  }//sub</b></p><p><b>  

109、6、乘法模塊</b></p><p><b>  //乘法函數(shù)</b></p><p>  Status imul(NodeList opr1,NodeList opr2,NodeList &oprr)</p><p><b>  {</b></p><p>  if(compa

110、re(opr1,opr2)==-1)</p><p>  //若opr1比opr2小則被乘數(shù)跟乘數(shù)調(diào)換,否則直接取指針操作</p><p>  len=length(opr1)+length(opr2);</p><p>  //創(chuàng)建指定長(zhǎng)度的鏈表oprr</p><p>  qq=oprr->next;</p><

111、p>  while(qq!=oprr)</p><p><b>  {</b></p><p>  qq->data=0;</p><p>  qq=qq->next;</p><p><b>  }</b></p><p>  buffer=CF=0;&l

112、t;/p><p>  p3=oprr->prior;</p><p>  while(pt2!=ph2)</p><p><b>  {</b></p><p>  pt1=ph1->prior;</p><p><b>  pt3=p3;</b></p>

113、<p>  while(pt1!=ph1)</p><p><b>  {</b></p><p>  buffer=pt1->data*pt2->data+pt3->data+CF;</p><p>  CF=(int)buffer/10000;</p><p>  pt3->da

114、ta=(int)buffer%10000;</p><p>  pt1=pt1->prior;</p><p>  pt3=pt3->prior;</p><p><b>  }</b></p><p>  pt3->data=CF;</p><p><b>  CF=

115、0;</b></p><p>  pt2=pt2->prior;</p><p>  p3=p3->prior;</p><p><b>  }</b></p><p>  //處理鏈表開(kāi)頭結(jié)點(diǎn)值為0的無(wú)意義情況,若鏈表本身表示0,則不做如下處理</p><p><b

116、>  flag=0;</b></p><p>  p3=oprr->next;</p><p>  while(p3->data==0 && p3->next!=oprr)</p><p><b>  {</b></p><p>  p3=p3->next;<

117、;/p><p><b>  flag=1;</b></p><p><b>  }</b></p><p><b>  if(flag)</b></p><p><b>  {</b></p><p>  qh=oprr->nex

118、t;//保存無(wú)用結(jié)點(diǎn)的頭尾指針</p><p>  qt=p3->prior;//為釋放做準(zhǔn)備</p><p>  oprr->next=p3;//重接next鏈</p><p>  p3->prior=oprr;//重接prior鏈</p><p>  qt->next=NULL;</p><p&

119、gt;  while(qh!=NULL)</p><p><b>  {//釋放無(wú)用結(jié)點(diǎn)</b></p><p><b>  qq=qh;</b></p><p>  qh=qh->next;</p><p><b>  free(qq);</b></p>

120、<p><b>  }</b></p><p><b>  }</b></p><p>  //鏈表符號(hào)位的添加</p><p><b>  }</b></p><p><b>  7、除法模塊</b></p><p>&

121、lt;b>  //除法子函數(shù)</b></p><p>  int idiv_sub(NodeList &opr1,NodeList opr2)</p><p><b>  {</b></p><p><b>  count=0;</b></p><p>  while(co

122、mpare(opr1,opr2)!=-1)</p><p><b>  {</b></p><p>  CF=buffer=0;</p><p>  p1=opr1->prior;</p><p>  p2=opr2->prior;</p><p>  while(p2!=opr2)&

123、lt;/p><p><b>  {</b></p><p>  if(p1->data<(p2->data+CF))</p><p><b>  {</b></p><p>  buffer=10000+p1->data-(p2->data+CF);</p>

124、<p><b>  CF=1;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  buffer=p1->data-(p2->dat

125、a+CF);</p><p><b>  CF=0;</b></p><p><b>  }</b></p><p>  p1->data=buffer;</p><p>  p1=p1->prior;</p><p>  p2=p2->prior;<

126、/p><p><b>  }</b></p><p>  if(p1!=opr1)//處理opr1鏈?zhǔn)O碌牟糠?lt;/p><p><b>  {</b></p><p>  buffer=p1->data-CF;</p><p>  p1->data=buffer;&l

127、t;/p><p><b>  }</b></p><p><b>  //清頭0</b></p><p><b>  flag=0;</b></p><p>  p1=opr1->next;</p><p>  while(p1->data==0

128、 && p1->next!=opr1)</p><p><b>  {</b></p><p>  p1=p1->next;</p><p><b>  flag=1;</b></p><p><b>  }</b></p><p

129、><b>  if(flag)</b></p><p><b>  {</b></p><p>  qh=opr1->next;//保存無(wú)用結(jié)點(diǎn)的頭尾指針</p><p>  qt=p1->prior;//為釋放做準(zhǔn)備</p><p>  opr1->next=p1;//重接

130、next鏈</p><p>  p1->prior=opr1;//重接prior鏈</p><p>  qt->next=NULL;</p><p>  while(qh!=NULL)</p><p><b>  {//釋放無(wú)用結(jié)點(diǎn)</b></p><p><b>  qq=

131、qh;</b></p><p>  qh=qh->next;</p><p><b>  free(qq);</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  

132、count++;</b></p><p><b>  }</b></p><p>  return count;</p><p><b>  }</b></p><p><b>  //除法函數(shù)</b></p><p>  Status id

133、iv(NodeList opr1,NodeList opr2,NodeList &quti,NodeList &remand)</p><p>  {//quti為商數(shù)鏈,remand為余數(shù)鏈</p><p>  if(compare(opr1,opr2)==-1)</p><p><b>  {</b></p>

134、<p>  //比較除數(shù)與被除數(shù),若除數(shù)比被除數(shù)大,則進(jìn)行余數(shù)處理</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  len_quti=length(opr1)-lengt

135、h(opr2);</p><p>  len_reman=length(opr2); //鏈表長(zhǎng)度處理</p><p>  Creat(quti,len_quti+1);//開(kāi)辟商數(shù)鏈</p><p>  Creat(remand,len_reman);//開(kāi)辟余數(shù)鏈</p><p>  q1=opr1->next;

136、</p><p>  q2=remand->next;</p><p>  //初始化remand鏈</p><p>  while(q2!=remand)</p><p><b>  {</b></p><p>  q2->data=q1->data;</p>&

137、lt;p>  q1=q1->next;</p><p>  q2=q2->next;</p><p><b>  }</b></p><p>  pq=quti->next;</p><p>  q1=q1->prior;//指針退回一步</p><p>  whil

138、e(q1!=opr1)</p><p><b>  {</b></p><p>  buffer=idiv_sub(remand,opr2);</p><p>  pq->data=buffer;</p><p>  if(q1->next!=opr1)</p><p><b&g

139、t;  {</b></p><p>  remand->prior->next=(NodeList)malloc(LEN);</p><p>  remand->prior->next->next=remand;</p><p>  remand->prior->next->prior=remand->

140、;prior;</p><p>  remand->prior=remand->prior->next;</p><p>  remand->prior->data=q1->next->data;</p><p><b>  }</b></p><p>  if(remand-&

141、gt;next->data==0 && remand->next->next!=remand)</p><p><b>  {</b></p><p>  remand->next->next->prior=remand;</p><p>  remand->next=remand-&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ù)僅提供信息存儲(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)論