长整数加减-实验报告

2019-08-31 17:16

附件中是实验报告书写参考模式,这是往届同学的一份实验报告,尽管不是尽善尽美,但是相对比较规范,仅供参考。另外,也可以参考数据结构题集中P83页的实验报告模式。注意,实验报告模板中的实验大标题不要改动(线性表实现方法),把你的具体实验内容写到小标题上。 范艳峰

第 1 页 共 15 页

实验一 线性表实现方法

题目:编制一个长整数加减运算实现的程序

班级: 姓名: 学号: 完成日期: - -

一、需求分析

1、 本实验中演示中,长整数的每位上的数字必须为数字[0——9]之间,长整数的位数要求无限长。测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。

2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中不符合要求的字符)和运算结果显示在其后。

3、程序执行的命令包括: (1)创建第一个长整数;(2)执行加法或者减法;(3)创建第二个长整数;(4)结束。 4、测试数据

(1)Please Enter the First long Integer:12345678999999999999999

+ or - :+

Please Enter the Second long Integer:98765432ht1111111111k11111111111 12345678999999999999999 +

98765432111111111111111111111 =

98765444456780111111111111110

(2)Please Enter the First long Integer:1234567899hu99999fg99999999

+ or - :-

Please Enter the Second long Integer:98765432hr1111111ky11111111111111 12345678999999999999999 -

98765432111111111111111111111 =

-98765419765432111111111111112

二、概要设计

第 2 页 共 15 页

为实现上述程序功能,可以用链表或者长数组表示长整数,如果用数组表示长整数有个缺点就是长整数不能无限长,而链表能动态开辟空间,它克服了这个缺点,所以次试验用链表来表示长整数。

1、链表的抽象数据类型定义为: ADT Number{

数据对象:D={ai| ai∈(0,1,?,9),i=0,1,2,?,n,n≥0} 数据关系:R={< ai-1, ai >| ai-1, ai∈D,i=1,2,?,n} 基本操作:

CreateList(&L)

操作结果:创建一个链表L。 PrintList(L)

初始条件:链表L已存在。

操作结果:在屏幕上输出链表的值。 PlusList(L1,L2,a)

初始条件:链表L1,L2已存在,a为+ or – 表示加减。 操作结果:将两链表的值相加然后在屏幕上输出。 DestroyList(&L)

初始条件:链表L已存在。 操作结果:销毁链表L。

} ADT Number

2、本程序包含五个模块: (1)主程序模块: int main(){

定义变量; 接受命令; 处理命令; 退出(return 0);

}

(2)创建链表模块——产生一个长整数;

(3)输出链表模块——把链表产生的一个长整数输出;

(4)两链表加减模块——即求两个由链表产生的长整数的加减并输出结果; (5)销毁链表模块——程序结束后释放链表开辟的空间。 各模块之间的调用关系如下:

主程序模块

L1 L2 创建链表模块 +or - : 创建链表模块

L2 L1 输出链表模块 +or - 输出链表模块

= 两链表加减模块

第 3 页 共 15 页

L1 L2 销毁链表模块 销毁链表模块

结束 三、详细设计

1、定义头文件

#include #include using namespace std;

2、元素类型、节点类型和指针类型

struct Number //链表的类型 {

int data; //链表当前结点的值

struct Number *next; //链表当前结点指向下一结点的指针 struct Number *prior; //链表当前结点指向前一结点的指针 }*number1,*number2; //定义该链表类型的两个指针对象

3、创建链表模块,即产生一个长整数

void CreateList(Number *&L) //创建长整数 {

Number *s,*r; //定义两个链表类型的临时指针 char x; //定义一个临时字符变量

L=(Number *)malloc(sizeof(Number)); //为头结点开辟空间

L->next=L->prior=NULL; //此时头结点的后继指针和前驱指针赋值为空 r=L; //是r指针指向头结点

x=getchar(); //用x接受一个从键盘输入的字符 while(x!='\\n') //控制当输入回车键时结束 { if(x>='0'&&x<='9') //过滤不符合要求的字符 { s=(Number *)malloc(sizeof(Number)); //开辟下一结点的空间 s->data=x-'0'; //将字符转化为int型赋给结点 r->next=s; //r的后继指针指向s s->prior=r; //s的前驱指针指向r r=s; //是s指向r } x=getchar(); //用x接受一个从键盘输入的字符 };

r->next=NULL; //当创建结束时,r的后继指针为空 }

4、输出链表模块,把链表产生的一个长整数输出

第 4 页 共 15 页

void PrintList(Number *L) //输出长整数 {

Number *p=L->next; //定义一个临时指针并指向链表的第一个结点 while(p!=NULL) //判断结点是否为空,空就结束 { cout<data; //输出结点的值 p=p->next; //指向下一个结点 }

cout<

5、两链表加减模块,即求两个由链表产生的长整数的加减并输出结果

void PlusList(Number *L1,Number *L2,char a) //两个长整数加减运算 {

Number *p,*q,*r,*p1,*q1; //定义几个链表类型的临时指针 int i=0,j=0; //定义几个临时的整型变量

while(L1->next!=NULL) //将指针p指向第一个长整数的尾节点并算出它的长度i { p=L1->next; L1->next=L1->next->next; i++; }

while(L2->next!=NULL) //将指针q指向第二个长整数的尾节点并算出它的长度j { q=L2->next; L2->next=L2->next->next; j++; }

if(a= ='+') //将两个长整数相加 { if(i>j) //当第一个长整数的长度大于第二个 { while(i!=0) //控制长整数的长度 { while(j!=0) //控制短整数的长度 { if((p->data+q->data)>9) //当两数相加大于9向前一位进一 { p->data=p->data+q->data-10; p->prior->data=p->prior->data+1; } else p->data=p->data+q->data; //不进位 p=p->prior; //指针向前移 q=q->prior; //指针向前移

第 5 页 共 15 页


长整数加减-实验报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:消防部队副团职干部竞聘演讲稿

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: