当前位置:文档之家› 任意长整数的四则运算

任意长整数的四则运算

1 题目介绍和功能要求1.1 课程设计题目要求【问题描述】:设计一个实现任意长的整数进行加法运算的演示程序。

【题目容】:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。

任何整形变量的围是-(215- 1)~(215- 1)。

输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。

【基本要求】:(1)利用所学知识,设计相应的数据结构;(2)熟练运用开发环境;(3)完成软件的设计与编码;(4)熟练地掌握基本的调试方法。

1.2 题目分析【需求分析】:(1)本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。

(2)本演示程序中,数字字符限定为[‘0’~‘9’]和字符‘,’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。

(3)利用双向循环链表现实长整数的存储,每个结点含一个整形变量。

输入的形式以回车结束,可以直接输入正数或负数。

按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。

2 系统功能模块结构图2.1 系统功能结构框图图2.1 系统功能结构图2.2主要模块的功能说明:(1)主调程序模块:void main(){初始化;do{接受命令;处理命令;}while(“命令”=”退出”)}(2)双向循环链表处理模块//cmplinklen.h //Creat.h //compare 说明:进行链表的存储和处理(3)长整数运算模块//add.h // sub.h //imul.h //idiv.h 说明:对长整数进行四则运算(4)界面模块//title.h //welcome.h说明:控制系统运行操作界面3 数据结构的设计及用法说明3.1概要说明为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,仅绝对值不超过9999的整数,整个链表用十进制数表示。

利用头结点数据域的符号表示长整数的符号,相加过程不破坏两个操作数链表,对长整数位数不作上限。

为此需要两个结构数据类型:双向循环链表和长整数。

3.2用法说明3.2.1 双向循环链表的数据结构定义:typedef struct Node //双向循环链表结点{ int data;struct Node *prior,*next;}Node,*NodeList;3.2.2 基本操作:Status conversion(char str[],NodeList &oprh);//将字符串形式的操作数转换成所需的类型int cmplinklen(NodeList opr1,NodeList opr2);//opr1链比opr2链长则返回1,短则返回-1,否则返回0 int length(NodeList oprr);//求链表长度Status Creat(NodeList &oprr,int len);//生成指定长度链表int compare(NodeList opr1,NodeList opr2);//比较opr1、opr2绝对值的大小4 涉及到的函数的描述4.1长整数操作函数Status input(NodeList &opr1,NodeList &opr2,char str[]);//从键盘输入两个长整数,存至opr1和opr2中Status output(NodeList oprr,char str[]);//在屏幕打印长整数oprrStatus add_bas(NodeList opr1,NodeList opr2,NodeList &oprr);//本算法实现A,B相加的操作Status sub_bas(NodeList opr1,NodeList opr2,NodeList &oprr);//本算法实现A,B相减的操作Status imul(NodeList opr1,NodeList opr2,NodeList &oprr);//本算法实现A,B相乘的操作Status idiv(NodeList opr1,NodeList opr2,NodeList &quti,NodeList &remand);//本算法实现A,B相除的操作4.2主要函数主程序模块: //int main()双向循环链表处理模块://Status conversion(char str[],NodeList &oprh);//int cmplinklen(NodeList opr1,NodeList opr2);//Status Creat(NodeList &oprr,int len);//int compare(NodeList opr1,NodeList opr2);长整数四则运算模块://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 &oprr);//Status idiv(NodeList opr1,NodeList opr2,NodeList &quti,NodeList &remand);界面模块: //void title(); //void welcome();5 主要算法程序流程图5.1 程序流程图否是6 程序测试(1) 程序运行环境为DOS界面,执行文件为“长整数四则运算.exe”(2) 进入演示程序后即显示文本方式的用户界面图6.1 用户界面(3) 输入命令,执行相应的功能:1---加法运算2---减法运算3---乘法运算4---除法运算5---退出系统图6.2 执行界面(4) 加法运算测试图6.3 加法运算界面(5) 减法运算测试图6.4 减法运算界面(6) 乘法运算测试图6.5 乘法运算界(7) 除法运算测试图6.6 除法运算界面7 参考文献[1] 严蔚敏,吴伟民.数据结构(C语言版)[M].:清华大学,2006[2] 吕国英.算法设计与分析[M].:清华大学,2006[3] 徐宝文,志.C程序设计语言[M].:机械工业,2004[4] 滕国文.数据结构课程设计[M].:清华大学,2010[5] 仕华.数据结构课程设计(第2版)[M].:机械工业,2010[6] 建学,光.数据结构课程设计案例精编[M].:清华大学,2010[7] 汪沁,奚峰.数据结构与算法[M].:清华大学,2012[8] 奚小玲,敖广武.数据结构理论与实践[M].:东北大学,2010附录:程序清单(带有必要的注释) #include<cstdio>#include<cstring>#include<malloc.h>#include<conio.h>#include<stdlib.h>#include<stdio.h>#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;typedef struct Node{int 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){//将字符串形式的操作数转换成所需的类型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 || (str[0]!='-' && str[0]!='+'))&&(str[i]>'9' || str[i]<'0')) return ERROR;if(str[0]=='0' && str[1]!='\0')return ERROR;if((str[0]=='-' || str[0]=='+') && str[1]=='0')return ERROR;if(str[i]!='-' && str[i]!='+'){buffer=buffer+(str[i]-'0')*axp(10,k);k++;if(k==4 || str[i-1]=='-' || str[i-1]=='+' || i==0){//将新建结点插入到头结点之后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(str[0]=='-')oprh->data='-';elseoprh->data='+';return OK;}//输入函数Status input(NodeList &opr1,NodeList &opr2,char str[]) {int flag=OK,i,n=0,l;char b[MAX];printf("\n请输入第一个操作数:\n");scanf("%s",b);getchar();l=strlen(b);for(i=0;i<l;i++)if(b[i]!=',')str[n++]=b[i];str[n]='\0';flag=conversion(str,opr1);while(!flag){printf("ERROR!Input again:\n");scanf("%s",str);getchar();flag=conversion(str,opr1);}printf("\n请输入第二个操作数:\n"); scanf("%s",b);getchar();n=0;l=strlen(b);for(i=0;i<l;i++)if(b[i]!=',')str[n++]=b[i];str[n]='\0';flag=conversion(str,opr2);while(!flag){printf("ERROR!Input again:\n");scanf("%s",str);getchar();flag=conversion(str,opr2);}return OK;}//==================输出模块====================== //输出函数Status output(NodeList oprr,char str[]){Status initbuf(char str[]);NodeList p;int i,j,num[4];if(!oprr)return ERROR;p=oprr;i=j=0;initbuf(str);if(oprr->data=='-')str[i++]='-';p=p->next;if(p->next==oprr && p->data==0)//若要输出的数为0则执行str[i++]='0';elsewhile(p!=oprr){num[0]=p->data/1000;num[1]=(p->data-num[0]*1000)/100;num[2]=(p->data-num[0]*1000-num[1]*100)/10;num[3]=p->data-num[0]*1000-num[1]*100-num[2]*10;while(j<4){if(num[j]!=0 || (str[0]=='-' && str[1]!='\0')||(str[0]!='-' && str[0]!='\0'))//此判断语句是为了避免输出诸如:00123…的情况str[i++]=num[j]+'0';j++;}p=p->next;j=0;str[i++]=',';}if(str[--i]==',')str[i]='\0';printf("%s",str);printf("\n");return OK;}//================预处理及杂项操作模块====================//缓冲区部分初始化函数Status initbuf(char str[]){int i;for(i=0;i<=10;i++)str[i]='\0';return OK;}//比较链表长度函数int cmplinklen(NodeList opr1,NodeList opr2){//opr1链比opr2链长则返回1,短则返回-1,否则返回0 NodeList 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;NodeList 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;oprr->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;else{while(p1->data==p2->data && p1->next!=opr1)//注意p1->next!=opr1这条件{p1=p1->next;p2=p2->next;}if(p1->data>p2->data)return 1;else if(p1->data<p2->data)return -1;elsereturn 0;}}//=====================加减法模块==========================//加法基本操作Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr){//本算法实现A,B相加的操作。

相关主题