語言課程設(shè)計報告長整數(shù)四則運算_第1頁
語言課程設(shè)計報告長整數(shù)四則運算_第2頁
語言課程設(shè)計報告長整數(shù)四則運算_第3頁
語言課程設(shè)計報告長整數(shù)四則運算_第4頁
語言課程設(shè)計報告長整數(shù)四則運算_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言課程設(shè)計說明書題目:長整型數(shù)四則運算學(xué) 院:班級:學(xué)生:學(xué)號:班內(nèi)序號:提交日期:年月日目錄一、需求分析 1二、設(shè)計思路 1三、詳細設(shè)計 21、主要函數(shù) 22、函數(shù)的主要調(diào)用關(guān)系圖 3四、調(diào)試分析及編程心得體會 3五、用戶手冊 3六、測試結(jié)果 3七、源程序代碼 41、main.c 主控文件 42、IntFace.h 程序界面模塊頭文件 53、IntFace.c 程序界面處理模塊文件 64、LongInt.h 長整型數(shù)輸入輸入及運算模塊頭文件 85、LongIO.c 長整型數(shù)輸入輸出處理模塊文件 86、LongInt.c 長整型數(shù)運算處理模塊文件 107、DuCiLink.h 雙向循環(huán)鏈表

2、處理模塊頭文件 158、DuCiLink.c 雙向循環(huán)鏈表處理模塊代碼 16一、需求分析1、設(shè)計一個實現(xiàn)任意長的整數(shù)進行四則運算的程序。2、輸入和輸出形式是按中國對于長整數(shù)的表示習(xí)慣,每四位一組,組間用逗號隔開,長整數(shù)位數(shù)沒有上 限,以分號結(jié)束長整型數(shù)據(jù)的輸入。3、程序執(zhí)行的命令包括:1)、輸入長整數(shù) 1;2)、輸入長整數(shù) 2;3)、輸入執(zhí)行的運算符; 4)、計算并輸出結(jié)果; 5)、結(jié)束。4、測試數(shù)據(jù): (以加法為例)(1)、 0;0;+; 應(yīng)輸出“ 0”。(2)、 2345,6789; 7654,3211;+; 應(yīng)輸出“ 1,0000,0000 ”。(3)、 9999,9999;1,0000

3、,0000,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 ”.二、設(shè)計思路我們首先要考慮的是如何表示長整型數(shù)。按照傳統(tǒng)習(xí)慣要求每 4 位數(shù)形成 1 組,而一個長整型數(shù)可能 會有很多組這種 4 位數(shù),而每

4、節(jié)之間是有先后順序的,因此我們可以考慮用數(shù)組和鏈表來存儲數(shù)據(jù)。 (1) 再考慮到每個長整型數(shù)的長度在輸入之間是無法預(yù)知的,因此使用鏈表在存儲空間的分配上更方便一些。(2) 在輸入數(shù)據(jù)時總是從高位到低位地存儲,而計算時總是從低位向高位運算,因此采用雙向鏈表更方便, 而為了從頭結(jié)點方便地轉(zhuǎn)到尾結(jié)點可以采用循環(huán)鏈表??傊?,為了實現(xiàn)上述功能,應(yīng)以雙向循環(huán)鏈表表示 長整數(shù),每個結(jié)點含一個整型變量,且僅絕對值不超過 9999 的整數(shù),整個鏈表用十進制數(shù)表示。 (3) 對于 每一個長整型數(shù)可以設(shè)置一個 頭結(jié)點 ,其中的數(shù)據(jù)域用來表示該長整型數(shù)的正負號及組數(shù),該值的符號則 表示該長整型數(shù)的符號,該數(shù)的絕對值表

5、示該長整型數(shù)包含的 4 位數(shù)的組數(shù)。第一個存儲 4 位數(shù)據(jù)組的結(jié) 點稱為 首結(jié)點 ,而最后一個 4 位數(shù)據(jù)組結(jié)點稱為 尾結(jié)點 。為此需要兩個結(jié)構(gòu)數(shù)據(jù)類型:雙向循環(huán)鏈表和長整數(shù),兩個類型采用相同的結(jié)構(gòu),只是雙向循環(huán)鏈表 用來存儲數(shù)據(jù),長整型用表示數(shù)據(jù)的運算。1、雙向循環(huán)鏈表的數(shù)據(jù)結(jié)構(gòu)及操作定義如下:typedef short ElemType; /定義基本數(shù)據(jù)類型,我們采用 short 來表示任意 4 位整數(shù)。ElemType data;struct DuCiLinkNode *prior;struct DuCiLinkNode *next; DuCiLinkNode,*DuCiLinkList

6、; / 基本操作:DuCiLinkNode *MakeNode(ElemType e); / Status InitList(DuCiLinkList *L); /void DestroyList(DuCiLinkList *L); /typedef struct DuCiLinkNode /雙向循環(huán)鏈表結(jié)點的存儲結(jié)構(gòu)/ 指向上一結(jié)點/ 指向下一結(jié)點定義雙向循環(huán)鏈表結(jié)點及鏈表的類型名以 4 位整數(shù) e 構(gòu)造 1 個雙向循環(huán)鏈表結(jié)點初始化 1 個雙向循環(huán)鏈表,分配 1 個結(jié)點作頭結(jié)點 / 數(shù)據(jù)域賦初值 0,上下結(jié)點指針指向自己消毀 1 個雙向循環(huán)鏈表,釋放它所占用的所有內(nèi)存空間 / 并讓鏈表 *

7、L 指向 NULLvoid ClearList(DuCiLinkList L); / 清除 1 個雙向循環(huán)鏈表,釋放數(shù)據(jù)結(jié)點所占用的內(nèi)存空間/ 保留頭結(jié)點,并將數(shù)據(jù)域置為 0,上下結(jié)點指針指向自己Status InsTail(DuCiLinkList L, ElemType e);/在雙向循環(huán)鏈表 L 的尾結(jié)點之后加入 1 個以 e 為/ 數(shù)據(jù)域的新結(jié)點 , 并返回 OK; 否則返回 ERRO。RStatus InsFirst(DuCiLinkList L, ElemType e);/ 將數(shù)據(jù)元素 e插入在線性鏈表 L 頭結(jié)點之后 ,并返回 OK; 否則返回 ERRO。RStatus Copy

8、List(DuCiLinkList L, DuCiLinkList C);/ 將雙向循環(huán)鏈表 L 復(fù)制到雙向循環(huán)鏈表 C 中。2、長整數(shù)的數(shù)據(jù)類型和和操作定義為:typedef struct DuCiLinkNode LongIntNode,*LongInt;/采用雙向循環(huán)鏈表為實際的存儲結(jié)構(gòu)void OutputNumber(LongInt a); / 輸出一個長整型數(shù)void InputNumber(LongInt a,int OneOrTwo); void add(LongInt c,LongInt a,LongInt b); void sub(LongInt c,LongInt a,L

9、ongInt b); Status mul(LongInt c,LongInt a,LongInt b); void div(LongInt c,LongInt a,LongInt b); void rem(LongInt c,LongInt a,LongInt b); void power(LongInt c,LongInt a,int n);3、 本程序包含四個模塊: 1) 主程序模塊: void main() 初始化; do 接受命令; 處理命令; while( “命令” =“結(jié)束” ) 2) 3) 4) 5)/main.c程序界面模塊 雙向循環(huán)鏈表處理模塊 長整型數(shù)的輸入輸出模塊 長整

10、數(shù)運算模塊/輸入一個長整型數(shù) 長整型數(shù) 長整型數(shù) 長整型數(shù) 長整型數(shù) 長整型數(shù) 長整型數(shù)c = a + b c = a - b c = a * b c = a / b ( c = a % b ( c = a n (整除) 求余 ) 乘方 )/IntFace.c, IntFace.h /DuCiLink.c,DuCiLink.h /LongIO.c, LongInt.h /LongInt.c LongInt.h各模塊之間的調(diào)用關(guān)系如下:三、詳細設(shè)計1、主要函數(shù)(1) 、主控模塊 main.c void DoCommand() void Calculate() void ReSet()(2) 、程

11、序界面模塊 void InitiInterface(); void GoToCmdxy(); void GoToPrompt(); void ShowMainPrompt(); void ClearScreen(); void ClearPromptLine(); / void ClearWorkSpace();根據(jù)輸入命令進行相應(yīng)的處理執(zhí)行計算功能重設(shè)系統(tǒng)環(huán)境IntFace.c/void InputNumberBox(int OneOrTwo);/ void ResultBox();(3) 、長整型數(shù)輸入輸出模塊 (4) 、長整型數(shù)四則運算處理模塊(5) 、長整型數(shù)存儲模塊雙向循環(huán)鏈表模塊見

12、二小節(jié)界面初始化 將光標定位到命令選項提示之后 將光標定位到命令選項提示行首 顯示命令選項提示以清除整個屏幕,并設(shè)置為黑底白字模式清除提示行的顯示清除工作區(qū)的顯示 指定兩個輸入數(shù)的輸入窗口,如果超過這個范圍文字將自動流動/ 指定計算結(jié)果的顯示窗口,如果超過這個范圍文字將自動流動 見二小節(jié) 2 分節(jié) 見二小節(jié) 2 分節(jié)1 分節(jié)2、函數(shù)的主要調(diào)用關(guān)系圖ClearListInsTailInsFirstCopyListInitList DestroyList四、調(diào)試分析及編程心得體會1、剛開始考慮進位問題過于簡單,導(dǎo)致測試數(shù)據(jù)時多次出錯。 2、剛開始時在輸入方式中花了較大功夫,而且用戶界面不夠友好,程

13、序容錯性較差。3、開始寫程序時源程序沒有嚴格按單元模塊結(jié)構(gòu)編寫,可讀性較差。4、由于初次進行系統(tǒng)的程序設(shè)計,層次結(jié)構(gòu)劃分不太合理,應(yīng)在以后的設(shè)計中強化此思維,逐漸與 工程設(shè)計接軌。五、用戶手冊1、本程序的運行環(huán)境為 DOS操作系統(tǒng),執(zhí)行文件為 LongInt.exe2、進入演示程序后即顯示文本方式的用戶界面3、輸入命令,執(zhí)行相應(yīng)的功能:1 輸入第 1 個整數(shù)o,O輸入運算符 r,R 重置系統(tǒng)2 輸入第 2個整數(shù)c,C 執(zhí)行運算 q,Q 退出系統(tǒng)六、測試結(jié)果1)、0和 0的四則運算:應(yīng)輸出“ 1,0000,00002)、-2345,6789;-7654,3211;+;3)、9999,9999;1

14、,0000,0000,0000;+; 應(yīng)輸出“ 9999,0000,00014)、 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,99987) 1,0000,9999,9999;1;+; 應(yīng)輸出“ 1,0001,0000,0000七、源程序代碼/*1、 main.c 主控文件*/#include IntFace.h/*#include LongInt.h/* char cmd;界面

15、模塊頭文件 */ 長整型數(shù)處理模塊頭文件 */ /* menu command */char opt; int n; LongInt a,b,c;/* operator */* power */* Long integer numbers */int flag_n1=0,flag_n2=0,flag_opt=0,flag_cal=0,flag_reset=1;/*標志位 */void ReSet() /* Reset system */ClearWorkSpace(); flag_n1=0; flag_n2=0; flag_opt=0; flag_cal=0; flag_reset=1;/ 清

16、屏幕的工作區(qū)/ 重置長整數(shù) 1 是否輸入的標志 / 重置長整數(shù) 2 是否輸入的標志 / 重置運算符 是否輸入的標志 / 重置是否進行了運算的標志/ 重置 重置標志void Calculate() / 執(zhí)行計算int overflow = OK;if (flag_n1*flag_n2*flag_opt = 0 ) return;/*Input is not complete!輸入不完整則直接返回 */switch (opt)case +: add(c,a,b); break;/執(zhí)行加法運算case -: sub(c,a,b); break;/執(zhí)行減法運算case *: mul(c,a,b); b

17、reak;/執(zhí)行乘法運算case /: overflow = div(c,a,b); break;/執(zhí)行整除運算case %: rem(c,a,b); break;/執(zhí)行求余運算case : n = b-prior-data;power(c,a,n); break;/ 暫時以長整數(shù) b 的最后一組數(shù)據(jù)為冪,執(zhí)行乘方運算;gotoxy(2,10);/ 定位到輸出位置cprintf(overflow=OK ? Result = :DivideBy);/ 輸出結(jié)果提示 ResultBox();/ 控制輸出范圍,以免搞亂程序界面OutputNumber(c);/ 輸出運算結(jié)果ClearList(c);

18、window(1,1,80,25);/ 清空長整數(shù) c/ 重新設(shè)置顯示窗口為全屏幕void DoCommand() / 根據(jù)輸入命令進行相應(yīng)的處理 switch(cmd)case 1:InputNumber(a,1);flag_n1=1;break;case 2:InputNumber(b,2);flag_n2=1;break;case O:case o:opt=InputOperator();flag_opt=1;break;case C:case c:Calculate();flag_cal=1;break;case R:/ 輸入第 1 個長整數(shù)/ 輸入第 2 個長整數(shù)/ 輸入運算符/ 執(zhí)

19、行運算case r:ReSet();/ 重設(shè)系統(tǒng)以便執(zhí)行下一次運算void main()InitiInterface();/ 初始化程序界面InitList(&a); / 初始化長整形數(shù)據(jù) a,b,cInitList(&b);InitList(&c);doGoToCmdxy(); / 將光標定位到輸入命令處 cmd = getche(); / 讀取一個操作命令 DoCommand(); / 執(zhí)行相應(yīng)的命令while(cmd!=q & cmd != Q); /如果輸入的是 Q或 q 則退出DestroyList(&a); / 銷毀長整形數(shù)據(jù) a,b,c ,釋放它們所占的 DestroyList(

20、&b);DestroyList(&c);ClearScreen(); / 清除屏幕上的顯示/*2、 IntFace.h 程序界面模塊頭文件#include #include #define NofMenuItem 6#define IntMenuItem 2struct IntFaceTypeint height;int width;char ProgramName30;char MenuItemsNofMenuItem12;/ int MaxItemLength;char prompt40;int backcolor;int textcolor;int WaitCmdx;int WaitCm

21、dy;/ 界面高度/ 界面寬度/ 程序名功能選項/ 功能選項名最大長度/ 命令選項提示/ 界面背景/ 文本顏色/ 功能選項輸入坐標 x/ 功能選項輸入坐標 yvoid DrawIntFace()int i,j,LenProgramName,len;putch(218);LenProgramName = strlen(IntFace.ProgramName); / len = (IntFace.width - 4 - LenProgramName)/2; / for(i=0;ilen;i+) putch(196); putch( );cputs(IntFace.ProgramName);putc

22、h( );/ for(i=0;ilen;i+) putch(196); putch(191); gotoxy(1,2);putch(179); for(i=0;iIntMenuItem;i+) putch( ); for(j=0;jNofMenuItem;j+) /畫左上角的轉(zhuǎn)角線 計算程序名稱的長度 計算程序名稱左右橫線的長度 畫橫線顯示程序名畫橫線畫右上角的轉(zhuǎn)角線/ 畫第 2 行首的豎線 輸出選項前的空格 輸出各個選項;void InitiInterface();/界面初始化void GoToCmdxy();/將光標定位到命令選項提示之后void GoToPrompt();/將光標定位到命

23、令選項提示行首void ShowMainPrompt(); /顯示命令選項提示void ClearScreen();/ 以清除整個屏幕,并設(shè)置為黑底白字模式void ClearPromptLine(); /清除提示行的顯示void ClearWorkSpace();/ 清除工作區(qū)的顯示void InputNumberBox(int OneOrTwo);/ 指定兩個輸入數(shù)的輸入窗口,如果超過這個范圍文字將自動流動 void ResultBox();/ 指定計算結(jié)果的顯示窗口,如果超過這個范圍文字將自動流動3、IntFace.c 程序界面處理模塊文件 */ #include IntFace.h#i

24、nclude dos.h/* 界面長寬及菜單等數(shù)據(jù),具體含義見頭文件 */ struct IntFaceType IntFace = 14,40,Long Integer Calcultor,Number 1 ,Number 2 ,Operator ,Calculate,Reset , Quit ,9,Enter a hotkey: 1,2,O,C,R or Q:,BLUE,WHITE;/* 畫界面框架、顯示程序功能選項、輸入提示等 Long Integer Calcultor Number 1 Number 2 Operator Calculate Reset Quit*/Enter a h

25、otkey: 1,2,O,C,R or Q:cputs(IntFace.MenuItemsj);for(i=0;iIntMenuItem;i+) putch( );putch(179);gotoxy(1,3);putch(195);for(i=0;iIntFace.width-2;i+) putch(196); putch(180);for(j=4;jIntFace.height-2;j+)/畫第 2 行尾的豎線/畫第 3 行首的三岔線畫第 3 行的橫線畫第 3 行尾的三岔線 顯示中間的工作區(qū)gotoxy(1,j);putch(179);for(i=0;iIntFace.width-2;i+)

26、 putch( );/ putch(179);gotoxy(1,IntFace.height-2);putch(195); for(i=0;iIntFace.width-2;i+) putch(196); putch(180);gotoxy(1,IntFace.height-1);putch(179);len = strlen(IntFmpt);cputs(IntFmpt);for(i=0;iIntFace.width-2-len;i+) putch( ); putch(179);gotoxy(1,IntFace.height);putch(192); for(i=

27、0;iIntFace.width-2;i+) putch(196); putch(217);void InitiInterface()/ 到第 j 行首/ 畫行首的豎線 畫中間的空白/ 畫行尾的豎線/ 畫倒數(shù)第 3 行的橫線/ 顯示倒數(shù)第 2 行的輸入提示/ 畫最后一行的橫線/ 界面初始化/計算選項菜單行的總長度int i, len, lenprompt; for(i=0;i IntFace.MaxItemLength) IntFace.MaxItemLength = len;len = (IntFace.MaxItemLength + IntMenuItem) * NofMenuItem +

28、 IntMenuItem + 2;/ 輸入提示的長度界面的最終寬度界面的最終高度/ 命令輸入處的 X 坐標/ 命令輸入處的 Y 坐標/ 清屏,以便顯示程序界面/ 設(shè)置界面的背景顏色/ 設(shè)置界面的文本顏色/ 畫出界面lenprompt = strlen(IntFmpt);if (len lenprompt) len = lenprompt;if (IntFace.width len) IntFace.width = len;/ if (IntFace.height 9) IntFace.height = 9; / IntFace.WaitCmdx = lenprompt+2; In

29、tFace.WaitCmdy = IntFace.height - 1; clrscr(); textbackground(IntFace.backcolor); textcolor(IntFace.textcolor); DrawIntFace();void ClearScreen()/ 以清除整個屏幕,并設(shè)置為黑底白字的DOS傳統(tǒng)模式textbackground(BLACK); textcolor(WHITE);clrscr();void ClearPromptLine()/* 清除提示行的顯示 */int i;gotoxy(2,IntFace.height-1); / 到倒數(shù)第 2 行首

30、 for(i=0;iIntFace.width-2;i+) putch( );/用空格覆蓋原有內(nèi)容GoToPrompt();void ClearWorkSpace()/* 清除工作區(qū)的顯示 */int i,j;for(j=4;jIntFace.height-2;j+)gotoxy(2,j);/到第 j 行首用空格覆蓋原有內(nèi)容for(i=0;iIntFace.width-2;i+) putch( );/ void GoToCmdxy()gotoxy(IntFace.WaitCmdx, IntFace.WaitCmdy);void GoToPrompt() /* 將光標定位到命令選項提示行首 go

31、toxy(2,IntFace.height-1);void ShowMainPrompt() /* 顯示命令選項提示 */* 將光標定位到命令選項提示之后*/*/ClearPromptLine();cputs(IntFmpt);void InputNumberBox(int OneOrTwo) /* 指定兩個輸入數(shù)的輸入窗口,如果超過這個范圍文字將自動流動 window(11,(OneOrTwo=1)?4:6,IntFace.width-1,(OneOrTwo=1)?5:7); clrscr();void ResultBox()*/* 指定計算結(jié)果的顯示窗口,如果超過這個范圍文字

32、將自動流動 window(11,10,IntFace.width-1,11);clrscr();*/*4、LongInt.h 長整型數(shù)輸入輸出及運算模塊頭文件*/采用雙向循環(huán)鏈表為實際的存儲結(jié)構(gòu)#include DuCiLink.htypedef struct DuCiLinkNode LongIntNode,*LongInt;/void OutputNumber(LongInt a);/輸出一個長整型數(shù)void InputNumber(LongInt a,int OneOrTwo);/輸入一個長整型數(shù)void add(LongInt c,LongInt a,LongInt b);/長整型數(shù)c

33、 =a + bvoid sub(LongInt c,LongInt a,LongInt b);/長整型數(shù)c =a - bvoid mul(LongInt c,LongInt a,LongInt b);/長整型數(shù)c =a * bStatus div(LongInt c,LongInt a,LongInt b); /長整型數(shù)c =a / b (整除 )void rem(LongInt c,LongInt a,LongInt b);/長整型數(shù)c =a % b (求余 )void power(LongInt c,LongInt a,int n);/長整型數(shù)c =a n (乘方 )/*5、LongIO.

34、c 長整型數(shù)輸入輸出處理模塊文件*/ #include Intface.h#include LongInt.h/* 輸出長整型數(shù)*/#include void OutputNumber(LongInt a)LongIntNode *s;s = a-next;if(a-data data,(s = a-prior)?0:,); s = s-next;while(s!=a)/* 其它每節(jié)顯示 4 位數(shù),不足的以 0 補齊 */ cprintf(%04d%c,s-data,(s = a-prior)?0:,); s = s-next;void InputNumberMsg(int OneOrTwo)

35、 /* 顯示輸入兩個長整型時提示 */ window(1,1,80,25);ClearPromptLine(); cputs(Example:-1,0001,0001;); gotoxy(2,(OneOrTwo=1)?4:6);cprintf(Number %d:,OneOrTwo);InputNumberBox(OneOrTwo);void InputNumberErrMsg() /* 輸入出錯時的提示 */ window(1,1,80,25); ClearPromptLine();cprintf(One number out of 0-9999! Please input the whol

36、e number again!); getch();void InputNumber(LongInt a,int OneOrTwo) /* 輸入長整型數(shù) */char c;short e;short sign = 0;short FirstSection = 1; / 記錄輸入時的逗號和分號/ 記錄輸入數(shù)據(jù)/ 記錄長整型數(shù)的符號 是否是第 1個 4位數(shù)據(jù)組LongIntNode *pa,*s; / 節(jié)點的臨時指針 InputNumberMsg(OneOrTwo);/ 顯示輸入提示ClearList(a); fflush(stdin);/ 清空長整型數(shù)的存儲空間/ 刷清輸入緩沖區(qū),以避免以前錯誤

37、按鍵的殘留docscanf(%d,&e);c = getche();/ 讀取數(shù)據(jù)if (FirstSection) / 如果是第 1 個組, 則設(shè)置整型數(shù)的符號 if(e=0) sign = 1; if(e0) sign = -1;e *= -1; FirstSection = 0;if(e9999) / 如果每組的數(shù)值不在 0-9999 之內(nèi)則報錯并要求重輸整個長整型數(shù)InputNumberErrMsg();InputNumberMsg(OneOrTwo);FirstSection = 1;ClearList(a);fflush(stdin);/* 刷清輸入緩沖區(qū) */ c=,;else/

38、如果本組數(shù)值符合要求則加入到長整型數(shù)據(jù)中InsTail(a,e); a-data+; while(c!=;); pa = a-next; /pa while (pa-data = 0 & pa-next != a) / 在長整型數(shù)尾端加入本組數(shù)據(jù)/ 組數(shù)加 1指向首結(jié)點/* 輸入時可在前幾節(jié)輸入多個 s = pa; pa = pa-next; a-next = pa;pa-prior = a; free(s);a-data-;/ 數(shù)值為 0 且不是尾結(jié)點則刪除 0,需要刪除,但又不能將 0刪除完 */ /s 指向當(dāng)前結(jié)點 ,pa 指向下結(jié)點 斷開對 s 的鏈接/釋放 s 組數(shù)減 1a-data

39、 *= sign;InputNumberMsg(OneOrTwo);OutputNumber(a);window(1,1,80,25);ShowMainPrompt();char InputOperator()/設(shè)置長整型數(shù)的符號以正規(guī)格式顯示長整數(shù) 1重置顯示窗為整個屏幕 回到功能選項等待命令輸入輸入運算符char opt; window(1,1,80,25); ClearPromptLine(); cputs(Input the operation type ( + - * / % ); gotoxy(2,8); cprintf(Operator:); fflush(stdin);do o

40、pt = getche(); gotoxy(11,8);while(opt!=+ & opt!=- & opt!=& opt!=/ & opt!=% & opt!=);/輸入字符是否符合要求ShowMainPrompt(); / 回到功能選項等待命令輸入 return opt;/ 刷清輸入緩沖區(qū)/ 回退 1 格以便再次輸入/*6、LongInt.c 長整型數(shù)運算處理模塊文件 */ #include LongInt.hStatus UnsignedAdd(LongInt c,LongInt a,LongInt b) /* 無符號數(shù)相加,是普通加減法的基礎(chǔ) */short sum,carry=0;

41、 /進位LongIntNode *pa,*pb;pa = a-prior;/*pa,pb 分別指兩個加數(shù)的尾結(jié)點 */pb = b-prior;while(pa!=a & pb!=b)/* a 和 b 中都有沒加的組時,執(zhí)行加法 */sum = pa-data + pb-data + carry;carry = sum / 10000; /* 進位 */sum = sum % 10000; /* 余數(shù),為當(dāng)前組的數(shù)值 */if (!InsFirst(c,sum) return ERROR;/*加到和長整型數(shù)的首位 */pa = pa-prior;/* 下一組 */pb = pb-prior;c

42、-data+;/* 組數(shù)加 1*/while(pa!=a)/* a 中還有沒加的組時,補到和上去 */sum = pa-data + carry;carry = sum / 10000;sum = sum % 10000;if (!InsFirst(c,sum) return ERROR;pa = pa-prior;c-data+;while(pb!=b)/* b 中還有沒加的組時,補到和上去 */sum = pb-data + carry;carry = sum / 10000;sum = sum % 10000;if (!InsFirst(c,sum) return ERROR;pb =

43、pb-prior;c-data+;if(carry)/* 如果還有進位 */if (!InsFirst(c,carry) return ERROR;c-data+;return OK;Status UnsignedSub(LongInt c,LongInt a,LongInt b) /* 無符號數(shù)相減,總是用絕對值大的數(shù)減絕對小的數(shù)是普通加減法的基礎(chǔ) */short diff,borrow=0;LongIntNode *pa,*pb,*pc,*s;pa = a-prior;pb = b-prior;while(pa!=a & pb!=b)diff = pa-data - borrow - pb

44、-data;if (diff prior;pb = pb-prior;c-data+;while(pa!=a)diff = pa-data - borrow;if (diff prior;c-data+;if(borrow | pb!=b) return PleaseExchange;/* 不夠減,提請調(diào)用程序交換 a,b */pc = c-next;while (pc-data = 0 & pc-next != c)/* 相減可能造成前幾節(jié)數(shù)據(jù)為 0,需要刪除,但結(jié)果為零時又不能將0刪除完 */s = pc; pc = pc-next;c-next = pc;pc-prior = c;fre

45、e(s);c-data-;return OK;void add(LongInt c,LongInt a,LongInt b)if (a-data * b-data) 0) /* 兩數(shù)同號,則執(zhí)行無符號加法,零為當(dāng)成正數(shù)處理 */ UnsignedAdd(c,a,b);c-data *= (a-data=0)?1:-1;else/* 兩數(shù)異號,則執(zhí)行無符號減法 */* 總是用絕對值大的數(shù)減絕對小的數(shù) */if(UnsignedSub(c,a,b) = PleaseExchange) /* a 不夠 b 減,則交換 a,b 的順序再減 */ClearList(c);UnsignedSub(c,b,

46、a);c-data *= (b-data=0)?1:-1;else/* a 夠 b 減 */c-data *= (a-data=0)?1:-1;void sub(LongInt c,LongInt a,LongInt b) /* 變減法為加法 */b-data *= -1;add(c,a,b);b-data *= -1;void mul(LongInt c,LongInt a,LongInt b)long product,carry=0; /進位short sum;LongIntNode *pa,*pb,*pcend,*pccur,*pc,*s;pa = a-prior;/* 從 a 的尾結(jié)點

47、,即最后一個 4 位組開始 */pcend = c;/* 記錄 a 的每一組與 b 相乘時最低位應(yīng)加到積的哪一組之前 */while(pa!=a) /* 只要 a 中還有結(jié)點未納入運算,則循環(huán) */if (pa-data = 0)/* 如果 a 的當(dāng)前 4 位組為 0,則直接加 0*/InsFirst(c,0); c-data+;elsepccur = pcend-prior;/*記錄乘數(shù)應(yīng)加到積的哪一組 */pb = b-prior; /*取 b 的每組與 a 的當(dāng)前組相乘 */while(pb!=b) /* 特別注意兩個 0-9999 以內(nèi)的數(shù)相乘需要用 long 來記錄,否則會有溢出 *

48、/product = carry + (long)pa-data * (long)pb-data;carry = product / 10000;/* product = product % 10000;/* if (pccur = c) /* InsFirst(c,(short)product); pccur = c-next;c-data+;else /* 以前的運算已經(jīng)插入過本進位 */余數(shù),也即當(dāng)前組的值 */ 需要新的結(jié)點來存放數(shù)據(jù) */4 位組,則增加到當(dāng)前組上*/sum = pccur-data + (short)product;if (sum 9999)carry+; sum

49、-= 10000; pccur-data = sum;pccur = pccur-prior; /* 移動乘積數(shù)的當(dāng)前指針 */ pb = pb-prior; /* 移動被乘數(shù)的當(dāng)前指針 */ /* 如果還有進位,則加上去 */ if(carry0) InsFirst(c,(short)carry);carry = 0;c-data+;/* 清空進位器,并將 4 位數(shù)組數(shù)加 1*/ pcend = pcend-prior; /* 乘積數(shù)的最低位上移一組 */ pa = pa-prior; /* 乘數(shù)上移一組 */c-data *= (a-data * b-data)=0)?1:-1;pc = c-next;while (pc-data = 0 & pc-next != c) /* 相乘可能造成前幾節(jié)數(shù)據(jù)為0,需要刪除,但結(jié)果為零時又不能將0 刪除完 */s = pc; pc = pc-next;c-next = pc; pc-prior = c;

溫馨提示

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

評論

0/150

提交評論