版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 目录一 问题的概述、分析及研究意义;二 流程图 三 算法设计四 调试过程五 源程序 一问题的概述、分析及研究意义;设计一个计算器实现两个任意长得整数的加、减、乘、除。对数值很大,精度很高的数进行高精度大整数计算是一类十分常见的问题,但由于C语言中数据长度和范围受数据类型的限制,普通数学计算很难实现此问题,为尝试解决这个问题,专门设计一个C语言程序用于大整数的计算。为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,仅绝对值不超过9999的整数,整个链表用十进制数表示。利用头结点数据域的符号表示长整数的符号,相加过程不破坏两个操作数链表,对长整数位数不作上限。为此需要两个结构
2、数据类型:双向循环链表和长整数。本程序实现计算任意长的整数的四则运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。本演示程序中,数字字符限定为09和字符,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。二流程图 欢迎界面选择操作
3、加法运算减法运算乘法运算除法运算运行结果继续结束是否 三算法设计1定义全局变量#define LEN sizeof(struct Node)#define MAX 1000#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0typedef int Status; 2,主要函数 (1)主程序模块:/int main() (2)双向循环链表处理模块: /Status conversion(char str,NodeList &oprh); /int cmplinklen(NodeList op
4、r1,NodeList opr2); /Status Creat(NodeList &oprr,int len); /int compare(NodeList opr1,NodeList opr2); (3)长整数四则运算模块: /Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr); /Status sub_bas(NodeList opr1,NodeList opr2,NodeList &oprr); /Status imul(NodeList opr1,NodeList opr2,NodeList &
5、amp;oprr); /Status idiv(NodeList opr1,NodeList opr2,NodeList &quti,NodeList &remand); (4)界面模块: /void title(); /void welcome();3,编写函数(1)函数:Status conversion(char str,NodeList &oprh)功能:将字符串形式的操作数转换成所需的类型(2)函数:Status input(NodeList &opr1,NodeList &opr2,char str) 功能:输入需要的操作数(3)函数:Sta
6、tus output(NodeList oprr,char str) 功能:输出需要的操作数以及判断其正确性(4)函数:Status initbuf(char str) 功能:为数据对象或变量赋初值(5)函数:int cmplinklen(NodeList opr1,NodeList opr2)功能:比较两个输入数的大小,长返回1,短返回-1,否则返回0(6)函数:int length(NodeList oprr) 功能:求出链表长度(7)函数:Status Creat(NodeList &oprr,int len) 功能:生成一个指定链表(8)函数:int compare(NodeL
7、ist opr1,NodeList opr2) 功能:比较两个数的绝对值的大小(9)函数:Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr) 功能:实现两个数相加(10)函数:Status sub_bas(NodeList opr1,NodeList opr2,NodeList &oprr) 功能:实现两个数的相减(11)函数:Status imul(NodeList opr1,NodeList opr2,NodeList &oprr) 功能:实现两个数的相乘(12)函数:Status idiv(Node
8、List opr1,NodeList opr2,NodeList &quti,NodeList &remand) 功能:实现两个数的除法四调试过程运行平台:Microsoft Visual C+ 6.01, 欢迎界面 2,选择操作3,加法运算4,减法运算5, 乘法运算6, 除法运算8, 结束运行五源程序#include<string.h>#include<stdlib.h>#include<stdio.h>#define LEN sizeof(struct Node)#define MAX 1000#define OK 1#define ER
9、ROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0typedef int Status;/自定义一个变量typedef struct Nodeint data;struct Node *prior,*next;Node,*NodeList;/定义双向循环链表结构体/=输入模块=/求指数函数值int axp(int a,int k)int r=1;if(k=0)return 1;for(;k>0;k-)r=r*a;return r;/输入转换函数Status conversion(char str,NodeList &oprh
10、)/将字符串形式的操作数转换成所需的类型NodeList p;int i,k,buffer;k=buffer=0;oprh=(NodeList)malloc(LEN);oprh->next=oprh;oprh->prior=oprh;for(i=strlen(str)-1;i>=0;i-)/若输入的数不合法就返回重新输入if(i!=0 | (str0!='-' && str0!='+')&&(stri>'9' | stri<'0')return ERROR;if(str
11、0='0' && str1!='0')return ERROR;if(str0='-' | str0='+') && str1='0')return ERROR;if(stri!='-' && stri!='+') buffer=buffer+(stri-'0')*axp(10,k); k+; if(k=4 | stri-1='-' | stri-1='+' | i=0)/将新建结点插入到
12、头结点之后 p=(NodeList)malloc(LEN); oprh->next->prior=p; p->prior=oprh; p->next=oprh->next; oprh->next=p; p->data=buffer; buffer=k=0;if(str0='-')oprh->data='-'elseoprh->data='+'return OK;/输入函数Status input(NodeList &opr1,NodeList &opr2,char str)in
13、t flag=OK,i,n=0,l; char bMAX; printf("n请输入第一个操作数:n");scanf("%s",b);getchar();l=strlen(b);for(i=0;i<l;i+)if(bi!=',')strn+=bi;strn='0'flag=conversion(str,opr1); while(!flag) printf("ERROR!Input again:n"); scanf("%s",str); getchar(); flag=conve
14、rsion(str,opr1);printf("n请输入第二个操作数:n");scanf("%s",b);getchar();n=0;l=strlen(b);for(i=0;i<l;i+)if(bi!=',')strn+=bi;strn='0'flag=conversion(str,opr2); while(!flag) printf("ERROR!Input again:n"); scanf("%s",str);getchar(); flag=conversion(str,o
15、pr2);return OK;/=输出模块=/输出函数Status output(NodeList oprr,char str)Status initbuf(char str);NodeList p;int i,j,num4;if(!oprr)return ERROR;p=oprr;i=j=0;initbuf(str);if(oprr->data='-')stri+='-'p=p->next;if(p->next=oprr && p->data=0)/若要输出的数为0则执行stri+='0'else whi
16、le(p!=oprr) num0=p->data/1000; num1=(p->data-num0*1000)/100; num2=(p->data-num0*1000-num1*100)/10; num3=p->data-num0*1000-num1*100-num2*10; while(j<4) if(numj!=0 | (str0='-' && str1!='0')|(str0!='-' && str0!='0') /此判断语句是为了避免输出诸如:00123的情况
17、 stri+=numj+'0' j+; p=p->next; j=0; stri+=',' if(str-i=',') stri='0'printf("%s",str);printf("n");return OK;/=预处理及杂项操作模块=/缓冲区部分初始化函数Status initbuf(char str)int i;for(i=0;i<=10;i+)stri='0'return OK;/比较链表长度函数int cmplinklen(NodeList opr1,
18、NodeList opr2)/opr1链比opr2链长则返回1,短则返回-1,否则返回0NodeList p1,p2;p1=opr1->prior;p2=opr2->prior;while(p1->prior!=opr1 && p2->prior!=opr2)p1=p1->prior;p2=p2->prior;if(p1->prior!=opr1)return 1;if(p2->prior!=opr2)return -1;return 0;/求链表长度int length(NodeList oprr)int count=0;Nod
19、eList p=oprr->next;while(p!=oprr)count+;p=p->next;return count;/生成指定长度链表Status Creat(NodeList &oprr,int len)NodeList p;oprr=(NodeList)malloc(LEN);p=oprr;while(len>0)p->next=(NodeList)malloc(LEN);p->next->data='?'p->next->prior=p;p=p->next;len-;p->next=oprr;o
20、prr->prior=p;return OK;/比较opr1、opr2绝对值的大小int compare(NodeList opr1,NodeList opr2)NodeList p1,p2;p1=opr1->next;p2=opr2->next;if(cmplinklen(opr1,opr2)=1)/opr1比较长return 1;else if(cmplinklen(opr1,opr2)=-1)/opr2比较长return -1;elsewhile(p1->data=p2->data && p1->next!=opr1)/注意p1->
21、;next!=opr1这条件 p1=p1->next; p2=p2->next;if(p1->data>p2->data)return 1;else if(p1->data<p2->data)return -1;else return 0;/=加减法模块=/加法基本操作Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr)/本算法实现A,B相加的操作。int CF,buffer; NodeList p1,p2,p3;oprr=(NodeList)malloc(LEN); opr
22、r->next=oprr;oprr->prior=oprr;p1=opr1->prior;p2=opr2->prior;CF=buffer=0;while(p1!=opr1 && p2!=opr2)buffer=p1->data+p2->data+CF;CF=buffer/10000;/若buffer的值大于9999则产生进位,赋给CF /将新建结点插入到头结点之后 p3=(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr;p3->next=oprr-
23、>next;oprr->next=p3;p3->data=buffer%10000;/应该将buffer的第四位赋给p3->datap1=p1->prior;p2=p2->prior;while(p1!=opr1)/处理opr1链的剩余部分buffer=p1->data+CF;CF=buffer/10000;p3=(NodeList)malloc(LEN);/将新建结点插入到头结点之后 oprr->next->prior=p3; p3->prior=oprr;p3->next=oprr->next;oprr->nex
24、t=p3;p3->data=buffer%10000;p1=p1->prior;while(p2!=opr2)/处理opr2链的剩余部分buffer=p2->data+CF;CF=buffer/10000;p3=(NodeList)malloc(LEN);/将新建结点插入到头结点之后 oprr->next->prior=p3; p3->prior=oprr;p3->next=oprr->next;oprr->next=p3;p3->data=buffer%10000;p2=p2->prior;if(CF)p3=(NodeList
25、)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr;p3->next=oprr->next;oprr->next=p3;p3->data=CF;oprr->data='+'return OK;/减法基本操作Status sub_bas(NodeList opr1,NodeList opr2,NodeList &oprr)/本算法实现A,B相减的操作。/将A链分成与B链长相等的底位部分,和剩余的高位部分,并做相应处理。int CF,buffer,flag;NodeList p
26、1,p2,p3,qh,qt,qq;oprr=(NodeList)malloc(LEN); oprr->next=oprr;oprr->prior=oprr;p1=opr1->prior;p2=opr2->prior;CF=buffer=flag=0;while(p2!=opr2)/opr2链的长度小于等于opr1链的if(p1->data<(p2->data+CF)buffer=10000+p1->data-(p2->data+CF);CF=1;elsebuffer=p1->data-(p2->data+CF);CF=0;p3=
27、(NodeList)malloc(LEN); oprr->next->prior=p3; p3->prior=oprr;p3->next=oprr->next;oprr->next=p3; p3->data=buffer;p1=p1->prior;p2=p2->prior;while(p1!=opr1)/处理opr1链剩下的部分if(p1->data<CF)buffer=10000+p1->data-CF;CF=1;elsebuffer=p1->data-CF;CF=0;p3=(NodeList)malloc(LEN
28、); oprr->next->prior=p3; p3->prior=oprr;p3->next=oprr->next;oprr->next=p3; p3->data=buffer;p1=p1->prior;/处理链表开头结点值为0的无意义情况,若链表本身表示0,则不做如下处理 p3=oprr->next;while(p3->data=0 && p3->next!=oprr)p3=p3->next;flag=1;if(flag)qh=oprr->next;/保存无用结点的头尾指针 qt=p3->
29、prior;/为释放做准备 oprr->next=p3;/重接next链 p3->prior=oprr;/重接prior链qt->next=NULL; while(qh!=NULL)/重接prior链 qq=qh; qh=qh->next; free(qq);oprr->data='+'return OK;/-带符号加法函数-Status add(NodeList opr1,NodeList opr2,NodeList &oprr)if(opr1=NULL | opr2=NULL)return ERROR;if(opr1->data=
30、opr2->data)/opr1,opr2符号相同add_bas(opr1,opr2,oprr);if(opr1->data='+')/opr1与opr2均为正数,即A+B的形式(A,B均是正数,下同)oprr->data='+'else/opr1与opr2均为负数,即(-A)+(-B)的形式oprr->data='-'else/符号不相同if(opr1->data='+')/A+(-B)的情况if(compare(opr1,opr2)=-1)/A<B的情况sub_bas(opr2,opr1,o
31、prr);oprr->data='-'else/A>=B的情况sub_bas(opr1,opr2,oprr);oprr->data='+'else/(-A)+B的情况if(compare(opr1,opr2)=1)/A>B的情况sub_bas(opr1,opr2,oprr);oprr->data='-'else/A<=B的情况sub_bas(opr2,opr1,oprr);oprr->data='+'return OK;/-带符号减法函数-Status sub(NodeList opr1,
32、NodeList opr2,NodeList &oprr)if(opr1=NULL | opr2=NULL)return ERROR;if(opr1->data=opr2->data)/opr1,opr2符号相同if(opr1->data='+')/A-B的情况if(compare(opr1,opr2)=-1)/A<B的情况sub_bas(opr2,opr1,oprr);oprr->data='-'else/A>=B的情况sub_bas(opr1,opr2,oprr);oprr->data='+'
33、else/(-A)-(-B)的情况if(compare(opr1,opr2)=1)/A>B的情况sub_bas(opr1,opr2,oprr);oprr->data='-'else/A<B的情况sub_bas(opr2,opr1,oprr);oprr->data='+'else/opr1,opr2符号不同add_bas(opr1,opr2,oprr);if(opr1->data='+')oprr->data='+'elseoprr->data='-'return OK;/=
34、乘法模块=/乘法函数Status imul(NodeList opr1,NodeList opr2,NodeList &oprr)NodeList ph1,ph2,pt1,pt2,p3,pt3,qh,qt,qq;int len,CF,flag;long buffer;if(compare(opr1,opr2)=-1)/若opr1比opr2小则被乘数跟乘数调换ph1=opr2;pt1=ph1->prior;ph2=opr1;pt2=ph2->prior;elseph1=opr1;pt1=ph1->prior;ph2=opr2;pt2=ph2->prior;len=
35、length(opr1)+length(opr2);Creat(oprr,len);qq=oprr->next;while(qq!=oprr)qq->data=0;qq=qq->next;buffer=CF=0;p3=oprr->prior;while(pt2!=ph2)pt1=ph1->prior;pt3=p3;while(pt1!=ph1)buffer=pt1->data*pt2->data+pt3->data+CF;CF=(int)buffer/10000;pt3->data=(int)buffer%10000;pt1=pt1->
36、;prior;pt3=pt3->prior;pt3->data=CF;CF=0;pt2=pt2->prior;p3=p3->prior;/处理链表开头结点值为0的无意义情况,若链表本身表示0,则不做如下处理flag=0; p3=oprr->next;while(p3->data=0 && p3->next!=oprr)p3=p3->next;flag=1;if(flag)qh=oprr->next;/保存无用结点的头尾指针 qt=p3->prior;/为释放做准备 oprr->next=p3;/重接next链 p
37、3->prior=oprr;/重接prior链qt->next=NULL; while(qh!=NULL)/释放无用结点 qq=qh; qh=qh->next; free(qq);if(opr1->data=opr2->data | oprr->next->data=0)oprr->data='+'elseoprr->data='-'return OK;/=除法模块=/除法子函数int idiv_sub(NodeList &opr1,NodeList opr2)NodeList p1,p2,qh,qt
38、,qq;int count,CF,buffer,flag;count=0;while(compare(opr1,opr2)!=-1)CF=buffer=0;p1=opr1->prior; p2=opr2->prior;while(p2!=opr2) if(p1->data<(p2->data+CF) buffer=10000+p1->data-(p2->data+CF); CF=1; else buffer=p1->data-(p2->data+CF); CF=0; p1->data=buffer;p1=p1->prior;p2
39、=p2->prior; if(p1!=opr1)/处理opr1链剩下的部份buffer=p1->data-CF;p1->data=buffer;/清头0flag=0; p1=opr1->next; while(p1->data=0 && p1->next!=opr1) p1=p1->next; flag=1; if(flag) qh=opr1->next;/保存无用结点的头尾指针 qt=p1->prior;/为释放做准备 opr1->next=p1;/重接next链 p1->prior=opr1;/重接prior
40、链 qt->next=NULL; while(qh!=NULL)/释放无用结点 qq=qh; qh=qh->next; free(qq);count+;return count;/除法函数Status idiv(NodeList opr1,NodeList opr2,NodeList &quti,NodeList &remand)/quti为商数链,remand为余数链int len_quti,len_reman,buffer;NodeList q1,q2,pq;if(compare(opr1,opr2)=-1)/除数比被除数大Creat(quti,1);quti-
41、>next->data=0;quti->next->next=quti;quti->prior=quti->next;remand=opr1;elselen_quti=length(opr1)-length(opr2); len_reman=length(opr2); Creat(quti,len_quti+1);/开辟商数链 Creat(remand,len_reman);/开辟余数链q1=opr1->next;q2=remand->next;/初始化remand链while(q2!=remand)q2->data=q1->data
42、;q1=q1->next;q2=q2->next;pq=quti->next;q1=q1->prior;/指针退回一步while(q1!=opr1)buffer=idiv_sub(remand,opr2);pq->data=buffer;if(q1->next!=opr1)remand->prior->next=(NodeList)malloc(LEN);remand->prior->next->next=remand;remand->prior->next->prior=remand->prior;re
43、mand->prior=remand->prior->next;remand->prior->data=q1->next->data;if(remand->next->data=0 && remand->next->next!=remand)remand->next->next->prior=remand;remand->next=remand->next->next;q1=q1->next;pq=pq->next;pq=quti->prior;while(p
44、q->data='?')pq=pq->prior;pq->next=quti;quti->prior=pq;if(opr1->data='-' && remand->next->data!=0)remand->data='-'elseremand->data='+'if(opr1->data=opr2->data | quti->next->data=0)quti->data='+'elsequti->data
45、='-'return OK;/=主操作模块=void title()int i;printf("n");for(i=0;i<33;i+)printf("*");printf("大整数计算器");for(i=0;i<33;i+)printf("*");printf("n");printf(" 输入1、2、3、4选择操作: n");printf(" 1、加法 n");printf(" 2、减法 n");printf(" 3、乘法 n");printf(" 4、除法 n"); printf("= =n");printf(" 请选择:");/打印欢迎屏幕void welcome()printf("=nn"); printf("欢迎使用大整数计算器n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度农业机械出租与农产品冷链物流合同3篇
- 二零二五年度公寓租赁合同书(含共享空间服务)3篇
- 2025年度大型国企原材料采购合同风险管理与优化3篇
- 2025年度公务车辆个人使用管理与费用监督协议3篇
- 二零二五年度数字健康产业合作成立公司协议3篇
- 2025年度车辆分期付款买卖合同协议书3篇
- 农村土地征收补偿安置买卖合同(2025年版)3篇
- 二零二五年度农村土地经营权流转与农业产业链金融合作合同2篇
- 二零二五年度高端医疗器械采购合同风险分析与预防3篇
- 二零二五年度美发品牌形象授权合作合同3篇
- 外研版小学英语(三起点)六年级上册期末测试题及答案(共3套)
- 跨部门合作销售提成方案
- 外研版(三起)四上Module1-Module10思维导图
- YY 9706.210-2021医用电气设备第2-10部分:神经和肌肉刺激器的基本安全和基本性能专用要求
- FZ/T 01041-2014绒毛织物绒毛长度和绒毛高度的测定
- 《经济学导论》考试复习题库(含答案)
- 农田水利渠道灌溉与排水课件
- 六棱块护坡施工方案
- 机械制图课件(完整版)
- 《行政组织学小抄》word版
- (完整版)环境科学与工程-专业英语词汇必备(免费)
评论
0/150
提交评论