《2022年c++实现任意长整数的四则运算 .pdf》由会员分享,可在线阅读,更多相关《2022年c++实现任意长整数的四则运算 .pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验题目:设计一数据结构可处理任意长度的整数概要设计1.数据结构的定义采用双向链表存储任意长整数。双向链表的定义如下:class DblList private: DblNode *head, *tail; DblNode *current; int sign; public: DblList(); /构造函数DblList(); /析构函数bool CreatList(string); /生成一个双向链表,存储整数int GetCount(); /获取整数的长度void Insert(DblNode *); /从表尾插入一个结点void InsertFront(DblNode *); /从表
2、头插入void Clear(); /清除该链表void operator+(DblList &); /实现两个任意整数的加法void operator*(DblList &); /实现两个任意整数的乘法DblList & operator=(DblList &); /重载赋值运算符int Compare(DblList &); /两个整数的绝对值比较void Display(); /任意长度整数的标准化输出;说明: 数据的存储,无外乎顺序或者链表。顺序存储时,定义数组无法实现任意长度,而且需要预设一个maxsize,不是特别的方便。所以采用链式存储方式。而且任意长数据通过字符串输入。在链表的每
3、一个结点中, 数据域是在该数位上的数字大小。2主要功能模块的功能任意长整数的输入任意长整数的标准化输出两个整数的加法两个整数的乘法三详细设计(主模块流程图)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 13 页 - - - - - - - - - 五、 使用说明及测试结果1. 使用说明:点击打开应用程序pro1.exe 。依次输入任意两个整数 (例如 123456,+1234567) ,按回车,会出现菜单,如下图:名师资料总结 - - -精品资料欢迎下载 - - - -
4、 - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - 按1则实现两整数的加法按2则实现两整数的乘法按#结束注:菜单可重复出现直至#退出。实现加法,乘法如下图:2.测试结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - (1) 123456 (2) +1234567 (3) -987654321 (4) 12a3 (5)
5、 + 注:当输入错误时,允许重新输入。六、 源程序/* 主函数*/ /*/ #include cal.h void main() string s; string p; DblList list1; while(1) /输入错误时,允许重新输入coutInput num1s; bool ok1=list1.CreatList(s); if (!ok1) couterror!endl; else coutnum1:; list1.Display(); break; DblList list2; while(1) coutInput num2:p; bool ok2=list2.CreatList
6、(p); if (!ok2) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - couterror!endl; else coutnum2:; list2.Display(); break; string choose; while (1) cout 请选择运算法:endl; cout-endl; /*菜单 */ cout|1.num1+num2 |endl; /*可以重复输入运算符,按#退出 */ cout|2.num1*nu
7、m2 |endl; cout|#.exit |endl; cout-choose; if (choose=1) list1+list2; break; else if (choose=2) list1*list2; break; else if (choose=#) return; else cout输入有误,请重新输入!endl; continue; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - /*头文件,包括长整数数据
8、结构的定义,成员函数的定义*/ /*/ #include #include #include using namespace std; struct DblNode int data; DblNode * prior; DblNode * next; ; bool IsNum(char a) /判断字符a 是否是便是数字int s=a-0; if(s=0&s=1&snext=NULL; head-prior=NULL; tail=head; current=NULL; sign=0; DblList:DblList() /析构函数while (head-next!=NULL) current=
9、head-next; head-next=current-next; delete current; current=NULL; sign=0; delete head; head=NULL; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 13 页 - - - - - - - - - tail=NULL; int DblList:GetCount() /返回该数字的长度(不包括符号位)current=head-next; int count=0; while (curr
10、ent) count+; current=current-next; current=NULL; return count; void DblList:Insert(DblNode *p) /从链表尾部插入一个结点tail-next=p; p-prior=tail; tail=p; void DblList:InsertFront(DblNode *q) /从链表头部插入一个结点if (head-next=NULL) head-next=q; q-prior=head; tail=q; else q-next=head-next; head-next-prior=q; head-next=q;
11、 q-prior=head; bool DblList:CreatList(string s) /输入的任意长度的表示数字的字符串bool j=IsInt(s); /以此生成双向链表if (!j) return j; else int i=0; sign=JudSign(s); if (s0=+|s0=-) i+; while (si!=0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 13 页 - - - - - - - - - int ia=CtoI(si); c
12、urrent=new DblNode(); current-data=ia; current-next=NULL; current-prior=NULL; Insert(current); i+; current=NULL; return true; void DblList:Clear() while (head-next) current=head-next; head-next=current-next; delete current; tail=head; sign=0; current=NULL; int DblList:Compare(DblList & s) /任意两个长度数字绝
13、对值比较int a=GetCount(); int b=s.GetCount(); if (ab) return 1; else if (anext; s.current=s.head-next; while (current!=NULL) int re=current-data-s.current-data; if (re0) return 1; else if (renext; s.current=s.current-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9
14、 页,共 13 页 - - - - - - - - - current=NULL; s.current=NULL; return 0; DblList & DblList:operator =(DblList &s) Clear(); sign=s.sign; s.current=s.head-next; while (s.current!=NULL) current=new DblNode(); current-data=s.current-data; Insert(current); s.current=s.current-next; s.current=NULL; current=NUL
15、L; return *this; void DblList:operator +(DblList & s) /实现加法(包括减法)DblList temp; int da; int f=0; int si=Compare(s); if (si=0&(sign+s.sign=0) temp.sign=0; else if (si=0) temp.sign=sign; else if(si0) temp.sign=sign; else temp.sign=s.sign; current=tail; s.current=s.tail; while (1) if (current=head&s.cur
16、rent=s.head) if (f) da=f; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 13 页 - - - - - - - - - temp.current=new DblNode(); temp.current-data=f; temp.InsertFront(temp.current); if (!f) break; f=0; else if (current!=head&s.current=s.head) temp.current=new DblNo
17、de(); temp.current-data=current-data+f; temp.InsertFront(temp.current); current=current-prior; f=0; else if (current=head&s.current!=s.head) temp.current=new DblNode(); temp.current-data=s.current-data+f; temp.InsertFront(temp.current); s.current=s.current-prior; f=0; else da=current-data*sign+s.cur
18、rent-data*s.sign+f; if (da*temp.sign=10) da=da-10*temp.sign; f=temp.sign; else if (da*temp.signnext=NULL; temp.current-data=abs(da); temp.InsertFront(temp.current); current=current-prior; s.current=s.current-prior; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,
19、共 13 页 - - - - - - - - - current=NULL; s.current=NULL; temp.current=temp.head-next; if (temp.current!=NULL) while (temp.current-data=0) temp.head-next=temp.current-next; delete temp.current; temp.current=temp.head-next; temp.current=NULL; coutnum1+num2=; temp.Display(); void DblList:operator*(DblLis
20、t & s) /实现乘法int cf=0; int ans; int i,j; int count=0; DblList temp; temp.sign=sign*s.sign; int a1=GetCount(); int a2=s.GetCount(); int a=a1+a2; for (i=0;idata=0; temp.current-next=NULL; temp.current-prior=NULL; temp.InsertFront(temp.current); s.current=s.tail; while (s.current!=s.head) current=tail;
21、temp.current=temp.tail; for (i=0;iprior; for(j=0;jdata*current-data+temp.current-data+cf; temp.current-data=ans%10; cf=ans/10; current=current-prior; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 13 页 - - - - - - - - - temp.current=temp.current-prior; if (cf!
22、=0) temp.current-data=temp.current-data+cf; cf=0; s.current=s.current-prior; temp.current=temp.tail; count+; if(temp.head-next-data=0) temp.current=temp.head-next; temp.head-next=temp.current-next; delete temp.current; temp.current=NULL; coutnum1*num2=; temp.Display(); void DblList:Display() /任意长数字的
23、标准化输出int count=GetCount(); if (sign=0) cout0endl; return ; else if (sign=-1) coutnext; while (current!=NULL) if(count0) coutdata; count-; if (count%3=0&count!=0) coutnext; current=NULL; coutendl; cout-endl; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 13 页 - - - - - - - - -