




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名黄雅娇学号20145777专业信息安全班级四班 实验项目长整数四则运算计算器课程名称数据结构与算法课程代码0661013实验时间2016年03月15日实验地点主校区软件实验室 7-215批改意见成绩教师签字: 1、 实验目的:2、 本实验的目的是进一步理解双向循环表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。二、实验问题描述设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。在这里长整数没有范围限制,可任意长。运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。三、实验步骤1、数据结构利用双向循环链表来实现对长整数的存储。选择该数据结构来完成长整数的加减运算是因为a.要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。b.存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环链表。c.在运算过程中有进位和借位的操作。2、使用算法定义双向循环链表,存储数据,进行计算。(默认较长的数作为被加数、被减数)四、实验程序及分析#include using namespace std; #include #include #define Max 1024class CLongInt bool symbol; /数字符号 int digit; /数字位数 char numeralMax; /用来存放各位的数字public: CLongInt(char* str) symbol=true; digit=0; memset(numeral,0,Max); input(str); CLongInt() symbol=true; /默认为正数 digit=0; /默认为0 numeral0=0; friend ostream& operator (istream& is,CLongInt& d); friend CLongInt abs_add(CLongInt c1,CLongInt c2); /绝对值相加 friend CLongInt abs_minus(CLongInt c1,CLongInt c2); /绝对值相减 friend CLongInt abs_mul(CLongInt c1,CLongInt c2); /绝对值相乘 friend CLongInt abs_mul(CLongInt c1,int abs,int size); /friend CLongInt abs_div(CLongInt c1,CLongInt c2); /绝对值相除 int CompareLongInt(CLongInt c1,CLongInt c2); / 比较长整数大小 void input(char* str); void print(); CLongInt operator +(CLongInt d); CLongInt operator -(CLongInt d); CLongInt operator *(CLongInt d); ;void CLongInt:print() int i; if(symbol=false) cout=0;i-) coutc2.digit) return 0; else if(c1.digit=0;i-) if(c1.numeralic2.numerali) return 0; break; else if(c1.numeralic2.digit) return 2; else if(c1.digit=0;i-) if(c1.numeralic2.numerali) return 2; break; else if(c1.numeralidigit=0; int i=0,j=0; int len=strlen(str); char *s=(char*)str; if(*str=0) this-symbol=true; this-digit = len; else if(*str=-) i+; this-digit = len-1; this-symbol=false; else if(*str=+) i+; this-digit = len-1; this-symbol=true; else cout数据输入错误,请重新输入!; return; while(i9|si0) /coutliufenfensidigit=0; coutnumeralthis-digit-j-1=si; /除去正负号 this-numeralthis-digit = 0; i+; j+; CLongInt abs_add(CLongInt c1,CLongInt c2) /绝对值相加 CLongInt temp; int carry = 0; /标记进位 int i,number = 0; if(c1.digit=c2.digit) /前一个数比后一个数位数要大 for(i=0;ic2.digit;i+) /coutc1:c1.numeraliendl; /coutc2:c2.numeraliendl; /coutc1+c2:(c1.numerali-0)+(c2.numerali-0)endl; temp.numerali=(c1.numerali-0)+(c2.numerali-0)+carry)%10 + 48; /转化成数字运算然后转化成字符 /每次进位后将进位清零 if(c1.numerali-0)+(c2.numerali-0)+carry)/10=1) /有进位 carry = 1; else carry=0; for(i=c2.digit;ic1.digit;i+) /超越的位数 temp.numerali=(c1.numerali-0)+carry)%10+48; if(c1.numerali-0)+carry)/10=1) carry = 1; else carry=0; if(carry = 1) /最高位进位判断 temp.digit=c1.digit+1; temp.numeralc1.digit = 1; temp.numeralc1.digit+1 = 0; else temp.digit=c1.digit; temp.numeralc1.digit = 0; else /后一个位数要大 for(i=0;ic1.digit;i+) /coutc1:c1.numeraliendl; /coutc2:c2.numeraliendl; /=coutc1+c2:(c1.numerali-0)+(c2.numerali-0)endl; temp.numerali=(c1.numerali-0)+(c2.numerali-0)+carry)%10 + 48;/转化成数字运算然后转化成字符 if(c1.numerali-0)+(c2.numerali-0)+carry)/10=1) /有进位 carry = 1; else carry=0; /每次进位后将进位清零 for(i=c1.digit;ic2.digit) /前者位数大于后者 for(int k=0;kc2.digit;k+) if(c1.numeralk=0&carry=1) c1.numeralk = 9; carry = 1; else if(carry = 1) c1.numeralk=(c1.numeralk-0) - 1 + 48; carry = 0; if(c1.numeralkc2.numeralk) carry = 1; temp.numeralk = (c1.numeralk-0)+10-(c2.numeralk-0) + 48; else temp.numeralk = (c1.numeralk-0)-(c2.numeralk-0) + 48; for(int k=c2.digit;kc1.digit;k+) if(c1.numeralk=0&carry=1) temp.numeralk = 9; carry = 1; else if(carry = 1) temp.numeralk=(c1.numeralk-0) - 1 + 48; carry = 0; else temp.numeralk = c1.numeralk; temp.digit=c1.digit; temp.numeralc1.digit = 0; int k=c1.digit-1; while(temp.numeralk=0) temp.digit-; temp.numeralk = 0; k-; else if(c1.digit=c2.digit) /两者位数相等且前者大于后者 carry=0; for(int k=0;kc2.digit;k+) if(c1.numeralk=0&carry=1) c1.numeralk = 9; carry = 1; else if(carry = 1) c1.numeralk=(c1.numeralk-0) - 1 + 48; if(c1.numeralkc2.numeralk) carry = 1; temp.numeralk = (c1.numeralk-0)+10-(c2.numeralk-0) + 48; else carry = 0; temp.numeralk = (c1.numeralk-0)-(c2.numeralk-0) + 48; temp.digit=c1.digit; temp.numeralc1.digit = 0; int k=c1.digit-1; while(temp.numeralk=0) temp.digit-; temp.numeralk = 0; k-; return temp;CLongInt abs_mul(CLongInt c1,CLongInt c2) /绝对值相乘 CLongInt temp,mid; /中间值 int i; temp.numeral0=0; temp.digit=1; temp.numeral1=0; for(i=0;ic2.digit;i+) int cn=c2.numerali-0; mid=abs_mul(c1,cn,i); temp=abs_add(temp,mid); return temp;CLongInt abs_mul(CLongInt c1,int abs,int size) /单位数与长整数相乘 CLongInt temp; int i,carry=0; temp.digit=c1.digit; for(i=0;i0) temp.digit+; temp.numeralc1.digit = carry + 48; temp.numeraltemp.digit = 0; if(size!=0) for(i=temp.digit;i=0;i-) temp.numerali+size = temp.numerali; for(i=0;id.digit) /前者大于后者 temp=abs_minus(* this,d); /做减法 temp.symbol=symbol; else if(digit=d.digit) /两者长度相等 for(i=digit-1;i=0;i-) if(numeralid.numerali) /前者数值大于后者 temp.symbol=symbol; temp=abs_minus(*this, d); else if(numeralisymbol=d.symbol) /相减的两数符号相同 if(this-digitd.digit) /前者位数大于后者位数 temp=abs_minus(*this,d); temp.symbol=symbol; else if(this-digit=d.digit) /前者位数等于后者位数 for(i=digit-1;i=0;i-) if(this-numeralid.numerali) /前者大于后者 temp=abs_minus(*this, d); temp.symbol=symbol; break; else if(numeralisymbol=true & d.symbol=false) temp=abs_add(* this , d); temp.symbol=true; else if(this-symbol=false &d.symbol=true) temp=abs_add(* this , d); temp.symbol=false; return temp;CLongInt CLongInt:operator *(CLongInt d) / 重载乘法 int i=0; CLongInt temp; temp.symbol=symbold.symbol; temp=abs_mul(* this, d); return temp; int main(void) char test1128,test2128; int temp=1; char command; CLongInt t1,t2,t3; while(temp) cout-n; cout*n; cout* tt1 加法运算 tt*n; cout* tt2 减法运算 tt*n; cout* tt3 乘法运算 tt*n; cout* tt4 比较大小tt*n; cout* tt0 退出 tt t*n; cout-n; coutcommand; switch(command) case 0: temp=0; coutn-n; cout欢迎使用该系统!再见!=n; coutn-n; break; case 1: couttest1test2; t1.input(test1); t2.input(test2); coutn运算的结果为: ; t3=t1+t2; t3.print(); coutendl; break; case 2: couttest1; cintest2; t1.input(test1); t2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通信企业劳动合同与用户隐私保护合同
- 跨国公司商务英语合同翻译及法律风险评估合同
- 中药专业一试题及答案
- 孵化项目总结汇报
- 2025至2030中国土豆去皮切片机设备行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国板鞋行业产业运行态势及投资规划深度研究报告
- 2025至2030中国无内胎轮胎阀行业市场深度研究与战略咨询分析报告
- 2025至2030医用包封合机行业产业运行态势及投资规划深度研究报告
- 2025至2030中国镀锌弹簧钢丝行业项目调研及市场前景预测评估报告
- 公路质量管理工作汇报
- 高中语文-“病句辨析”模块“语序不当”知识点
- 粮食培训考试题及答案
- 工程整改方案及措施(3篇)
- 2025标准合同范本:餐饮业劳动合同书
- 政府法律顾问聘用合同
- 部编人教版六年级上册道德与法治全册教案
- 2024中国华电集团有限公司湖南分公司本部面向系统内公开招聘5人笔试参考题库附带答案详解
- Minitab(高级)
- 工学结合的课程开发与教学设计
- 体育科学体系与体育原理优秀课件
- 现代控制理论教案Word版
评论
0/150
提交评论