




已閱讀5頁(yè),還剩14頁(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)介
C語(yǔ)言課程設(shè)計(jì)說(shuō)明書題目: 長(zhǎng)整型數(shù)四則運(yùn)算 學(xué) 院: 班 級(jí): 學(xué) 生: 學(xué) 號(hào): 班內(nèi)序號(hào): 提交日期: 年 月 日 目 錄一、需求分析1二、設(shè)計(jì)思路1三、詳細(xì)設(shè)計(jì)21、主要函數(shù)22、函數(shù)的主要調(diào)用關(guān)系圖3四、調(diào)試分析及編程心得體會(huì)3五、用戶手冊(cè)3六、測(cè)試結(jié)果3七、源程序代碼41、 main.c 主控文件42、IntFace.h 程序界面模塊頭文件53、IntFace.c 程序界面處理模塊文件64、LongInt.h 長(zhǎng)整型數(shù)輸入輸入及運(yùn)算模塊頭文件95、LongIO.c 長(zhǎng)整型數(shù)輸入輸出處理模塊文件96、LongInt.c 長(zhǎng)整型數(shù)運(yùn)算處理模塊文件117、DuCiLink.h 雙向循環(huán)鏈表處理模塊頭文件168、DuCiLink.c 雙向循環(huán)鏈表處理模塊代碼17一、需求分析1、 設(shè)計(jì)一個(gè)實(shí)現(xiàn)任意長(zhǎng)的整數(shù)進(jìn)行四則運(yùn)算的程序。2、 輸入和輸出形式是按中國(guó)對(duì)于長(zhǎng)整數(shù)的表示習(xí)慣,每四位一組,組間用逗號(hào)隔開,長(zhǎng)整數(shù)位數(shù)沒(méi)有上限,以分號(hào)結(jié)束長(zhǎng)整型數(shù)據(jù)的輸入。3、 程序執(zhí)行的命令包括:1)、輸入長(zhǎng)整數(shù)1;2)、輸入長(zhǎng)整數(shù)2;3)、輸入執(zhí)行的運(yùn)算符;4)、計(jì)算并輸出結(jié)果;5)、結(jié)束。4、測(cè)試數(shù)據(jù):(以加法為例)(1)、0;0;+;應(yīng)輸出“0”。(2)、;+;應(yīng)輸出“”。(3)、; 0000;+;應(yīng)輸出“01”.(4)、;+;應(yīng)輸出“0”.(5)、;+;應(yīng)輸出“1”。(6)、99;99;+;應(yīng)輸出“9998”.(7)9999;1;+;應(yīng)輸出“0000”.二、設(shè)計(jì)思路我們首先要考慮的是如何表示長(zhǎng)整型數(shù)。按照傳統(tǒng)習(xí)慣要求每4位數(shù)形成1組,而一個(gè)長(zhǎng)整型數(shù)可能會(huì)有很多組這種4位數(shù),而每節(jié)之間是有先后順序的,因此我們可以考慮用數(shù)組和鏈表來(lái)存儲(chǔ)數(shù)據(jù)。(1)再考慮到每個(gè)長(zhǎng)整型數(shù)的長(zhǎng)度在輸入之間是無(wú)法預(yù)知的,因此使用鏈表在存儲(chǔ)空間的分配上更方便一些。(2)在輸入數(shù)據(jù)時(shí)總是從高位到低位地存儲(chǔ),而計(jì)算時(shí)總是從低位向高位運(yùn)算,因此采用雙向鏈表更方便,而為了從頭結(jié)點(diǎn)方便地轉(zhuǎn)到尾結(jié)點(diǎn)可以采用循環(huán)鏈表??傊?,為了實(shí)現(xiàn)上述功能,應(yīng)以雙向循環(huán)鏈表表示長(zhǎng)整數(shù),每個(gè)結(jié)點(diǎn)含一個(gè)整型變量,且僅絕對(duì)值不超過(guò)9999的整數(shù),整個(gè)鏈表用十進(jìn)制數(shù)表示。(3)對(duì)于每一個(gè)長(zhǎng)整型數(shù)可以設(shè)置一個(gè)頭結(jié)點(diǎn),其中的數(shù)據(jù)域用來(lái)表示該長(zhǎng)整型數(shù)的正負(fù)號(hào)及組數(shù),該值的符號(hào)則表示該長(zhǎng)整型數(shù)的符號(hào),該數(shù)的絕對(duì)值表示該長(zhǎng)整型數(shù)包含的4位數(shù)的組數(shù)。第一個(gè)存儲(chǔ)4位數(shù)據(jù)組的結(jié)點(diǎn)稱為首結(jié)點(diǎn),而最后一個(gè)4位數(shù)據(jù)組結(jié)點(diǎn)稱為尾結(jié)點(diǎn)。為此需要兩個(gè)結(jié)構(gòu)數(shù)據(jù)類型:雙向循環(huán)鏈表和長(zhǎng)整數(shù),兩個(gè)類型采用相同的結(jié)構(gòu),只是雙向循環(huán)鏈表用來(lái)存儲(chǔ)數(shù)據(jù),長(zhǎng)整型用表示數(shù)據(jù)的運(yùn)算。1、 雙向循環(huán)鏈表的數(shù)據(jù)結(jié)構(gòu)及操作定義如下:typedef short ElemType; /定義基本數(shù)據(jù)類型,我們采用short來(lái)表示任意4位整數(shù)。typedef struct DuCiLinkNode / 雙向循環(huán)鏈表結(jié)點(diǎn)的存儲(chǔ)結(jié)構(gòu)ElemType data;struct DuCiLinkNode *prior;/指向上一結(jié)點(diǎn)struct DuCiLinkNode *next;/指向下一結(jié)點(diǎn)DuCiLinkNode,*DuCiLinkList; /定義雙向循環(huán)鏈表結(jié)點(diǎn)及鏈表的類型名基本操作:DuCiLinkNode *MakeNode(ElemType e); /以4位整數(shù)e構(gòu)造1個(gè)雙向循環(huán)鏈表結(jié)點(diǎn)Status InitList(DuCiLinkList *L); /初始化1個(gè)雙向循環(huán)鏈表,分配1個(gè)結(jié)點(diǎn)作頭結(jié)點(diǎn)/數(shù)據(jù)域賦初值0,上下結(jié)點(diǎn)指針指向自己void DestroyList(DuCiLinkList *L); /消毀1個(gè)雙向循環(huán)鏈表,釋放它所占用的所有內(nèi)存空間/并讓鏈表*L指向NULLvoid ClearList(DuCiLinkList L); /清除1個(gè)雙向循環(huán)鏈表,釋放數(shù)據(jù)結(jié)點(diǎn)所占用的內(nèi)存空間/保留頭結(jié)點(diǎn),并將數(shù)據(jù)域置為0,上下結(jié)點(diǎn)指針指向自己Status InsTail(DuCiLinkList L, ElemType e); /在雙向循環(huán)鏈表L的尾結(jié)點(diǎn)之后加入1個(gè)以e為/數(shù)據(jù)域的新結(jié)點(diǎn),并返回OK; 否則返回ERROR。Status InsFirst(DuCiLinkList L, ElemType e);/將數(shù)據(jù)元素e插入在線性鏈表L頭結(jié)點(diǎn)之后,并返回OK; 否則返回ERROR。Status CopyList(DuCiLinkList L, DuCiLinkList C);/將雙向循環(huán)鏈表L復(fù)制到雙向循環(huán)鏈表C中。2、 長(zhǎng)整數(shù)的數(shù)據(jù)類型和和操作定義為:typedef struct DuCiLinkNode LongIntNode,*LongInt;/采用雙向循環(huán)鏈表為實(shí)際的存儲(chǔ)結(jié)構(gòu)void OutputNumber(LongInt a);/輸出一個(gè)長(zhǎng)整型數(shù)void InputNumber(LongInt a,int OneOrTwo);/輸入一個(gè)長(zhǎng)整型數(shù)void add(LongInt c,LongInt a,LongInt b);/長(zhǎng)整型數(shù) c = a + bvoid sub(LongInt c,LongInt a,LongInt b); /長(zhǎng)整型數(shù) c = a - bStatus mul(LongInt c,LongInt a,LongInt b);/長(zhǎng)整型數(shù) c = a * bvoid div(LongInt c,LongInt a,LongInt b); /長(zhǎng)整型數(shù) c = a / b (整除)void rem(LongInt c,LongInt a,LongInt b); /長(zhǎng)整型數(shù) c = a % b (求余)void power(LongInt c,LongInt a,int n);/長(zhǎng)整型數(shù) c = a n (乘方)3、 本程序包含四個(gè)模塊:1) 主程序模塊:void main()/main.c初始化;do接受命令;處理命令;while(“命令”=“結(jié)束”)2) 程序界面模塊/IntFace.c, IntFace.h3) 雙向循環(huán)鏈表處理模塊/ DuCiLink.c,DuCiLink.h4) 長(zhǎng)整型數(shù)的輸入輸出模塊/LongIO.c, LongInt.h5) 長(zhǎng)整數(shù)運(yùn)算模塊/LongInt.c LongInt.h各模塊之間的調(diào)用關(guān)系如下: 三、詳細(xì)設(shè)計(jì)1、主要函數(shù)(1)、主控模塊main.cvoid DoCommand()/根據(jù)輸入命令進(jìn)行相應(yīng)的處理void Calculate()/執(zhí)行計(jì)算功能void ReSet()/重設(shè)系統(tǒng)環(huán)境(2)、程序界面模塊 IntFace.cvoid InitiInterface();/界面初始化void GoToCmdxy();/將光標(biāo)定位到命令選項(xiàng)提示之后void GoToPrompt();/將光標(biāo)定位到命令選項(xiàng)提示行首void ShowMainPrompt();/顯示命令選項(xiàng)提示void ClearScreen();/以清除整個(gè)屏幕,并設(shè)置為黑底白字模式void ClearPromptLine();/清除提示行的顯示void ClearWorkSpace();/清除工作區(qū)的顯示 void InputNumberBox(int OneOrTwo);/指定兩個(gè)輸入數(shù)的輸入窗口,如果超過(guò)這個(gè)范圍文字將自動(dòng)流動(dòng)void ResultBox(); /指定計(jì)算結(jié)果的顯示窗口,如果超過(guò)這個(gè)范圍文字將自動(dòng)流動(dòng)(3)、長(zhǎng)整型數(shù)輸入輸出模塊見二小節(jié)2分節(jié)(4)、長(zhǎng)整型數(shù)四則運(yùn)算處理模塊見二小節(jié)2分節(jié)(5)、長(zhǎng)整型數(shù)存儲(chǔ)模塊雙向循環(huán)鏈表模塊見二小節(jié)1分節(jié)2、函數(shù)的主要調(diào)用關(guān)系圖四、調(diào)試分析及編程心得體會(huì)1、剛開始考慮進(jìn)位問(wèn)題過(guò)于簡(jiǎn)單,導(dǎo)致測(cè)試數(shù)據(jù)時(shí)多次出錯(cuò)。2、剛開始時(shí)在輸入方式中花了較大功夫,而且用戶界面不夠友好,程序容錯(cuò)性較差。3、開始寫程序時(shí)源程序沒(méi)有嚴(yán)格按單元模塊結(jié)構(gòu)編寫,可讀性較差。4、由于初次進(jìn)行系統(tǒng)的程序設(shè)計(jì),層次結(jié)構(gòu)劃分不太合理,應(yīng)在以后的設(shè)計(jì)中強(qiáng)化此思維,逐漸與工程設(shè)計(jì)接軌。五、用戶手冊(cè)1、本程序的運(yùn)行環(huán)境為DOS操作系統(tǒng),執(zhí)行文件為L(zhǎng)ongInt.exe。2、進(jìn)入演示程序后即顯示文本方式的用戶界面3、輸入命令,執(zhí)行相應(yīng)的功能:1 輸入第1個(gè)整數(shù)o,O 輸入運(yùn)算符r, R 重置系統(tǒng)2 輸入第2個(gè)整數(shù)c,C 執(zhí)行運(yùn)算q,Q 退出系統(tǒng)六、測(cè)試結(jié)果(1)、0和0的四則運(yùn)算:(2)、;+;應(yīng)輸出“”。(3)、; 0000;+;應(yīng)輸出“01”.(4)、;+;應(yīng)輸出“0”.(5)、;+;應(yīng)輸出“1”。(6)、99;99;+;應(yīng)輸出“9998”.(7)9999;1;+;應(yīng)輸出“0000”.略七、源程序代碼/*1、main.c 主控文件 */#include IntFace.h/*界面模塊頭文件*/#include LongInt.h/*長(zhǎng)整型數(shù)處理模塊頭文件*/char cmd;/* menu command */char opt;/* operator */int n;/* power */LongInt a,b,c;/* Long integer numbers */int flag_n1=0,flag_n2=0,flag_opt=0,flag_cal=0,flag_reset=1; /*標(biāo)志位*/void ReSet()/* Reset system */ClearWorkSpace();/清屏幕的工作區(qū)flag_n1=0;/重置長(zhǎng)整數(shù)1是否輸入的標(biāo)志flag_n2=0;/重置長(zhǎng)整數(shù)2是否輸入的標(biāo)志flag_opt=0;/重置運(yùn)算符 是否輸入的標(biāo)志flag_cal=0;/重置是否進(jìn)行了運(yùn)算的標(biāo)志flag_reset=1;/重置 重置標(biāo)志void Calculate()/執(zhí)行計(jì)算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í)行加法運(yùn)算case -: sub(c,a,b); break;/執(zhí)行減法運(yùn)算case *: mul(c,a,b); break;/執(zhí)行乘法運(yùn)算case /: overflow = div(c,a,b); break;/執(zhí)行整除運(yùn)算case %: rem(c,a,b); break;/執(zhí)行求余運(yùn)算case : n = b-prior-data;power(c,a,n); break;/暫時(shí)以長(zhǎng)整數(shù)b的最后一組數(shù)據(jù)為冪,執(zhí)行乘方運(yùn)算;gotoxy(2,10);/定位到輸出位置cprintf(overflow=OK ? Result = :DivideBy);/輸出結(jié)果提示ResultBox();/控制輸出范圍,以免搞亂程序界面OutputNumber(c);/輸出運(yùn)算結(jié)果ClearList(c);/清空長(zhǎng)整數(shù)cwindow();/重新設(shè)置顯示窗口為全屏幕void DoCommand()/根據(jù)輸入命令進(jìn)行相應(yīng)的處理switch(cmd)case 1:InputNumber(a,1);flag_n1=1;break;/輸入第1個(gè)長(zhǎng)整數(shù)case 2:InputNumber(b,2);flag_n2=1;break;/輸入第2個(gè)長(zhǎng)整數(shù)case O:case o:opt=InputOperator();flag_opt=1;break;/輸入運(yùn)算符case C:case c:Calculate();flag_cal=1;break;/執(zhí)行運(yùn)算case R:case r:ReSet();/重設(shè)系統(tǒng)以便執(zhí)行下一次運(yùn)算void main()InitiInterface();/初始化程序界面InitList(&a); /初始化長(zhǎng)整形數(shù)據(jù)a,b,cInitList(&b);InitList(&c);doGoToCmdxy();/將光標(biāo)定位到輸入命令處cmd = getche(); /讀取一個(gè)操作命令DoCommand();/執(zhí)行相應(yīng)的命令while(cmd!=q & cmd != Q); /如果輸入的是Q或q則退出DestroyList(&a);/銷毀長(zhǎng)整形數(shù)據(jù)a,b,c,釋放它們所占的DestroyList(&b);DestroyList(&c);ClearScreen();/清除屏幕上的顯示/* 2、IntFace.h 程序界面模塊頭文件 */#include #include #define NofMenuItem 6#define IntMenuItem 2struct IntFaceTypeint height;/界面高度int width;/界面寬度char ProgramName30;/程序名char MenuItemsNofMenuItem12;/功能選項(xiàng)int MaxItemLength;/功能選項(xiàng)名最大長(zhǎng)度char prompt40;/命令選項(xiàng)提示int backcolor;/界面背景int textcolor;/文本顏色int WaitCmdx;/功能選項(xiàng)輸入坐標(biāo)xint WaitCmdy;/功能選項(xiàng)輸入坐標(biāo)y;void InitiInterface();/界面初始化void GoToCmdxy();/將光標(biāo)定位到命令選項(xiàng)提示之后void GoToPrompt();/將光標(biāo)定位到命令選項(xiàng)提示行首void ShowMainPrompt();/顯示命令選項(xiàng)提示void ClearScreen();/以清除整個(gè)屏幕,并設(shè)置為黑底白字模式void ClearPromptLine();/清除提示行的顯示void ClearWorkSpace();/清除工作區(qū)的顯示 void InputNumberBox(int OneOrTwo);/指定兩個(gè)輸入數(shù)的輸入窗口,如果超過(guò)這個(gè)范圍文字將自動(dòng)流動(dòng)void ResultBox(); /指定計(jì)算結(jié)果的顯示窗口,如果超過(guò)這個(gè)范圍文字將自動(dòng)流動(dòng)/* 3、IntFace.c 程序界面處理模塊文件 */#include IntFace.h#include dos.h/*界面長(zhǎng)寬及菜單等數(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;/*畫界面框架、顯示程序功能選項(xiàng)、輸入提示等 Long Integer Calcultor Number 1 Number 2 Operator Calculate Reset Quit Enter a hotkey: 1,2,O,C,R or Q: */void DrawIntFace()int i,j,LenProgramName,len;putch(218); /畫左上角的轉(zhuǎn)角線LenProgramName = strlen(IntFace.ProgramName); /計(jì)算程序名稱的長(zhǎng)度len = (IntFace.width - 4 - LenProgramName)/2; /計(jì)算程序名稱左右橫線的長(zhǎng)度f(wàn)or(i=0;ilen;i+) putch(196); /畫橫線putch( );cputs(IntFace.ProgramName);putch( );/顯示程序名for(i=0;ilen;i+) putch(196); /畫橫線putch(191); /畫右上角的轉(zhuǎn)角線gotoxy(1,2);putch(179);/畫第2行首的豎線for(i=0;iIntMenuItem;i+) putch( );/輸出選項(xiàng)前的空格for(j=0;jNofMenuItem;j+)/輸出各個(gè)選項(xiàng)cputs(IntFace.MenuItemsj);for(i=0;iIntMenuItem;i+) putch( );putch(179);/畫第2行尾的豎線gotoxy(1,3);putch(195);/畫第3行首的三岔線for(i=0;iIntFace.width-2;i+) putch(196);/畫第3行的橫線putch(180);/畫第3行尾的三岔線for(j=4;jIntFace.height-2;j+)/顯示中間的工作區(qū)gotoxy(1,j);/到第j行首putch(179);/畫行首的豎線for(i=0;iIntFace.width-2;i+) putch( );/畫中間的空白putch(179);/畫行尾的豎線gotoxy(1,IntFace.height-2);putch(195);/畫倒數(shù)第3行的橫線for(i=0;iIntFace.width-2;i+) putch(196);putch(180);gotoxy(1,IntFace.height-1);putch(179);/顯示倒數(shù)第2行的輸入提示len = strlen(IntFmpt);cputs(IntFmpt);for(i=0;iIntFace.width-2-len;i+) putch( );putch(179);gotoxy(1,IntFace.height);putch(192);/畫最后一行的橫線for(i=0;iIntFace.width-2;i+) putch(196);putch(217);void InitiInterface()/界面初始化int i, len, lenprompt;for(i=0;i IntFace.MaxItemLength) IntFace.MaxItemLength = len;len = (IntFace.MaxItemLength + IntMenuItem) * NofMenuItem + IntMenuItem + 2;lenprompt = strlen(IntFmpt);/輸入提示的長(zhǎng)度if (len lenprompt) len = lenprompt;if (IntFace.width len) IntFace.width = len;/界面的最終寬度if (IntFace.height 9) IntFace.height = 9; /界面的最終高度IntFace.WaitCmdx = lenprompt+2; /命令輸入處的X坐標(biāo)IntFace.WaitCmdy = IntFace.height - 1; /命令輸入處的Y坐標(biāo)clrscr(); /清屏,以便顯示程序界面textbackground(IntFace.backcolor); /設(shè)置界面的背景顏色textcolor(IntFace.textcolor); /設(shè)置界面的文本顏色DrawIntFace(); /畫出界面void ClearScreen()/以清除整個(gè)屏幕,并設(shè)置為黑底白字的DOS傳統(tǒng)模式textbackground(BLACK);textcolor(WHITE);clrscr();void ClearPromptLine()/* 清除提示行的顯示 */int i;gotoxy(2,IntFace.height-1); /到倒數(shù)第2行首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行首for(i=0;iIntFace.width-2;i+) putch( );/用空格覆蓋原有內(nèi)容void GoToCmdxy()/* 將光標(biāo)定位到命令選項(xiàng)提示之后 */gotoxy(IntFace.WaitCmdx, IntFace.WaitCmdy);void GoToPrompt() /* 將光標(biāo)定位到命令選項(xiàng)提示行首 */ gotoxy(2,IntFace.height-1);void ShowMainPrompt() /* 顯示命令選項(xiàng)提示 */ ClearPromptLine();cputs(IntFmpt);void InputNumberBox(int OneOrTwo)/*指定兩個(gè)輸入數(shù)的輸入窗口,如果超過(guò)這個(gè)范圍文字將自動(dòng)流動(dòng)*/window(11,(OneOrTwo=1)?4:6,IntFace.width-1,(OneOrTwo=1)?5:7);clrscr();void ResultBox()/*指定計(jì)算結(jié)果的顯示窗口,如果超過(guò)這個(gè)范圍文字將自動(dòng)流動(dòng)*/window(11,10,IntFace.width-1,11);clrscr();/* 4、LongInt.h 長(zhǎng)整型數(shù)輸入輸出及運(yùn)算模塊頭文件 */#include DuCiLink.htypedef struct DuCiLinkNode LongIntNode,*LongInt;/采用雙向循環(huán)鏈表為實(shí)際的存儲(chǔ)結(jié)構(gòu)void OutputNumber(LongInt a);/輸出一個(gè)長(zhǎng)整型數(shù)void InputNumber(LongInt a,int OneOrTwo);/輸入一個(gè)長(zhǎng)整型數(shù)void add(LongInt c,LongInt a,LongInt b);/長(zhǎng)整型數(shù) c = a + bvoid sub(LongInt c,LongInt a,LongInt b); /長(zhǎng)整型數(shù) c = a - bvoid mul(LongInt c,LongInt a,LongInt b);/長(zhǎng)整型數(shù) c = a * bStatus div(LongInt c,LongInt a,LongInt b); /長(zhǎng)整型數(shù) c = a / b (整除)void rem(LongInt c,LongInt a,LongInt b); /長(zhǎng)整型數(shù) c = a % b (求余)void power(LongInt c,LongInt a,int n);/長(zhǎng)整型數(shù) c = a n (乘方)/* 5、LongIO.c 長(zhǎng)整型數(shù)輸入輸出處理模塊文件 */#include Intface.h#include LongInt.h#include void OutputNumber(LongInt a)/*輸出長(zhǎng)整型數(shù)*/LongIntNode *s;s = a-next;if(a-data data,(s = a-prior)?0:,);s = s-next;while(s!=a)/*其它每節(jié)顯示4位數(shù),不足的以0補(bǔ)齊*/cprintf(%04d%c,s-data,(s = a-prior)?0:,);s = s-next;void InputNumberMsg(int OneOrTwo)/*顯示輸入兩個(gè)長(zhǎng)整型時(shí)提示 */window();ClearPromptLine();cputs(Example:;);gotoxy(2,(OneOrTwo=1)?4:6);cprintf(Number %d:,OneOrTwo);InputNumberBox(OneOrTwo);void InputNumberErrMsg()/*輸入出錯(cuò)時(shí)的提示*/window();ClearPromptLine();cprintf(One number out of 0-9999! Please input the whole number again!);getch();void InputNumber(LongInt a,int OneOrTwo)/*輸入長(zhǎng)整型數(shù)*/char c;/記錄輸入時(shí)的逗號(hào)和分號(hào)short e;/記錄輸入數(shù)據(jù)short sign = 0;/記錄長(zhǎng)整型數(shù)的符號(hào)short FirstSection = 1;/是否是第1個(gè)4位數(shù)據(jù)組LongIntNode *pa,*s;/節(jié)點(diǎn)的臨時(shí)指針I(yè)nputNumberMsg(OneOrTwo);/顯示輸入提示ClearList(a);/ 清空長(zhǎng)整型數(shù)的存儲(chǔ)空間fflush(stdin);/ 刷清輸入緩沖區(qū),以避免以前錯(cuò)誤按鍵的殘留docscanf(%d,&e);c = getche();/讀取數(shù)據(jù)if (FirstSection)/如果是第1個(gè)組,則設(shè)置整型數(shù)的符號(hào)if(e=0) sign = 1;if(e0) sign = -1;e *= -1;FirstSection = 0;if(e9999)/如果每組的數(shù)值不在0-9999之內(nèi)則報(bào)錯(cuò)并要求重輸整個(gè)長(zhǎng)整型數(shù)InputNumberErrMsg();InputNumberMsg(OneOrTwo);FirstSection = 1;ClearList(a);fflush(stdin);/*刷清輸入緩沖區(qū)*/c=,;else/如果本組數(shù)值符合要求則加入到長(zhǎng)整型數(shù)據(jù)中InsTail(a,e);/在長(zhǎng)整型數(shù)尾端加入本組數(shù)據(jù)a-data+;/組數(shù)加1while(c!=;);pa = a-next;/pa指向首結(jié)點(diǎn)while (pa-data = 0 & pa-next != a)/數(shù)值為0且不是尾結(jié)點(diǎn)則刪除/*輸入時(shí)可在前幾節(jié)輸入多個(gè)0,需要?jiǎng)h除,但又不能將0刪除完*/s = pa; pa = pa-next;/s指向當(dāng)前結(jié)點(diǎn),pa指向下結(jié)點(diǎn)a-next = pa;/斷開對(duì)s的鏈接pa-prior = a;free(s);/釋放sa-data-;/組數(shù)減1a-data *= sign;/設(shè)置長(zhǎng)整型數(shù)的符號(hào)InputNumberMsg(OneOrTwo);/以正規(guī)格式顯示長(zhǎng)整數(shù)1OutputNumber(a);window();/重置顯示窗為整個(gè)屏幕ShowMainPrompt();/回到功能選項(xiàng)等待命令輸入char InputOperator()/輸入運(yùn)算符char opt;window();ClearPromptLine();cputs(Input the operation type ( + - * / % );gotoxy(2,8);cprintf(Operator:);fflush(stdin);/刷清輸入緩沖區(qū)doopt = getche();gotoxy(11,8);/回退1格以便再次輸入while(opt!=+ & opt!=- & opt!=*& opt!=/ & opt!=% & opt!=);/輸入字符是否符合要求ShowMainPrompt();/回到功能選項(xiàng)等待命令輸入return opt;/* 6、LongInt.c 長(zhǎng)整型數(shù)運(yùn)算處理模塊文件 */#include LongInt.hStatus UnsignedAdd(LongInt c,LongInt a,LongInt b)/*無(wú)符號(hào)數(shù)相加,是普通加減法的基礎(chǔ)*/short sum,carry=0; /進(jìn)位LongIntNode *pa,*pb;pa = a-prior;/*pa,pb分別指兩個(gè)加數(shù)的尾結(jié)點(diǎn)*/pb = b-prior;while(pa!=a & pb!=b)/* a 和 b 中都有沒(méi)加的組時(shí),執(zhí)行加法*/sum = pa-data + pb-data + carry;carry = sum / 10000;/*進(jìn)位*/sum = sum % 10000;/*余數(shù),為當(dāng)前組的數(shù)值*/if (!InsFirst(c,sum) return ERROR;/*加到和長(zhǎng)整型數(shù)的首位*/pa = pa-prior;/*下一組*/pb = pb-prior;c-data+;/*組數(shù)加1*/while(pa!=a)/* a 中還有沒(méi)加的組時(shí),補(bǔ)到和上去*/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 中還有沒(méi)加的組時(shí),補(bǔ)到和上去*/sum = pb-data + carry;carry = sum / 10000;sum = sum % 10000;if (!InsFirst(c,sum) return ERROR;pb = pb-prior;c-data+;if(carry)/* 如果還有進(jìn)位*/if (!InsFirst(c,carry) return ERROR;c-data+;return OK;Status UnsignedSub(LongInt c,LongInt a,LongInt b)/*無(wú)符號(hào)數(shù)相減,總是用絕對(duì)值大的數(shù)減絕對(duì)小的數(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-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;/* 不夠減,提請(qǐng)調(diào)用程序交換a,b */pc = c-next;while (pc-data = 0 & pc-next != c)/*相減可能造成前幾節(jié)數(shù)據(jù)為0,需要?jiǎng)h除,但結(jié)果為零時(shí)又不能將0刪除完*/s = pc; pc = pc-next;c-next = pc;pc-prior = c;free(s);c-data-;return OK;void add(LongInt c,LongInt a,LongInt b)if (a-data * b-data) 0) /*兩數(shù)同號(hào),則執(zhí)行無(wú)符號(hào)加法,零為當(dāng)成正數(shù)處理*/UnsignedAdd(c,a,b);c-data *= (a-data=0)?1:-1;else/*兩數(shù)異號(hào),則執(zhí)行無(wú)符號(hào)減法*/*總是用絕對(duì)值大的數(shù)減絕對(duì)小的數(shù)*/if(UnsignedSub(c,a,b) = PleaseExchange)/* a不夠b減,則交換a,b的順序再減*/ClearList(c);UnsignedSub(c,b,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; /進(jìn)位short sum;LongIntNode *pa,*pb,*pcend,*pccur,*pc,*s;pa = a-prior;/*從a的尾結(jié)點(diǎn),即最后一個(gè)4位組開始*/pcend = c;/*記錄a的每一組與b相乘時(shí)最低位應(yīng)加到積的哪一組之前*/while(pa!=a)/*只要a中還有結(jié)點(diǎn)未納入運(yùn)算,則循環(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)/*特別注意兩個(gè)0-9999以內(nèi)的數(shù)相乘需要用long來(lái)記錄,否則會(huì)有溢出*/product = carry + (long)pa-data * (l
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校電炒鍋管理制度
- 學(xué)生俱樂(lè)部管理制度
- 安全辦部門管理制度
- 安哥拉衛(wèi)生管理制度
- 寶貝王衛(wèi)生管理制度
- 實(shí)訓(xùn)室物資管理制度
- 客房部員工管理制度
- 客運(yùn)車公司管理制度
- 家具廠培訓(xùn)管理制度
- 家政流程及管理制度
- 華為的科技創(chuàng)新生態(tài)系統(tǒng)構(gòu)建
- 二手房交易承諾書范本
- 施工組織設(shè)計(jì)施工方案報(bào)審表
- 雅馬哈YS12編程手冊(cè)
- 5G(UE)中PDU會(huì)話建立流程(消息)
- 組合數(shù)學(xué)(第二版)遞推關(guān)系
- 酒水廠家授權(quán)書范本
- 產(chǎn)品供貨質(zhì)量保證措施方案
- 河南產(chǎn)業(yè)分析介紹課件
- 三病信息管理制度
- 湘教版七年級(jí)下冊(cè)地理期末試卷-附答案
評(píng)論
0/150
提交評(píng)論