c++实现任意长整数的四则运算_第1页
c++实现任意长整数的四则运算_第2页
c++实现任意长整数的四则运算_第3页
c++实现任意长整数的四则运算_第4页
c++实现任意长整数的四则运算_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 主要功能模块的功能u 任意长整数的输入u 任意长整数的标准化输出u 两个整数的加法u 两个整数的乘法三详细设计(主模块流程图)5、 使用说明及测试结果1.使用说明:点击打开应用程序pro1.exe。依次输入任意两个整数(例如123456,+1234567),按回车,会出现菜单,如下图:按1则实现两整数的加法按2则实现两整数的乘法按#结束注:菜单可重复出现直至#退出。实现加法,乘法如下图:2.测试结果:(1) 123456 (2) +1234567 (3) -987654321 (4) 12a3 (5) +

4、注:当输入错误时,允许重新输入。6、 源程序/* 主函数 */*/#include "cal.h"void main()string s; string p; DblList list1;while(1) /输入错误时,允许重新输入 cout<<"Input num1"<<endl; cin>>s; bool ok1=list1.CreatList(s);if (!ok1) cout<<"error!"<<endl;elsecout<<"num1:&qu

5、ot;list1.Display();break;DblList list2;while(1)cout<<"Input num2:"<<endl;cin>>p; bool ok2=list2.CreatList(p);if (!ok2)cout<<"error!"<<endl;elsecout<<"num2:"list2.Display();break;string choose;while (1) cout<<"请选择运算法:"&

6、lt;<endl;cout<<"-"<<endl; /*菜单*/cout<<"|1.num1+num2 |"<<endl; /*可以重复输入运算符,按'#'退出*/cout<<"|2.num1*num2 |"<<endl;cout<<"|#.exit |"<<endl;cout<<"-"<<endl;while (1) cin>>choose;

7、 if (choose="1") list1+list2;break; else if (choose="2") list1*list2;break; else if (choose="#") return; else cout<<"输入有误,请重新输入!"<<endl;continue;/*头文件,包括长整数数据结构的定义,成员函数的定义*/*/#include <iostream>#include <string>#include <cmath>usi

8、ng namespace std;struct DblNodeint data; DblNode * prior;DblNode * next;bool IsNum(char a) /判断字符a是否是便是数字 int s=a-'0'if(s>=0&&s<10)return true;else return false;bool IsInt(string a) /判断字符串a是否表达一串数字bool Jud=1;int i=1;char s=a0;if (a="+"|a="-") return false;if

9、(s='+'|s='-')else if (s>='1'&&s<='9')else if(a0='0'&&a1='0') return true;else return false;while (ai!='0')Jud=IsNum(ai);if (Jud=0) return false;i+;return true;int JudSign(string s) /返回数字的符号if (s0='-') return -1;els

10、e if(s0='0'&&s1='0') return 0;else return 1;int CtoI(char a)int i=a-'0'return i;class DblList /定义一个双向链表类,存储任意长度的数字private: /并可以进行标准化输出和加法,乘法。DblNode *head, *tail; DblNode *current;int sign;public:DblList(); /构造函数 DblList(); /析构函数bool CreatList(string); /生成一个双向链表int Ge

11、tCount(); /获取整数的长度void Insert(DblNode *); /从表尾插入一个结点 void InsertFront(DblNode *); /从表头插入一个结点void Clear(); /清除该链表void operator+(DblList &); /实现两个任意整数的加法void operator*(DblList &); /实现两个任意整数的乘法DblList & operator=(DblList &); /重载赋值运算符 int Compare(DblList &); /两个整数的绝对值比较void Display()

12、; /任意长度整数的标准化输出;DblList:DblList() head=new DblNode(); /构造函数head->next=NULL;head->prior=NULL; tail=head;current=NULL;sign=0;DblList:DblList() /析构函数while (head->next!=NULL) current=head->next;head->next=current->next;delete current;current=NULL;sign=0;delete head;head=NULL;tail=NULL;

13、int DblList:GetCount() /返回该数字的长度(不包括符号位) current=head->next;int count=0;while (current)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->nex

14、t=NULL)head->next=q;q->prior=head;tail=q;elseq->next=head->next;head->next->prior=q;head->next=q;q->prior=head;bool DblList:CreatList(string s) /输入的任意长度的表示数字的字符串 bool j=IsInt(s); /以此生成双向链表if (!j) return j;elseint i=0;sign=JudSign(s);if (s0='+'|s0='-')i+;while

15、(si!='0')int ia=CtoI(si);current=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=

16、NULL;int DblList:Compare(DblList & s) /任意两个长度数字绝对值比较int a=GetCount();int b=s.GetCount();if (a>b) return 1;else if (a<b) return -1;else current=head->next;s.current=s.head->next;while (current!=NULL)int re=current->data-s.current->data;if (re>0)return 1;else if (re<0) retu

17、rn -1;elsecurrent=current->next; s.current=s.current->next;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.cur

18、rent=s.current->next;s.current=NULL;current=NULL;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(si>0) temp.sign=sign; else temp.sign=s.sign; curre

19、nt=tail; s.current=s.tail; while (1)if (current=head&&s.current=s.head) if (f) da=f; 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 DblNode(); temp.current->data=curren

20、t->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; elseda=current->data*sign+s.current-&g

21、t;data*s.sign+f;if (da*temp.sign>=10)da=da-10*temp.sign;f=temp.sign;else if (da*temp.sign<0)da=da+10*temp.sign;f=-temp.sign;else f=0; temp.current=new DblNode();temp.current->next=NULL;temp.current->data=abs(da);temp.InsertFront(temp.current);current=current->prior;s.current=s.current

22、->prior;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;cout<<"num1+num2="temp.Display(); void DblList:

23、operator*(DblList & 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;i<a;i+) temp.current=new DblNode();temp.current->data=0;temp.current->next=NULL;temp.current->prior=NULL;temp.InsertFront(temp.current); s.current=s.tail;while (s.current!=s.head)current=tail;temp.current=temp.tail;for (i=0;i<count;i+) temp.current=temp.current->prior;for(j=0;j<a1;j+) ans=s.current->data*current->data+temp.current->data+cf; temp.current->data=ans%

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论