C语言课程设计报告-长整数四则运算

上传人:沈*** 文档编号:143689622 上传时间:2022-08-26 格式:PDF 页数:21 大小:881.79KB
收藏 版权申诉 举报 下载
C语言课程设计报告-长整数四则运算_第1页
第1页 / 共21页
C语言课程设计报告-长整数四则运算_第2页
第2页 / 共21页
C语言课程设计报告-长整数四则运算_第3页
第3页 / 共21页
资源描述:

《C语言课程设计报告-长整数四则运算》由会员分享,可在线阅读,更多相关《C语言课程设计报告-长整数四则运算(21页珍藏版)》请在装配图网上搜索。

1、-C C 语言课程设计说明书语言课程设计说明书题目题目:长整型数四则运算长整型数四则运算学学院院:班班级级:学学生生:学学号号:班内序号:班内序号:提交日期:提交日期:年年月月日日-目目录录一、需求分析一、需求分析 错误!未定义书签。二、设计思路二、设计思路.错误!未定义书签。三、详细设计三、详细设计.错误!未定义书签。1、主要函数错误错误!未定义书签。未定义书签。2、函数的主要调用关系图.错误错误!未定义书签。未定义书签。四、调试分析及编程心得体会四、调试分析及编程心得体会.错误!未定义书签。五、用户手册五、用户手册.错误!未定义书签。六、测试结果六、测试结果.错误!未定义书签。七、源程序代

2、码七、源程序代码 错误!未定义书签。1、main 主控文件.错误错误!未定义书签。未定义书签。2、nFae.h 程序界面模块头文件.错误错误!未定义书签。未定义书签。、IntFacec 程序界面处理模块文件.错误错误!未定义书签。未定义书签。、LonIn.h长整型数输入输入及运算模块头文件错误错误!未定义书签。未定义书签。5、onOc长整型数输入输出处理模块文件错误错误!未定义书签。未定义书签。6、Longn.c 长整型数运算处理模块文件错误错误!未定义书签。未定义书签。7、DCiLinh 双向循环链表处理模块头文件错误错误!未定义书签。未定义书签。8、DuCiLink.c 双向循环链表处理模

3、块代码.错误错误!未定义书签。未定义书签。-一、需求分析一、需求分析1、设计一个实现任意长的整数进行四则运算的程序。2、输入和输出形式是按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。3、程序执行的命令包括:1)、输入长整数 1;2)、输入长整数 2;3)、输入执行的运算符;4)、计算并输出结果;5)、结束。4、测试数据:(以加法为例)(1)、0;0;应输出“0”。(2)、-2345,689;-765,21;+;应输出“,0000,0”。()、999,99;,000,00,0000;+;应输出“99,0000,0001”.(4)、,000

4、1,0;-1,01,001;+;应输出“0”.(5)、1,01,00;,000,000;应输出“1”。(6)、9999,9,99;-999,999,9999;+;应输出“-1,9999,999,998”(7)1,000,999,99;应输出“,0001,000,000”二、设计思路二、设计思路我们首先要考虑的是如何表示长整型数。按照传统习惯要求每位数形成1 组,而一个长整型数可能会有很多组这种位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。(2)在输入数据时总是从高位到低位

5、地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。总之,为了实现上述功能,应以双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过 999的整数,整个链表用十进制数表示。(3)对于每一个长整型数可以设置一个头结点头结点,其中的数据域用来表示该长整型数的正负号及组数,该值的符号则表示该长整型数的符号,该数的绝对值表示该长整型数包含的 4 位数的组数。第一个存储位数据组的结点称为首结点首结点,而最后一个 4 位数据组结点称为尾结点尾结点。为此需要两个结构数据类型:双向循环链表和长整数,两个类型采用相同的结构,只是双向循环链表用

6、来存储数据,长整型用表示数据的运算。1、双向循环链表的数据结构及操作定义如下:typedf shrt ElTpe;/定义基本数据类型,我们采用hot 来表示任意 4 位整数。typedef ruct DuCinkNode/双向循环链表结点的存储结构Elemype dat;trctDuCiLinNodprr;/指向上一结点trt DCLnkod*next;/指向下一结点CiLikNde,*DuCiLinkLs;/定义双向循环链表结点及链表的类型名基本操作基本操作:CiLinkNode*Meode(leTypee);/以 4 位整数构造 1 个双向循环链表结点Status IniList(DuCi

7、LnkLstL);/初始化 1 个双向循环链表,分配1 个结点作头结点/数据域赋初值 0,上下结点指针指向自己void DetroyLis(uiLLit*);/消毁 1 个双向循环链表,释放它所占用的所有内存空间/并让链表*L 指向 NULLoidClerList(uCiLkLiL);/清除 1 个双向循环链表,释放数据结点所占用的内存空间/保留头结点,并将数据域置为 0,上下结点指针指向自己Status InTail(DCiiks L,Emyp e);/在双向循环链表 L 的尾结点之后加入个以 e 为/数据域的新结点,并返回K;否则返回 ERRR。StatusInsirs(DCiLinkLi

8、tL,lmType e);/将数据元素 e 插入在线性链表 L 头结点之后,并返回 OK;否则返回 ERR。Stats CyLst(DuiLList,DuCLiLis C);/将双向循环链表复制到双向循环链表C 中。-2、长整数的数据类型和和操作定义为:typd struct DuiLindeLongInNode,*LongInt;/采用双向循环链表为实际的存储结构oi OutputNumber(Longt a);/输出一个长整型数vo Inputuer(Lngn a,iteOTwo);/输入一个长整型数id add(LInt c,LngInt a,LonIn b);/长整型数 =a+vois

9、u(ongInt c,ongI a,LongIn b);/长整型数 c=-bStatu(LongIt c,Longta,ongnt);/长整型数 c=*bvoiddiv(onInt c,LogInt a,ngInt);/长整型数 c=a/b(整除)void rem(LnIn c,LogIt a,Longnt b);/长整型数 c=%b(求余)oid poer(ongInt c,ongIta,int n);/长整型数 c=a (乘方)3、本程序包含四个模块:1)主程序模块:oi mai()/main.c初始化;d接受命令;处理命令;while(“命令”=“结束”)2)程序界面模块/ntFace.

10、c,IntFe.h3)双向循环链表处理模块/DCiLkc,DCink.4)长整型数的输入输出模块/LogI.,LongInt.5)长整数运算模块/Lnnt.nt.h各模块之间的调用关系如下:主程序模块程序界面模块长整数运算模块长整数输入输出模块双向循环链表单元模块三、详细设计三、详细设计1 1、主要函数、主要函数(1)、主控模块 mincvoid DoComand()/根据输入命令进行相应的处理id Clculae()/执行计算功能oid ReSet()重设系统环境(2)、程序界面模块 IntFae.coid ItiInterfae();/界面初始化voidGoTomdx();/将光标定位到命

11、令选项提示之后voiTorm();/将光标定位到命令选项提示行首vd ShMainPromt();/显示命令选项提示voilarScren();/以清除整个屏幕,并设置为黑底白字模式od eaPromptn();/清除提示行的显示void ClrWorkSpac();/清除工作区的显示void nputumeBo(n OneOrTwo);/指定两个输入数的输入窗口,如果超过这个范围文字将自动流动-voidReslBo();/指定计算结果的显示窗口,如果超过这个范围文字将自动流动(3)、长整型数输入输出模块 见二小节 2 分节(4)、长整型数四则运算处理模块见二小节 2 分节(5)、长整型数存储

12、模块双向循环链表模块 见二小节 1 分节2 2、函数的主要调用关系图、函数的主要调用关系图main直接调用可能调用InitiInterFaceDrawIntFaceInitListDestroyListDoCommandInputNumberInputOperatorCalculateResetOutputNumberaddsubmuldivrempowerClearListInsTailInsFirstCopyListInitListDestroyList四、调试分析及编程心得体会四、调试分析及编程心得体会1、刚开始考虑进位问题过于简单,导致测试数据时多次出错。2、刚开始时在输入方式中花了较

13、大功夫,而且用户界面不够友好,程序容错性较差。3、开始写程序时源程序没有严格按单元模块结构编写,可读性较差。4、由于初次进行系统的程序设计,层次结构划分不太合理,应在以后的设计中强化此思维,逐渐与工程设计接轨。五、用户手册五、用户手册1、本程序的运行环境为DOS 操作系统,执行文件为LongInt.ex。2、进入演示程序后即显示文本方式的用户界面3、输入命令,执行相应的功能:1 输入第 1 个整数o,O 输入运算符r,重置系统 输入第个整数 c,C 执行运算,Q 退出系统六、测试结果六、测试结果()、和的四则运算:-()、-2345,6789;-754,31;+;应输出“1,0000,000”

14、。(3)、999,9999;1,000,0000,000;+;应输出“999,00,00”.(4)、1,000,0;-1,0001,001;+;应输出“0”.(5)、1,1,001;-1,01,0000;+;应输出“”。(6)、-99,9999,999;99,99,9999;+;应输出“1,99,999,9998”.(7)1,0000,9999,9999;1;+;应输出“1,00,000,000”.略七、源程序代码七、源程序代码/*、m min.cin.c 主控文件主控文件*/#inclue IntFace.h*界面模块头文件*/#ncue LongInt./长整型数处理模块头文件h cmd;

15、/*mnu omnd/ha op;/*erat/nt;/*power*/LongIt,c;*/Long ineger nmbs*/int fla_1=0,flagn2=,lag_opt=0,flag_cal=0,flg_reset=1;/标志位*/vdRSet()*/Res syem/ClearWkSce();/清屏幕的工作区flan1;/重置长整数是否输入的标志fag_n2=0;/重置长整数 2 是否输入的标志fopt=0;/重置运算符是否输入的标志flag_cal=0;/重置是否进行了运算的标志flagrest=1;/重置 重置标志voi Calculae()/执行计算nt ovrflow

16、=K;if(ag_n1*flan2*fa_opt=)return;*/Input snt omplete!输入不完整则直接返回*/sich(o)cae+:add(c,a,b);bea;/执行加法运算ae-:sub(,a,b);eak;/执行减法运算cas*:mul(c,a,b);br;/执行乘法运算case:verflow=div(c,a,);rak;/执行整除运算case%:rm(c,a,b);break;/执行求余运算-as:n=b-priordata;oer(,a,n);beak;/暂时以长整数 b 的最后一组数据为幂,执行乘方运算;gotoxy(2,);/定位到输出位置cprint(o

17、erfl=OK?sul=:DivdeBy);/输出结果提示RsultBox();/控制输出范围,以免搞乱程序界面OttNumber();/输出运算结果CearLi();/清空长整数 cdow(1,80,2);/重新设置显示窗口为全屏幕vid Doommnd()/根据输入命令进行相应的处理sitch(md)case:InputNumbr(a,1);flag_n1=1;break;/输入第 1 个长整数case 2:Inumbe(b,2);fan2=;bea;/输入第 2 个长整数casO:cas o:opt=InputOpa();lag_o1;break;/输入运算符caseC:cas c:Cl

18、cuate();fgca=1;br;/执行运算cas R:cas r:ReSet();/重设系统以便执行下一次运算vod main()itiInterace();/初始化程序界面InitLit(&a);/初始化长整形数据 a,b,IniLi(&b);InitLi(&c);dGomdx();/将光标定位到输入命令处cm=geche();/读取一个操作命令Command();/执行相应的命令while(cmd!=q&cmd!=Q);/如果输入的是 Q 或 q 则退出DestryLi();/销毁长整形数据 a,b,c,释放它们所占的Detoyis(&);DestyList(c);learScren(

19、);/清除屏幕上的显示/*2 2、ntFantFa.h.h程序界面模块头文件程序界面模块头文件*/#inclu stdioh#iclu#din NMenutem6#dene IntMenIem-struct InaTypeint igt;/界面高度nt width;/界面宽度har PramName30;/程序名har MutsfMenIm12;/功能选项nt MaxItLegth;功能选项名最大长度cr prmpt;/命令选项提示itkcolor;/界面背景int txtclor;/文本颜色int WaCmdx;/功能选项输入坐标 xntWitmy;/功能选项输入坐标;voi Iniintr

20、ae();界面初始化voi GoTxy();/将光标定位到命令选项提示之后voi GoToPrompt();/将光标定位到命令选项提示行首vid howMainPp();/显示命令选项提示void Clercreen();/以清除整个屏幕,并设置为黑底白字模式oiCearompLin();/清除提示行的显示vo earWSpace();/清除工作区的显示void InputNumberBx(it OnerTwo);指定两个输入数的输入窗口,如果超过这个范围文字将自动流动vd ResulBox();/指定计算结果的显示窗口,如果超过这个范围文字将自动流动/*3 3、n nF F程序界面处理模块文

21、件程序界面处理模块文件*icldeIntFaceh#icluddos.h/界面长宽及菜单等数据,具体含义见头文件*/sruc IFceye ntFace=14,40,Long Integr Calulto,Numer1,Numer2,Oeraor,allate,Rese ,Qit,9,Entra htke:1,2,O,C,orQ:,LUE,W;/*画界面框架、显示程序功能选项、输入提示等ong Intege Ccultor Number1 Numer2pratalculate ResetuitEterhokey:1,,C,rQ:*/oid awInFac()int i,,LenPoramNme

22、,l;puh(21);/画左上角的转角线LenPogramName=trle(Intac.Pogramame);/计算程序名称的长度-e=(nace.widh-4-LenPoamNae)/2;/计算程序名称左右横线的长度fo(i=;ien;i+)ut(6);/画横线utch();ut(IntFace.ProramNae);putch();/显示程序名o(i=0;iln;i+)(16);/画横线putch(91);/画右上角的转角线goxy(1,2);putch(17);画第 2 行首的竖线for(0;iIenuIm;i+)put();/输出选项前的空格f(j=;oMenuItm;j+)/输出各

23、个选项cputs(Intace.MnuItemsj);or(i=0;iIntMenuIem;i+)putch();h(179);/画第 2 行尾的竖线otxy(,3);utch(95);/画第 3 行首的三岔线fo(i=0;IntFae.idth-2;i+)putch(1);/画第 3 行的横线putch(80);/画第 3 行尾的三岔线fr(=4;jIntace.heght-;j)/显示中间的工作区o(,j);/到第 j 行首putch();/画行首的竖线for(i=0;iIntFacewidth;i+)putch();/画中间的空白putch(17);/画行尾的竖线gotoxy(1,ntF

24、ace.hght2);ptch(15);/画倒数第行的横线for(i=0;iIce.width-2;+)putc(196);ptch(180);tx(,InFae.heiht-1);putch(7);/显示倒数第 2 行的输入提示len=strle(nFacpomp);cputs(IntFepromt);r(i0;iIntce.widh-2-le;i+)putc();putch(79);goo(,IFaeheih);ptc(192);/画最后一行的横线fr(i=0;iItFace.width-;i+)puch(96);puth(1);voidInitinterfe()/界面初始化it i,l,

25、lenpomp;for(i=0;InFce.MxILeth)nFce.MxItemengh=len;le=(ItFae.MxtemLent InMenuItem)*NofMenuIte+IMenutem;-lenprompt=stlen(tFe.rot);/输入提示的长度if(le enpp)en=lnrmp;if(nFce.widh len)InFc.idth en;/界面的最终宽度if(ntFac.heiht)Intae.height=;/界面的最终高度InFe.WaitCdx=lnprmp+2;/命令输入处的 X 坐标ntFaceWitCmy nFce.igh-1;/命令输入处的 Y 坐

26、标lrscr();/清屏,以便显示程序界面textackgro(InFcebackcoor);/设置界面的背景颜色textcolor(IntFce.textclor);/设置界面的文本颜色DrIntFac();/画出界面vid Clearceen()/以清除整个屏幕,并设置为黑底白字的S 传统模式extbkon(BLCK);textolr(IT);crscr();oid ClerPromptie()*清除提示行的显示*/ini;otox(2,ItFce.heigt-1);/到倒数第 2 行首for(=;iItFace.wid2;i+)putch();/用空格覆盖原有内容ToPompt();vi

27、ClearWrSpace()*清除工作区的显示*it,j;for(j=4;jIntFac.hight;j+)gtxy(2,);/到第 j 行首for(=;iIntFa.wit;i+)ph();/用空格覆盖原有内容vidGoToCmdx()/将光标定位到命令选项提示之后*/gty(IntacWimx,IntFaceaimd);vd GoPrompt()/将光标定位到命令选项提示行首*gto(,IntFe.eigt-1);voidhowMairompt()/*显示命令选项提示/CerProptne();ct(ntFaceprmp);-oi InputumberBox(i neTwo)*/指定两个输

28、入数的输入窗口,如果超过这个范围文字将自动流动winow(1,(OneOrTw=1)?4:6,ItFace.width-1,(OOTo=1)?:7);crscr();void esulBox()/指定计算结果的显示窗口,如果超过这个范围文字将自动流动/window(11,1,IntFac.width-1,11);lrscr();/*4 4、LongILongIt th h长整型数输入输出及运算模块头文件长整型数输入输出及运算模块头文件*/#incude CLnktpedef strct DuCiLinode LongIntNod,*LongIt;采用双向循环链表为实际的存储结构oid Otpu

29、me(LoIn a);/输出一个长整型数vid InputNumbr(LongIt a,in OnerTwo);/输入一个长整型数vid d(Lonnt,LngInta,LoInt b);/长整型数 c=a+vid sub(LongIt c,LonInt,LoInt);/长整型数 c=a-ul(LnItc,LongInt,ogIn b);/长整型数 c=*btaus div(LongIn,LongIn,LogInt b);/长整型数 =a/b(整除)vod e(Logn c,LgIna,LgInt b);/长整型数=a%b(求余)void poer(ngInt c,LongInt a,itn)

30、;/长整型数 c=a (乘方)/*5 5、LonLonIO.cIO.c 长整型数输入输出处理模块文件长整型数输入输出处理模块文件*/#nclude Itfae.#inlude LongInt.#inude void utNuber(LongIt a)输出长整型数*/LongIntode*s;s a-nxt;if(a-dta data,(=-rior)?0:,);s=s-et;-oid InptNumberMs(ntneOrT)*/显示输入两个长整型时提示*/wdo(1,1,80,2);CearPromptLie();puts(Examle:-1,001,00;);oy(2,(OneOrwo=1

31、)?4:);crnf(Numbe%d:,neOrTwo);uNumrBox(OneOrw);oidInputNuberErrMs()输入出错时的提示widow(1,1,8,25);leaPromtLie();pnt(One uer out f 0999!Pleae nput the whoe nber agn!);tch();vidInptNumer(LongIt a,itOeOTwo)/输入长整型数*/char c;记录输入时的逗号和分号hrt e;记录输入数据hort sg=0;/记录长整型数的符号shrt FistSection 1;/是否是第个 4 位数据组ongIntode*pa,*

32、s;/节点的临时指针InputNbrMg(OneTo);/显示输入提示Cea(a);/清空长整型数的存储空间fflush(stdin);/刷清输入缓冲区,以避免以前错误按键的残留docscaf(d,e);c=gehe();/读取数据if(Firscion)/如果是第 1 个组,则设置整型数的符号if(=0)si=1;i(0)ig -1;e*=-1;Fiectio=0;if(0|e999)/如果每组的数值不在-9之内则报错并要求重输整个长整型数nputumbrErMs();InutNmbeMg(OneOro);FirsSecton=1;ClerList(a);fflush(sdn);*刷清输入缓

33、冲区*/,;else/如果本组数值符合要求则加入到长整型数据中InsTail(,e);/在长整型数尾端加入本组数据a-data+;组数加hle(c!=;);-pa a-next;/pa 指向首结点hile(pa-data=0&pa-n!a)数值为 0 且不是尾结点则删除*输入时可在前几节输入多个0,需要删除,但又不能将 0 删除完*=p;pa=paext;/s 指向当前结点,指向下结点a-exta;/断开对 s 的链接paprio=a;fe(s);/释放 sa-data-;/组数减adaa*=sign;/设置长整型数的符号nutmbrsg(nerwo);/以正规格式显示长整数OtpNumer(

34、a);win(1,80,25);/重置显示窗为整个屏幕ShwMiompt();/回到功能选项等待命令输入har InpOperator()/输入运算符char opt;wndow(1,1,0,2);ClarPrpLine();s(nuth operton tpe(-*/%));gotx(2,8);printf(erator:);fflush(stdn);/刷清输入缓冲区dopt=getce();gotx(11,8);/回退 1 格以便再次输入whie(op!=+&ot!=-&ot!=&opt!=/&opt!=op!=);/输入字符是否符合要求ShwMainPropt();回到功能选项等待命令输

35、入reurn t;*、LoLogInt.gInt.长整型数运算处理模块文件长整型数运算处理模块文件*/inclue LogI.hStusUnsnedAdd(Logn,onnt a,LngInb)/无符号数相加,是普通加减法的基础/shrtum,a=0;/进位ongIntNod*pa,*pb;=aprio;*pa,p分别指两个加数的尾结点*/p=-rior;hle(pa!=a&pb!=)/*和 中都有没加的组时,执行加法*s =padata+-dat+rry;carysum/1000;/*进位*/su=sum%100;/*余数,为当前组的数值*if(!IsFirst(,sum)reurERRO;

36、/*加到和长整型数的首位*-p=paprior;/*下一组*pb=pb-rior;-data+;*组数加 1*/while(p!=)/*a 中还有没加的组时,补到和上去/sum=pa-daa ary;carysum/1000;su =um%000;(!nsr(c,su))rturnERROR;a=p-pior;c-data+;hile(pb!=)/*b中还有没加的组时,补到和上去*/sumpbdata+arry;cary=sum/1000;sum =u%1000;i(!sFist(,su)ernEROR;p=pb-prior;c-data+;f(cary)/如果还有进位/f(!InsFist(

37、c,carry))eun ROR;cdata+;trn OK;Status UsineSub(LoIc,LogInta,Lon)/无符号数相减,总是用绝对值大的数减绝对小的数是普通加减法的基础shotdiff,borrow0;LngIntNode*pa,*p,pc,*;pa=a-prior;b=b-prior;while(pa!a&pb!b)diff=pa-at borow-pb-ata;if(diff pror;pb pb-prir;c-dat+;wil(!a)diff p-ata-borrow;(dff 0)orrow=1;diff+=100;es orrow=;if(!InsFirt(c

38、,dff)eturn ERRO;a=pa-prior;-ata+;-if(rrow|!)retrnPleeExage;*/不够减,提请调用程序交换,b*/p=-ex;wh(c-data=0&pcx!=c)/相减可能造成前几节数据为0,需要删除,但结果为零时又不能将删除完*s=pc;=pc-next;c-next=p;pprir=c;e(s);-dat-;returOK;voiad(ogInt,onInta,onnt b)if((-a*b-data)0)/两数同号,则执行无符号加法,零为当成正数处理*/UngedA(c,a,);-daa=(a-data)?1:-1;le/*两数异号,则执行无符号

39、减法*/总是用绝对值大的数减绝对小的数/i(UinedSu(c,a,b)=Peasechange)不够减,则交换 a,b 的顺序再减*/ClarLis();sgneSub(,,);c-data*=(b-ta=)?1:-;ese/a 够 b 减*-daa*=(a-dat=0)?1:;voi sb(Longntc,LongInt a,LngInt b)*/变减法为加法*/bdata*=-1;add(c,a,);b-at*=-1;vod ml(nInt,LogIn,nInb)long prdct,carr=0;/进位short um;LongINode*pa,b,*end,*pcur,p,*s;pa

40、=a-por;*从的尾结点,即最后一个 4 位组开始*/pcend=c;/记录 a 的每一组与 b 相乘时最低位应加到积的哪一组之前/while(pa!=)*/只要 a 中还有结点未纳入运算,则循环*-if(pa-da=0)/*如果 a 的当前位组为,则直接加 0*/InFist(c,);c-+;lsepccur=pcen-pi;/*记录乘数应加到积的哪一组*/=b-pror;/*取 b 的每组与 a 的当前组相乘*/while(pb!=b)*特别注意两个-999 以内的数相乘需要用 ln来记录,否则会有溢出*poduct carry(log)pa-dta*(lo)pb-data;ary=pr

41、oduc/100;*进位*/pod ouct%1000;/*余数,也即当前组的值*if(pur=c)/*需要新的结点来存放数据*/InsFirs(c,(sot)prodct);pcr=nxt;c-ta+;e以前的运算已经插入过本4 位组,则增加到当前组上*/sum=cr-t+(sho)rodct;if(sum 99)ary+;sm=1000;pccur-dta=um;pccur=cu-rio;/移动乘积数的当前指针*pb b-por;*/移动被乘数的当前指针*/*如果还有进位,则加上去*/if(ay0)Insrt(c,(sort)cary);carry=0;c-data+;/*清空进位器,并将

42、位数组数加1*/pcend=pcror;*乘积数的最低位上移一组*/a=p-pior;*乘数上移一组*/cdata=(a-ata*b-ata)=0)?1:1;c=c-xt;whie(c-data=0&pc-next!=c)/相乘可能造成前几节数据为0,需要删除,但结果为零时又不能将0 删除完/s=p;pc=pc-xt;cnxt =pc;pc-prior=c;fee(s);-at-;vi Addn(LogIt c,shr n)/一个正的长整型加一个最大为200 的正数/short carry=,sum;Longtoe*pc;pc=c-pior;-i(cary!=0&c!=)sum=p-dta+c

43、arr;cary=su 10000;m=su%10000;c-ata sum;pc=pcrir;whil(carr!=0)如果进位不为零说明需要新的结点/s=car;carry=sum/10000;um=sum%1000;nsFrst(c,um);cdat+;Status div(Longnt c,ongnta,LongInt)/整除*/变除为减可以较容易地实现整除,但实际中的意义可能不大Lngnt d,;sot i=,EoughSub;short adat=ada,data b-data;if(-ata=1&bnextta=0)retn OVERLW;(-dtadat*=-1;if(bta

44、0)b-dta*=-1;IitLis(&d);nitList(&e);/使用临时长整型数*CopyList(,e);*e=a/ughSu UnsignedSb(,b);*d=-b*/whle(Enuhb=O)i+;(i=2000)/*多次相减后再才保存*/Adn(,);i;ClarList(e);CopyLst(d,);Cerist();EnoghSub=nsinedSub(d,e,b);/*若采用自减运算则可能没有这样复杂*/Ad(c,i);/*将最后的尾数补上*/da=aat;-dta=bdata;c-ata*=((ad*da=)?1:-1);stroList(d);DestroyLis(

45、e);reurn OK;voi rem(LongInt,LongInt a,ogIn b)求余*/变除为减可以较容易地实现整除,但实际中的意义可能不大ogIt e;-in EnghSub;sortadata=a-dta,data=bata;f(a-atadata*=-;if(-data at*1;InitList(&e);CpLis(a,c);EnoughSu=ninedub(e,c,);whl(EnoghSub=K)/若采用自减运算则可能没有这样复杂*/lerList(c);opList(,c);ClearLis();nogS=signSub(e,c,b);-aa=aaa;b-data=bd

46、ata;if(adata 0)cdta*=1;Desoist(&e);vod poer(ongInt c,LongInta,it)*乘方运算,变乘方为累乘/ini;Longnt;i(n=)InsFrst(c,0);rurn;ele if(n=1)CopyLi(a,c);rtn;iList(&b);CopyList(a,);for(=0;2;i+)/如果采用的幂次自累乘,效率会更高,但编程麻烦一些ul(c,a,b);ClearLst();CopyLst(,b);learist(c);mu(c,a,b);DestroyList(&b);/*7 7、uCiLinkuCiLinkh h 双向循环链表处

47、理模块头文件双向循环链表处理模块头文件*/#inclue stdo.h#ncude#efin TRU 1/定义一些常数efne FASE0#define OK1 defie EROR0#eneINFEASL-1#deineVRLOW-2#dfe PeaseExchge 22defin Sttu;/定义函数返回值的类型-ypde hort ElemType;/定义基本数据类型,我们采用ho来表示任意 4 位整数。yde trct DuCiLnNode/双向循环链表结点的存储结构ElemTedata;srt DuCLinNoepir;/指向上一结点suct DCiLinkNodenet;/指向下一

48、结点DuiLinkNod,*DuCiikst;/定义双向循环链表结点及链表的类型名DCiLiNod*Makede(Eemye e);/以 4 位整数 e 构造 1 个双向循环链表结点StatusInitit(Diikst*L);/初始化 1 个双向循环链表,分配个结点作头结点数据域赋初值,上下结点指针指向自己voDestroList(DuCiLkist L);/消毁 1 个双向循环链表,释放它所占用的所有内存空间/并让链表*L 指向 NLid CleaList(DuLinLi L);/清除 1 个双向循环链表,释放数据结点所占用的内存空间/保留头结点,并将数据域置为0,上下结点指针指向自己ts

49、 InTi(DuiLinLisL,leType e);/在双向循环链表的尾结点之后加入 1 个以为/数据域的新结点,并返回 OK;否则返回 ERROR。SttsInsFist(DLnLst L,ElemTyp);/将数据元素插入在线性链表L 头结点之后,并返回;否则返回 ERROR。Sttus CopyLst(DuCiLkLit,DuiLnkList C);将双向循环链表复制到双向循环链表中。/*8 8、D DCiLiCiLik kc c 双向循环链表处理模块代码双向循环链表处理模块代码*/icudeuCLiDuCiLinNoe*akeNd(ElemTye)*/以 e 为数据申请并构造一个结点

50、*/uCiLinkNode*s;s=(uCiLinkNd*)aloc(sizeof(uCiLnNod);f(s)s-data=e;rurns;St nitLis(DuCiLinkList*)*/初始化 1 个双向循环链表,分配1 个结点作头结点数据域赋初值0,上下结点指针指向自己*/(*L)(DuCiLinkNd*)aloc(sieof(DuCLkod);if(!(L))etrn OERFO;/存储分配失败*(L)-data =0;(*)-prior=(*L);()-next=(*);retun OK;void etroyLt(DCiinkistL)/*消毁 1 个双向循环链表,释放它所占用的

51、所有内存空间并让链表*L 指向 NULL*/CLinkNode*p,*s;-p(L)-prio;(*L)-ior=LL;whi(p)s=p;p=-ior;free(s);(*)=NUL;void ClearLit(DCLikLstL)*/清除 1 个双向循环链表,释放数据结点所占用的内存空间保留头结点,并将数据域置为 0,上下结点指针指向自己*/CiLnode*p,*;p=-pi;hile(p!=)s;p -prir;free();-data 0;-ro L;L-nex L;Sats Copyis(uCiLikL L,DuCikitC)*/将双向循环链表 L 复制到双向循环链表中。*/DCii

52、nkNde*p,*s;-dta=L-da;p Lpior;while(p!)s(DuiLiNode*)mloc(sizef(DuCiinkNo));if(!)retrnVEFLOW;/存储分配失败-dta -dat;C-et-pior s;s-net=-nex;s-pior=C;C-nxt=s;p=pprir;retO;SausIsail(DuCLinkst L,lemTy e)*/在双向循环链表 L 的尾结点之后加入 1 个以为数据域的新结点,并返回OK;否则返回 EROR。/uCinkNode*s;s=(DuCiLnkNode)mllc(sizeo(DuCiLikoe);if(!)retunOVERFLO;/存储分配失败-data=e;s-ior=L-pir;s-next =;L-priornet=s;L-pror=;trnOK;InsalSttusInFirst(DuCiLikLst L,Eemype e)/将数据元素 e 插入在线性链表 L 头结点之后,并返回 OK;否则返回 EROR。uLinNode*s;-s(uCiinkNod*)malo(iof(uide));i(!s)return OVERLOW;/存储分配失败s-daa=e;-nexprior=s;s-nex Lnext;s-prio ;-next=s;rtrn OK;/Ta-

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!