版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名黄雅娇学号20145777专业信息安全班级四班 实验项目长整数四则运算计算器课程名称数据结构与算法课程代码0661013实验时间2016年03月15日实验地点主校区软件实验室 7-215批改意见成绩教师签字: 1、 实验目的:2、 本实验的目的是进一步理解双向循环表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 二、实验问题描述 设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。在这里长整数没有范围限制,可任意长。运算后的进位、借位等都要进行正确处理,可
2、实现动态的输入,实时的输出。 三、实验步骤1、 数据结构 利用双向循环链表来实现对长整数的存储。 选择该数据结构来完成长整数的加减运算是因为 a. 要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。 b. 存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环链表。 c. 在运算过程中有进位和借位的操作。 2、 使用算法 定义双向循环链表,存储数据,进行计算。(默认较长的数作为被加数、被减数)
3、四、实验程序及分析#include <iostream>using namespace std; #include <math.h>#include <string.h>#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=
4、true; /默认为正数 digit=0; /默认为0 numeral0='0' friend ostream& operator <<(ostream& os,CLongInt& d); friend istream& operator >>(istream& is,CLongInt& d); friend CLongInt abs_add(CLongInt c1,CLongInt c2); /绝对值相加 friend CLongInt abs_minus(CLongInt c1,CLongInt c2)
5、; /绝对值相减 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
6、d); CLongInt operator -(CLongInt d); CLongInt operator *(CLongInt d); ;void CLongInt:print() int i; if(symbol=false) cout<<"-" for(i=digit-1;i>=0;i-) cout<<numerali; /puts(numeral); int CLongInt:CompareLongInt(CLongInt c1,CLongInt c2) /0大于,1等于,2小于 int i; if(c1.symbol=c2.symb
7、ol) /比较的两者符号相同 if(c1.symbol=true) if(c1.digit>c2.digit) return 0; else if(c1.digit<c2.digit) return 2; else /两者长度相等 for(i=c1.digit-1;i>=0;i-) if(c1.numerali>c2.numerali) return 0; break; else if(c1.numerali<c2.numerali) return 2; break; if(i=-1) return 1; if(c1.symbol=false) if(c1.dig
8、it>c2.digit) return 2; else if(c1.digit<c2.digit) return 0; else /两者长度相等 for(i=c1.digit-1;i>=0;i-) if(c1.numerali>c2.numerali) return 2; break; else if(c1.numerali<c2.numerali) return 0; break; if(i=-1) return 1; else /比较的两者符号不同 if(c1.symbol=true) /前正后负 return 0; else if(c1.symbol!=tr
9、ue) return 2; void CLongInt:input(char *str) this->digit=0; int i=0,j=0; int len=strlen(str); char *s=(char*)str; if(*str<='9'&&*str>='0') this->symbol=true; this->digit = len; else if(*str='-') i+; this->digit = len-1; this->symbol=false; else if
10、(*str='+') i+; this->digit = len-1; this->symbol=true; else cout<<"数据输入错误,请重新输入!" return; while(i<len) /除了第一位其他位都应该是数字 if(si>'9'|si<'0') /cout<<"liufenfen"<<si<<endl; this->digit=0; cout<<"数据输入错误,请重新输入!&
11、quot; return; else this->numeralthis->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;i<c2.digit;i+) /cout<<
12、;"c1:"<<c1.numerali<<endl; /cout<<"c2:"<<c2.numerali<<endl; /cout<<"c1+c2:"<<(c1.numerali-'0')+(c2.numerali-'0')<<endl; temp.numerali=(c1.numerali-'0')+(c2.numerali-'0')+carry)%10 + 48; /转化成
13、数字运算然后转化成字符 /每次进位后将进位清零 if(c1.numerali-'0')+(c2.numerali-'0')+carry)/10=1) /有进位 carry = 1; else carry=0; for(i=c2.digit;i<c1.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) /最高位进
14、位判断 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;i<c1.digit;i+) /cout<<"c1:"<<c1.numerali<<endl; /cout<<"c2:"<<c2.
15、numerali<<endl; /=cout<<"c1+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) /有进位 carr
16、y = 1; else carry=0; /每次进位后将进位清零 for(i=c1.digit;i<c2.digit;i+) /超越的位数 temp.numerali=(c2.numerali-'0')+carry)%10+48; if(c2.numerali-'0')+carry)/10=1) carry = 1; else carry=0; if(carry = 1) /最高位进位判断 temp.digit=c2.digit+1; temp.numeralc2.digit = '1' temp.numeralc2.digit+1 = &
17、#39;0' else temp.digit=c2.digit; temp.numeraltemp.digit = '0' return temp;CLongInt abs_minus(CLongInt c1,CLongInt c2) /绝对值相减 CLongInt temp; int carry=0; /carry表示借位 if(c1.digit>c2.digit) /前者位数大于后者 for(int k=0;k<c2.digit;k+) if(c1.numeralk='0'&&carry=1) c1.numeralk =
18、'9' carry = 1; else if(carry = 1) c1.numeralk=(c1.numeralk-'0') - 1 + 48; carry = 0; if(c1.numeralk<c2.numeralk) carry = 1; temp.numeralk = (c1.numeralk-'0')+10-(c2.numeralk-'0') + 48; else temp.numeralk = (c1.numeralk-'0')-(c2.numeralk-'0') + 48; f
19、or(int k=c2.digit;k<c1.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.d
20、igit-1; while(temp.numeralk='0') temp.digit-; temp.numeralk = '0' k-; else if(c1.digit=c2.digit) /两者位数相等且前者大于后者 carry=0; for(int k=0;k<c2.digit;k+) if(c1.numeralk='0'&&carry=1) c1.numeralk = '9' carry = 1; else if(carry = 1) c1.numeralk=(c1.numeralk-'0&
21、#39;) - 1 + 48; if(c1.numeralk<c2.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; w
22、hile(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;i<c2.digit;i+) int cn=c2.numerali-'0' mid=abs_
23、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;i<c1.digit;i+) int mid=(c1.numerali-'0')*abs+carry; temp.numerali=mid%10 + 48; carry=mid/10; temp.numeralc1.digit = '0
24、' if(carry>0) 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;i<size;i+)/在移位后的数据后面添加size个0 temp.numerali = '0' temp.digit+=size; return temp;CLongInt CLongInt:o
25、perator +(CLongInt d) int i=0; CLongInt temp; if(symbol=d.symbol) /相加的两个数符号相同 temp=abs_add(* this,d); temp.symbol=symbol; else /如果两者符号不同 if(digit>d.digit) /前者大于后者 temp=abs_minus(* this,d); /做减法 temp.symbol=symbol; else if(digit=d.digit) /两者长度相等 for(i=digit-1;i>=0;i-) if(numerali>d.numerali)
26、 /前者数值大于后者 temp.symbol=symbol; temp=abs_minus(*this, d); else if(numerali<d.numerali) /后者数值大于前者 temp.symbol=d.symbol; temp=abs_minus(d,*this); else temp.numeral0='0' /两者相等 temp.symbol=true; else /前者长度小于后者长度 temp=abs_minus(d ,*this); temp.symbol=d.symbol; return temp; CLongInt CLongInt:ope
27、rator -(CLongInt d) int i=0; CLongInt temp; if(this->symbol=d.symbol) /相减的两数符号相同 if(this->digit>d.digit) /前者位数大于后者位数 temp=abs_minus(*this,d); temp.symbol=symbol; else if(this->digit=d.digit) /前者位数等于后者位数 for(i=digit-1;i>=0;i-) if(this->numerali>d.numerali) /前者大于后者 temp=abs_minus(
28、*this, d); temp.symbol=symbol; break; else if(numerali<d.numerali) /后者大于前者 temp=abs_minus( d, * this); temp.symbol=(!d.symbol); break; if(i = -1) temp.numeral0='0' temp.digit=1; temp.numeral1='0' temp.symbol=true; else /前者位数小于后者 temp=abs_minus( d, * this); temp.symbol=(!d.symbol);
29、 else /相减两数符号相异 if(this->symbol=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.
30、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<&
31、lt;"* tt3 乘法运算 tt*n" cout<<"* tt4 比较大小tt*n" cout<<"* tt0 退出 tt t*n" cout<<"-n" cout<<"请输入指令:" cin>>command; switch(command) case '0': temp=0; cout<<"n-n" cout<<"n=>欢迎使用该系统!再见!<=n" cout<<"n-n" break; case '1': cout<<"请输入数据:" cin>>test1>>test2; t1.input(test1); t2.input(test2); cout<<"n运算的结果为: " t3=t1+t2; t3.print(); cout<<endl; break; case '2': cou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理职业生涯规划
- 2025年家庭影院播放器评测
- 6.2细胞的分化 课件共44张 2024-2025学年人教版(2019)高中生物学必修1
- 矿石破碎筛分工岗前实操综合知识考核试卷含答案
- 橡胶割胶工安全技能评优考核试卷含答案
- 2026年新科教版高中高一生物上册第三单元物质跨膜运输方式卷含答案
- 电炉炼钢工岗前QC管理考核试卷含答案
- 电子电气产品能效检验员成果模拟考核试卷含答案
- 信用管理师安全理论考核试卷含答案
- 办公设备维修工岗前安全实操考核试卷含答案
- 国际贸易咨询服务方案
- (正式版)DB32∕T 5184-2025 《海域使用权立体分层设权技术规范》
- 七下语文课内文言文阅读夯实基础训练(含答案)
- 韩非子导读课件
- 二年级上册两位数加减法竖式计算300道(进退位)及答案
- VCSEL及光通信激光芯片产业化项目可行性研究报告
- 污水站安全操作应急处置培训考试题及答案
- 2024年下半年成都铁路文化传媒有限责任公司校招笔试题带答案
- 2025年重庆红色旅游市场调研报告
- 东航总部劳务派遣合同6篇
- 外厂人员驻厂安全协议书
评论
0/150
提交评论