任意长整数的四则运算.docx
《任意长整数的四则运算.docx》由会员分享,可在线阅读,更多相关《任意长整数的四则运算.docx(38页珍藏版)》请在冰豆网上搜索。
任意长整数的四则运算
1题目介绍和功能要求
1.1课程设计题目要求
【问题描述】:
设计一个实现任意长的整数进行加法运算的演示程序。
【题目容】:
利用双向循环链表实现长整数的存储,每个结点含一个整形变量。
任何整形变量的围是-(
-1)~(
-1)。
输入和输出形式:
按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【基本要求】:
(1)利用所学知识,设计相应的数据结构;
(2)熟练运用开发环境;
(3)完成软件的设计与编码;
(4)熟练地掌握基本的调试方法。
1.2题目分析
【需求分析】:
(1)本程序实现计算任意长的整数的加法运算.以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
(2)本演示程序中,数字字符限定为[‘0’~‘9’]和字符‘,’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
(3)利用双向循环链表现实长整数的存储,每个结点含一个整形变量。
输入的形式以回车结束,可以直接输入正数或负数。
按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。
2系统功能模块结构图
2.1系统功能结构框图
系统功能模块
主调程序模块
长整数运算模块
双向循环链表处理模块
界面模块
图2.1系统功能结构图
2.2主要模块的功能说明:
(1)主调程序模块:
voidmain()
{
初始化;
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双向循环链表的数据结构定义:
typedefstructNode//双向循环链表结点
{intdata;
structNode*prior,*next;
}Node,*NodeList;
3.2.2基本操作:
Statusconversion(charstr[],NodeList&oprh);
//将字符串形式的操作数转换成所需的类型
intcmplinklen(NodeListopr1,NodeListopr2);
//opr1链比opr2链长则返回1,短则返回-1,否则返回0
intlength(NodeListoprr);
//求链表长度
StatusCreat(NodeList&oprr,intlen);
//生成指定长度链表
intcompare(NodeListopr1,NodeListopr2);
//比较opr1、opr2绝对值的大小
4涉及到的函数的描述
4.1长整数操作函数
Statusinput(NodeList&opr1,NodeList&opr2,charstr[]);
//从键盘输入两个长整数,存至opr1和opr2中
Statusoutput(NodeListoprr,charstr[]);
//在屏幕打印长整数oprr
Statusadd_bas(NodeListopr1,NodeListopr2,NodeList&oprr);
//本算法实现A,B相加的操作
Statussub_bas(NodeListopr1,NodeListopr2,NodeList&oprr);
//本算法实现A,B相减的操作
Statusimul(NodeListopr1,NodeListopr2,NodeList&oprr);
//本算法实现A,B相乘的操作
Statusidiv(NodeListopr1,NodeListopr2,NodeList&quti,NodeList&remand);//本算法实现A,B相除的操作
4.2主要函数
主程序模块:
//intmain()
双向循环链表处理模块:
//Statusconversion(charstr[],NodeList&oprh);
//intcmplinklen(NodeListopr1,NodeListopr2);
//StatusCreat(NodeList&oprr,intlen);
//intcompare(NodeListopr1,NodeListopr2);
长整数四则运算模块:
//Statusadd_bas(NodeListopr1,NodeListopr2,NodeList&oprr);
//Statussub_bas(NodeListopr1,NodeListopr2,NodeList&oprr);
//Statusimul(NodeListopr1,NodeListopr2,NodeList&oprr);
//Statusidiv(NodeListopr1,NodeListopr2,NodeList&quti,NodeList&remand);
界面模块:
//voidtitle();//voidwelcome();
5主要算法程序流程图
5.1程序流程图
输出数据
输出数据
否
是
程序结束
程序结束
图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
#include
#include
#include
#include
#include
#defineLENsizeof(structNode)
#defineMAX1000
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineTRUE1
#defineFALSE0
typedefintStatus;
typedefstructNode
{
intdata;
structNode*prior,*next;
}Node,*NodeList;
//===============输入模块===============
//求指数函数值
intaxp(inta,intk)
{
intr=1;
if(k==0)
return1;
for(;k>0;k--)
r=r*a;
returnr;
}
//输入转换函数
Statusconversion(charstr[],NodeList&oprh)
{//将字符串形式的操作数转换成所需的类型
NodeListp;
inti,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'))
returnERROR;
if(str[0]=='0'&&str[1]!
='\0')
returnERROR;
if((str[0]=='-'||str[0]=='+')&&str[1]=='0')
returnERROR;
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='-';
else
oprh->data='+';
returnOK;
}
//输入函数
Statusinput(NodeList&opr1,NodeList&opr2,charstr[])
{
intflag=OK,i,n=0,l;
charb[MAX];
printf("\n请输入第一个操作数:
\n");
scanf("%s",b);
getchar();
l=strlen(b);
for(i=0;iif(b[i]!
=',')
str[n++]=b[i];
str[n]='\0';
flag=convers