版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实习1 1.4长整数四则运算实习报告题目:设计一个实现任意长的整数进行加法运算的演示程序。一、 需求分析1.本演示程序中,利用双向循环链表实现长整数的存储,每个结点含一个整型变量任何整型变量的范围是-(215-1)(215-1)。在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。输入和输出形式按中国对于长整数的习惯,每四位一组,组间用逗号隔开。 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入数据中的非法字符)和运算结果显示在其后。3.程序执行的命令包括:(1)
2、构造链表;(2)输入数据;(3)数据处理;(4)结束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。二、
3、 概要设计struct LinkNode /定义结构体LinkNodeint data; /记录每个节点的整数(小于10000)LinkNode *next; /记录下一个节点的地址LinkNode *pre; /记录前一个节点的地址;class LinkList /定义类LinkListprivate:LinkNode *head0,*head1; /head0,head1分别记录两个整数链表的头指针LinkNode *currptr;LinkNode *result; /result记录结果链表的头指针public:LinkList(); /构造函数,初始化链表LinkList(); /析
4、构函数,释放空间void Creat(string a); /引入字符串,创立两个链表,分别表示两个整数void Add(); /实现两个整数相加void Display(); /显示结果void addtwo(); /节点多的作为被加数,少的作为加数,实现整 /数绝对值大的加小的;void main() /主函数do while(Yes_No='y'|Yes_No='Y'); /Yes_No不等于'Y'或'y'时,程序退出三、详细设计#include<iostream>#include<string>#i
5、nclude<math.h>using namespace std;struct LinkNodeint data; /记录每个节点的整数(小于10000)LinkNode *next; /记录下一个节点的地址LinkNode *pre; /记录前一个节点的地址;class LinkListprivate:LinkNode *head0,*head1; /head0,head1分别记录两个整数链表的头指针LinkNode *currptr;LinkNode *result; /result记录结果链表的头指针public:LinkList(); /构造函数,初始化链表LinkLis
6、t(); /析构函数,释放空间void Creat(string a); /引入字符串,创立两个链表,分别表示两个整数void Add(); /实现两个整数相加void Display(); /显示结果void addtwo(); /节点多的作为被加数,少的作为加数,实现整 /数绝对值大的加小的;/链表的实现部分int sum(int n);LinkList:LinkList() /构造函数,初始化链表head0=new LinkNode; /申请一个空间记录整数的符号和节点数head1=new LinkNode;head0->next=head0;head0->pre=head0
7、; /初始化链表,建立双向循环链表head1->next=head1;head1->pre=head1; result=new LinkNode;result->next=result;result->pre=result;currptr=NULL;LinkList:LinkList() /析构函数,释放空间LinkNode *p1=head0,*p2=head1,*p3=result; /三个指针分别指向三条链表的头指针while(p1!=p1->pre) p1->pre->next=p1->next; p1->next->pre=
8、p1->pre; currptr=p1; p1=p1->next; delete currptr;while(p2!=p2->pre) /逐个删除节点,释放空间 p2->pre->next=p2->next; p2->next->pre=p2->pre; currptr=p2; p2=p2->next; delete currptr;while(p3!=p3->pre) p3->pre->next=p3->next; p3->next->pre=p3->pre; currptr=p3; p3=
9、p3->next; delete currptr;/ delete p1;/ delete p2;/ delete p3;void LinkList:Creat(string a) /引入字符串,创立两/个链表,分别表示两个整数int i=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0; /i记录字符串,j记录加数节点数;s记录被加数节点数/w标记字符串中的-号/k记录字符串中的字符转化为整数的值,l使每个节点记录4位while(am!='') m+; /m记录字符串中被加数的字符数 n=m; while(an!='0') n+; /n记录字符
10、串的总字符数if(a0='-') head0->data=(-1); /记录整数符号 w=1;else head0->data=1;for(i=m-1;i>=w;i-) if(ai!=',') /把字符转化为整数 k+=(ai-'0')*sum(l); l+; if(ai=','|i=w) currptr=new LinkNode; /把整数存到双向循环链表中 currptr->data=k; currptr->next=head0; currptr->pre=head0->pre; he
11、ad0->pre->next=currptr; head0->pre=currptr; head0=currptr; s+; /节点数加1 k=0; /重新初始化k和l l=0; head0->pre->data*=s; /存储整数符号和节点数/与建第一个整数链表一样,建立第二个整数链表head1k=0;l=0;if(am+1='-') head1->data=(-1); m+;else head1->data=1;for(i=n-1;i>m;i-) if(ai!=',') k+=(ai-'0')*
12、sum(l); l+; if(ai=','|i=m+1) currptr=new LinkNode; currptr->data=k; currptr->next=head1; currptr->pre=head1->pre; head1->pre->next=currptr; head1->pre=currptr; head1=currptr; j+; k=0; l=0; head1->pre->data*=j;void LinkList:Add() /实现两个整数相加LinkNode *temp;if(abs(head0
13、->pre->data)>abs(head1->pre->data) /两个整数中,绝对值大的为被加数 addtwo();else if(abs(head0->pre->data)<abs(head1->pre->data) temp=head0; head0=head1; head1=temp; addtwo();else if(abs(head0->pre->data)=abs(head1->pre->data) int k1,k2; LinkNode *p=head0,*q=head1; /如果节点数相同
14、,则判断节点中数值大小while(p->data=q->data&&p!=head0->pre->pre&&q!=head1->pre->pre) p=p->next; q=q->next; k1=p->data; k2=q->data; if(k1>k2) addtwo(); else temp=head0; head0=head1; head1=temp; addtwo(); void LinkList:addtwo() /节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的/默认hea
15、d0存的整数绝对值比head1大int s=0,m1=head0->data,m2=head1->data;m1=(head0->pre->data/abs(head0->pre->data); /head0的符号m2=(head1->pre->data/abs(head1->pre->data); /head1的符号LinkNode *p=head0->pre->pre,*q=head1->pre->pre;result->data=head0->pre->data; /存结果的节点数和符号
16、 while(q!=head1->pre) /head0存的整数绝对值比head1大,即head0的节点数大于或等于head1 currptr=new LinkNode; currptr->data=(p->data)*m1+(q->data)*m2+s; /两整数相加 if(m1*m2)>0) /如果符号相同 if(abs(currptr->data)-10000>=0) /相加后超过10000,则进位 s=currptr->data/10000; currptr->data=abs(currptr->data)%10000; el
17、se /abs(currptr->data)-10000<0,不进位 s=0; currptr->data=abs(currptr->data); else if(m1>0&&m2<0) /符号不同,在此相当于实现两个正整数相减 s=0; if(currptr->data<0) /小于0,向前一位借1 currptr->data+=10000; s=-1; else if(m1<0&&m2>0) /符号不同,在此相当于实现负整数加上正整数 s=0; if(currptr->data>0
18、) /大于0, currptr->data=10000-currptr->data; s=1; else currptr->data=abs(currptr->data); currptr->next=result; /存入链表 currptr->pre=result->pre; result->pre->next=currptr; result->pre=currptr; result=currptr; p=p->pre; q=q->pre; /当head0节点数比head1长时,继续建链while(p!=head0-&
19、gt;pre) currptr=new LinkNode; currptr->data=p->data*m1+s; s=currptr->data/10000; if(m1*m2)>0) if(abs(currptr->data)-10000>=0) s=currptr->data/10000; currptr->data=abs(currptr->data)%10000; else s=0;currptr->data=abs(currptr->data); else if(m1>0&&m2<0) s
20、=0; if(currptr->data<0) currptr->data+=10000; s=-1; else if(m1<0&&m2>0) s=0; if(currptr->data>0) currptr->data=10000-currptr->data; s=1; else currptr->data=abs(currptr->data); currptr->data=abs(currptr->data)%10000; currptr->next=result; currptr->
21、pre=result->pre; result->pre->next=currptr; result->pre=currptr; result=currptr; p=p->pre;if(s!=0) /处理相加后,进位问题 currptr=new LinkNode; currptr->data=abs(s); currptr->next=result; currptr->pre=result->pre; result->pre->next=currptr; result->pre=currptr; result=currpt
22、r; result->pre->data=m1*(abs(result->pre->data)+1);void LinkList:Display() /显示结果LinkNode *p=result;int FuHao=result->pre->data/abs(result->pre->data);/结果的符号while(p->data=0&&p!=result->pre->pre) /当运算后前几个节点的数据为0时,不输出 p=p->next; result->pre->data=(abs(r
23、esult->pre->data)-1)*FuHao; /结果记录非0节点数cout<<FuHao*p->data; /首先显示符号和第一个节点中的数if(abs(result->pre->data)!=1) p=p->next; /判断非0节点数是否为1while(p!=result->pre->pre) /继续输出 cout<<"," /每4位一组,并用,隔开 cout.width(4); cout.fill('0'); cout<<p->data; p=p->
24、;next;if(p=result->pre->pre&&abs(result->pre->data)!=1) /显示最后一个节点数据 cout<<"," cout.width(4); cout.fill('0'); cout<<p->data;cout<<endl;int sum(int n) /计算10的乘方int i,s=1;for(i=1;i<=n;i+) s=s*10;return s;/主函数和其他函数的实现 void main() /主函数cout<<"*n"cout<<"*欢迎使用任意长整数加法系统*n"cout<<"*n""cout<<"n"cout<<"在此系统中,可以输入任意长的整数 。 |n"string ch;char Yes_No;docout<<"n" cout<<"|输入形式为:(-)*,*,*;(-)*,*,*,*|n&quo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化传媒行业美工工作总结
- 婚纱店前台接待员总结
- 网络营销实训心得体会和收获
- 2024年物流配送中心智能化升级合作协议3篇
- 班级竞技活动的组织与参与计划
- 幼儿园大班数学课教案《牙签摆图形》及教学反思
- 家具行业采购供应商管理
- 描写描写方法6篇
- 教育行业员工激励策略分享
- 媒体编辑前台接待总结
- 陕西省咸阳市2023-2024学年高一上学期期末考试 物理 含解析
- 程序员个人年终总结
- (正式版)HG∕T 21633-2024 玻璃钢管和管件选用规定
- 蔚来用户运营分析报告-数字化
- 南京市2023-2024高一上学期期末英语试卷及答案
- 《供应链管理》期末考试复习题库(含答案)
- 农村小学生上下学交通安全教育的研究
- 雍琦版法律逻辑学课后习题答案全
- 学校暑期维修方案
- 国家自然科学基金进展报告
- 小车多方式运行的PLC控制——PLC控制系统课程设计
评论
0/150
提交评论