课程设计 长整数四则运算
- 格式:docx
- 大小:24.16 KB
- 文档页数:18
课程设计实验报告:1.4长整数四则运算
题目:长整数四则运算
一、实验内容
【问题描述】
设计一个实现任意长的整数进行加法运算的演示程序
【基本要求】
利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是-(2八15-1)〜(2八15-1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【实现基本功能】
⑴是想长整数的四则运算;
(ii)实现长整数的乘方和阶乘运算;
(iii)整形量范围是-(2沏-1)~(2八n-1),其中n是由程序读入的参量。输入数据的分组方法另行规定;
【实现加强版本的功能】
⑴四则运算在原来版本的基础上支持小数运算,除法还可以通过输入整数后加小数点与相应要求取的精确位数求出精确值,如:求取3666除以7的后三位精确值,可以在输入时将除数输入为3666.000或3666.0000,就能得出相应的精确位数,当然求取后,没有余数的输出;
(ii)乘方的功能也进行了强化,支持小数操作;
(iii)添加了多个出错处理(即输入重操作)对相应数据输入与输出进行提示;
【加强版的实现原理】
⑴加减法运算加强:在原来版本的基础上依照基本的加减法操作将数据用小数点进行分隔,记录下连个输入数的小数位长度,并将小数位较短的一个数据后补0直至小数位数相同,然后用函数处理输出的数据;
(ii)乘除法、乘方:其处理方法较为简单,主要是记录数据中小数位数的长度,然后通过每种运算方式不同的运算原理截取小数位,再按照输出格式将数据处理进行输出;
(iii)根据定义,阶乘保持不变; 【特色分析】
⑴加强版程序加上了简单的声音提示,无论是输入与输出均会有八个音符的其中之一对输入与输出与否进行提示,同时在输入输出数据出错时,还会用三个音符对重输入进行提示,增强了人性化操作;
【测试数据】
(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。
(4)1,0001,0001;-1,0001,0001;应输出“0”。
(5)1,0001,0001;-1,0001,0000;应输出“1”。
(6)-9999,9999,9999;-9999,9999,9999;应输出“1,9999,9999,9998”。
(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
二、实验目的
1、熟悉掌握双向循环链表的基本操作;
2、熟悉任意长字符串的输入,并实现把字符串转化为整数;
3、熟悉任意长整数的加法运算;
4、更进一步掌握有关类的操作
三、实验文档:
长整数四则运算
需求分析
⑴本程序实现计算任意长的整数的加法运算.以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
(ii)本演示程序中,集合的元素限定为数字字符[„0'~'9']和字符„,'与„;,,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
(iii)利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。
口学自行定义的测试数据 (1)0;0;输出“0”;
(2)-2345,6789;;-7654,3211;;加法输出“-1,000,000”;
(3)-9999,9999;;1,0000,0000,0000;;加法输出“9999,0000,0001”;
(4)1,0001,0001;;1,0001,0001;减法输出“0”;
(5)1,0001,0001;;1,0001,0000;;减法输出”1”;
(6)-9999,9999,9999;;-9999,9999,9999;加法输出“-1,9999,9999,9998”;
(7)1,0000,9999,9999;1;加法输出"1,0001,0000,0000";
(8)10;8;乘方输出"1,0000,0000";
(9)-98,9997;3;除法输出-32,9999;
(10)6;阶乘输出720;
四、概要设计
为实现上述程序功能,应以双向循环链表表示长整数。为此,需要定义一个抽象数据类型。1、抽象数据类型定义为:
ADTOrderedOperation{
数据对象:D={ailai£int,i=1,2,...n,n>0}
数据关系:R1={lai-1,ai£D|=2,……n}
基本操作:
Statusconversion(str,oprh)
//操作结果:输入转换函数,将字符串形式的操作数转换成所需的类型
cmplinklen(opr1,opr2)
〃操作结果:比较链表长度函数,opr1链比opr2链长则返回1,短则返回-1,否则返//回0
length(oprr)
//操作结果:求链表长度
StatusCreat(oprr,len)
//操作结果:生成指定长度链表
compare(opr1,opr2) 〃操作结果:比较opri、opr2绝对值的大小
Statusinit(oppr)
//初始化链表函数
Statusdistroy(oprr)
//销毁链表函数
Statusevaluate(opri,i)
〃操作结果:链表短赋值函数,将i的值转换成万进制类型,i为整形变量
Statusadd_bas(opr1,opr2,oprr)
〃操作结果:加法基本操作,本算法实现A,B相加的操作。
Statussub_bas(opr1,opr2,oprr)
〃减法基本操作,本算法实现A,B相减的操作
Statusadd(opr1,opr2,oprr)
//操作结果:带符号加法运算
Statussub(opr1,opr2,oprr)
//操作结果:带符号减法函数
Statusimul(opr1,opr2,oprr)
//操作结果:乘法运算
Statusidiv(opr1,opr2,quti,remand)
//操作结果:除法运算
Statusimul_power(opr1,n,oprr)
〃操作结果:乘方运算,运用了二分思想,时间长度为lgN
Statusimul_factorial(opr1,oprr)
//操作结果:阶乘运算
Statusoutput(oprr,str)
//操作结果:输出的数据按四位一组,分隔符为","的格式
}ADTOrderedOperation
链表抽象数据类型的定义:
ADTList{
数据对象:D={ailai£ElemSet,i=1,2,...,n,n=0}
数据关系:R1={lai1,aiGD,i=1,2,…,n}
基本操作:
Statusinitbuf(charstr[]) 〃操作结果:缓冲区部分初始化函数,返回OK
intcmplinklen(NodeListopr1,NodeListopr2)
〃操作结果:opri链比opr2链长则返回1,短则返回-1,否则返回0
intlength(NodeListoprr)
//操作结果:计算链表长度,并返回链表长度的操作数
StatusCreat(NodeList&oprr,intlen)
〃操作结果:生成指定长度链表,返回OK
intcompare(NodeListopr1,NodeListopr2)
〃操作结果:比较opri、opr2绝对值的大小
Statusinit(NodeList&oppr)
//操作结果:初始化链表函数
Statusdistroy(NodeList&oprr)
〃操作结果:销毁链表函数,返回OK
Statusevaluate(NodeList&opri,inti)
〃操作结果:链表短赋值函数,将i的值转换成万进制类型,i为整形变量
}ADTOrderedList
2、本程序大体包含三个模块:
(i)主程序模块:
voidmain()
{
初始化;
do
{
接受命令;
处理命令;
}while(“命令”="退出")
}
(ii)集合单元模块——实现集合的抽象数据类型
(iii)结点结构单元模块——定义集合的结点结构
各模块之间的关系如下:
主程序 I口I
集合单元模
结点结构单元模块
3、本程序细分为以下几大功能模块:
⑴输入模块;
(ii)输出模块;
(iii)预处理及相关操作模块
(iv)四则预算模块及(包含乘方、阶乘);
(v)主操作模块;
五、详细设计(伪代码)
1、头文件的定义部分
#include
#include
#include
#include
#include
#include
#defineLENsizeof(structNode)
#defineMAX1000
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineTRUE1
#defineFALSE0
typedefchar_TCHAR;
typedefintStatus;
2、输入模块:
//求指数函数值
intaxp(inta,intk)