内容发布更新时间 : 2024/12/23 2:56:36星期一 下面是文章的全部内容请认真阅读。
C语言课程设计说明书
题目:长整型数四则运算
学 院: 班级: 学生: 学号: 班内序号:
提交日期:年月日
目 录
一、需求分析1 二、设计思路1 三、详细设计2
1、主要函数2
2、函数的主要调用关系图3 四、调试分析及编程心得体会3 五、用户手册3 六、测试结果3 七、源程序代码4
1、 main.c 主控文件4
2、IntFace.h 程序界面模块头文件5 3、IntFace.c 程序界面处理模块文件6
4、LongInt.h 长整型数输入输入及运算模块头文件8 5、LongIO.c 长整型数输入输出处理模块文件8 6、LongInt.c 长整型数运算处理模块文件10 7、DuCiLink.h 双向循环链表处理模块头文件15 8、DuCiLink.c 双向循环链表处理模块代码16
一、需求分析
1、 设计一个实现任意长的整数进行四则运算的程序。
2、 输入和输出形式是按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,长整数位数没有上
限,以分号结束长整型数据的输入。 3、 程序执行的命令包括: 1)、输入长整数1;2)、输入长整数2;3)、输入执行的运算符;4)、计算并输出结果;5)、结束。 4、测试数据:(以加法为例) (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”.
二、设计思路
我们首先要考虑的是如何表示长整型数。按照传统习惯要求每4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。总之,为了实现上述功能,应以双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过9999的整数,整个链表用十进制数表示。(3)对于每一个长整型数可以设置一个头结点,其中的数据域用来表示该长整型数的正负号及组数,该值的符号则表示该长整型数的符号,该数的绝对值表示该长整型数包含的4位数的组数。第一个存储4位数据组的结点称为首结点,而最后一个4位数据组结点称为尾结点。
为此需要两个结构数据类型:双向循环链表和长整数,两个类型采用相同的结构,只是双向循环链表用来存储数据,长整型用表示数据的运算。 1、 双向循环链表的数据结构及操作定义如下:
typedef short ElemType; //定义基本数据类型,我们采用short来表示任意4位整数。 typedef struct DuCiLinkNode{ // 双向循环链表结点的存储结构 ElemType data;
struct DuCiLinkNode *prior; //指向上一结点 struct DuCiLinkNode *next; //指向下一结点
}DuCiLinkNode,*DuCiLinkList; //定义双向循环链表结点及链表的类型名 基本操作:
DuCiLinkNode *MakeNode(ElemType e); //以4位整数e构造1个双向循环链表结点
Status InitList(DuCiLinkList *L); //初始化1个双向循环链表,分配1个结点作头结点 //数据域赋初值0,上下结点指针指向自己
void DestroyList(DuCiLinkList *L); //消毁1个双向循环链表,释放它所占用的所有内存空间 //并让链表*L指向NULL
void ClearList(DuCiLinkList L); //清除1个双向循环链表,释放数据结点所占用的内存空间 //保留头结点,并将数据域置为0,上下结点指针指向自己 Status InsTail(DuCiLinkList L, ElemType e);//在双向循环链表L的尾结点之后加入1个以e为 //数据域的新结点,并返回OK; 否则返回ERROR。
Status InsFirst(DuCiLinkList L, ElemType e);
//将数据元素e插入在线性链表L头结点之后,并返回OK; 否则返回ERROR。 Status CopyList(DuCiLinkList L, DuCiLinkList C); //将双向循环链表L复制到双向循环链表C中。 2、 长整数的数据类型和和操作定义为:
typedef struct DuCiLinkNode LongIntNode,*LongInt;//采用双向循环链表为实际的存储结构 void OutputNumber(LongInt a); //输出一个长整型数
void InputNumber(LongInt a,int OneOrTwo); //输入一个长整型数 void add(LongInt c,LongInt a,LongInt b); //长整型数 c = a + b void sub(LongInt c,LongInt a,LongInt b); //长整型数 c = a - b Status mul(LongInt c,LongInt a,LongInt b); //长整型数 c = a * b
void div(LongInt c,LongInt a,LongInt b); //长整型数 c = a / b (整除) void rem(LongInt c,LongInt a,LongInt b); //长整型数 c = a % b (求余) void power(LongInt c,LongInt a,int n); //长整型数 c = a ^ n (乘方) 3、 本程序包含四个模块:
1) 主程序模块:
void main() //main.c {
初始化; do{
接受命令; 处理命令;
}while(“命令”=“结束”) }
2) 程序界面模块 //IntFace.c, IntFace.h 3) 双向循环链表处理模块 //DuCiLink.c,DuCiLink.h 4) 长整型数的输入输出模块 //LongIO.c, LongInt.h 5) 长整数运算模块 //LongInt.c LongInt.h 各模块之间的调用关系如下:
主程序模块 程序界面模块 长整数运算模块 长整数输入输出模块 双向循环链表单元模块
三、详细设计
1、主要函数
(1)、主控模块main.c
void DoCommand() //根据输入命令进行相应的处理 void Calculate() //执行计算功能 void ReSet() //重设系统环境 (2)、程序界面模块 IntFace.c
void InitiInterface(); //界面初始化
void GoToCmdxy(); //将光标定位到命令选项提示之后 void GoToPrompt(); //将光标定位到命令选项提示行首 void ShowMainPrompt(); //显示命令选项提示
void ClearScreen(); //以清除整个屏幕,并设置为黑底白字模式 void ClearPromptLine(); //清除提示行的显示 void ClearWorkSpace(); //清除工作区的显示
void InputNumberBox(int OneOrTwo);//指定两个输入数的输入窗口,如果超过这个范围文字将自动流动 void ResultBox(); //指定计算结果的显示窗口,如果超过这个范围文字将自动流动 (3)、长整型数输入输出模块 见二小节2分节 (4)、长整型数四则运算处理模块 见二小节2分节 (5)、长整型数存储模块—双向循环链表模块见二小节1分节