版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì) 長(zhǎng)整數(shù)四則運(yùn)算
- c語(yǔ)言課程設(shè)計(jì)報(bào)告-長(zhǎng)整數(shù)四則運(yùn)算
- c語(yǔ)言課程設(shè)計(jì)報(bào)告-長(zhǎng)整數(shù)四則運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--長(zhǎng)整數(shù)的四則運(yùn)算
- c語(yǔ)言畢業(yè)課程設(shè)計(jì)報(bào)告-長(zhǎng)整數(shù)四則運(yùn)算
- 大整數(shù)的四則運(yùn)算課程設(shè)計(jì)
- 整數(shù)四則運(yùn)算總結(jié)與練習(xí)
- eda課程設(shè)計(jì)--2位十進(jìn)制四則運(yùn)算器電路四則運(yùn)算器
- eda課程設(shè)計(jì)之2位十進(jìn)制四則運(yùn)算器電路四則運(yùn)算器
- 分?jǐn)?shù)四則運(yùn)算習(xí)題
- 1 四則運(yùn)算 2、四則混合運(yùn)算(有括號(hào))
- 匯編語(yǔ)言課程設(shè)計(jì)--四則運(yùn)算計(jì)算器
- 微機(jī)原理與接口技術(shù)課程設(shè)計(jì)--四則運(yùn)算
- 四則運(yùn)算練習(xí)題
- 小學(xué)四則運(yùn)算500道
- 四則運(yùn)算規(guī)律及其簡(jiǎn)便運(yùn)算
- 整數(shù)四則混合運(yùn)算教學(xué)設(shè)計(jì)
- 整數(shù)四則混合運(yùn)算教學(xué)設(shè)計(jì)
- 實(shí)驗(yàn)一 復(fù)數(shù)四則運(yùn)算
- 小型四則運(yùn)算程序講解
評(píng)論
0/150
提交評(píng)論