任意两个整数之间的四则运算课程设计.docx
- 文档编号:7369109
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:22
- 大小:527.71KB
任意两个整数之间的四则运算课程设计.docx
《任意两个整数之间的四则运算课程设计.docx》由会员分享,可在线阅读,更多相关《任意两个整数之间的四则运算课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
任意两个整数之间的四则运算课程设计
课程设计报告
课程名称:
信息系统开发语言
(二)
学期:
2013-2014学年第2学期
学时学分:
64学时4学分
专业班级:
信管1
学号:
姓名:
指导老师:
提交日期:
2014年6月10日
一、课程设计目的
通过课程设计需要达到三个目的:
第一是检验和巩固专业知识。
通过课程设计,有助于加深我们对C++这门课程的理解,我们在课堂上学的都是基础理论知识,对于如何用程序语言来描述所学知识还是有一定难度。
通过课程设计,我们可以真正理解其内涵。
第二是提高综合素质和能力。
通过课程设计,逐渐培养学生的编程能力、用计算机解决实际问题的能力。
程序设计能直接有效地训练我们分析问题、解决问题的能力。
第三是有利于培养认真严谨的学习态度。
在程序设计过程里,当我们入程序代码的时候,如果不够认真或细心,就可能导致语法错误,从而无法得出运行结果。
我们反复调试,反复修改的过程,可以培养我们认真严谨的作风。
二、问题描述与分析
1、问题描述:
题号1:
两个任意长度整数之间的四则运算
总体需求:
任意给定两个数字,计算它们之间的加减乘除结果。
功能需求:
(1)输入并保存两个整数,长度不限。
(2)通过菜单选择运算类型并输出结果。
用户界面:
输入:
输入两个整数,长度不限
输出:
(1)应用程序正常运行后,要在屏幕上显示一个文字菜单。
(2)要求用户输入数据时,要给出清晰明确的提示信息,包括输入的数据内容、格式及结束方式等。
2、问题分析:
本程序要求实现任意长度的两个整数的加减乘除的运算。
由题意得,题目的难点在于任意长度,计算的数值和结果精度是任意的。
但是在C++语言中定义的类型中精度最多只有二十多位,因而采用数组存储的方式来存放数字。
运用do...While和switch语句进行选择判断。
假设字符串为sa,sb。
定义大数为a,b,c。
并分别把sa和sb赋值给a和b。
定义一个int型变量flag,并且给flag赋初始值为0。
(1)当输入值为1时,case1:
c=a+b,调用函数重载,进行加法的运算。
因为flag=1不等于0,所以输出c的结果。
(2)当输入值为2时,case2:
c=a+b,调用函数重载,进行减法的运算。
因为flag=2不等于0,所以输出c的结果。
(3)当输入值为3时,case3:
c=a+b,调用函数重载,进行乘法的运算。
因为flag=3不等于0,所以输出c的结果。
(4)当输入值为4时,case4:
c=a+b,调用函数重载,进行除法的运算。
因为flag=4不等于0,所以输出c的结果。
(5)当输入值为0时,跳出switch这个选择语句,因为flag=0等于0,所以又进入do...while循环语句。
(6)当输入值为其他时,执行default语句。
四、算法分析、设计与描述
本题要求任意长度的整数,所以采用数组存储的方式来存放和表示大整数。
一个数组元素,存放大整数中的一位。
用字符串作为文本的数据类型。
定义一个类为大数,如classBigNum。
定义一个比较大的整型数组,控制位数为500,如inta[500];构造一个BigNum的函数,如BigNum(){len=1;memset(a,0,sizeof(a));将一个int类型的变量转化为大数,如BigNum(constint);将一个字符串类型的变量转化为大数,如BigNum(constchar*);重载赋值、输入输出、加减乘除等运算符。
通过对+,-,*,/运算符的重新定义,使它们可以完成对对象加减乘除的运算。
重载赋值运算符,大数之间就行赋值运算,如BigNum&BigNum:
:
operator=(constBigNum&n)。
程序开始,运行主函数,虽然需要进行多次判断选择,但是每一次都是判断同一表达式的值,就没必要在每一个嵌套的if语句中都计算一遍表达式的值,为此用switch语句来解决这问题。
所以运用do...While和switch语句进行选择判断。
假设字符串为sa,sb。
定义大数为a,b,c。
并分别把sa和sb赋值给a和b。
定义一个int型变量flag,并且给flag赋初始值为0。
(1)当输入值为1时,case1:
c=a+b,调用函数重载,进行加法的运算。
因为flag=1不等于0,所以输出c的结果。
(2)当输入值为2时,case2:
c=a+b,调用函数重载,进行减法的运算。
因为flag=2不等于0,所以输出c的结果。
3)当输入值为3时,case3:
c=a+b,调用函数重载,进行乘法的运算。
因为flag=3不等于0,所以输出c的结果。
(4)当输入值为4时,case4:
c=a+b,调用函数重载,进行除法的运算。
因为flag=4不等于0,所以输出c的结果。
(5)当输入值为0时,跳出switch这个选择语句,因为flag=0等于0,所以又进入do...while循环语句。
(6)当输入值为其它数时,则是default语句。
五、程序设计
1、程序设计的基本思路:
ClassBigNum//大数运算类的定义
{
private:
inta[500];//可以控制大数的位数
intlen;//大数长度
public:
BigNum(){len=1;memset(a,0,sizeof(a));}//构造函数
BigNum(constint);//将一个int类型的变量转化为大数
BigNum(constchar*);//将一个字符串类型的变量转化为大数
BigNum(constBigNum&);//复制构造函数
BigNum&operator=(constBigNum&);//重载赋值运算符,大数之间进行赋值运算
friendistream&operator>>(istream&,BigNum&);//重载输入运算符
friendostream&operator<<(ostream&,BigNum&);//重载输出运算符
BigNumoperator+(constBigNum&)const;//重载加法运算符,两个大数之间的相加运算
BigNumoperator-(constBigNum&)const;//重载减法运算符,两个大数之间的相减运算
BigNumoperator*(constBigNum&)const;//重载乘法运算符,两个大数之间的相乘运算
BigNumoperator/(constint&)const;//重载除法运算符,大数对一个整数进行相除运算
intoperator%(constint&)const;//大数对一个int类型的变量进行取模运算
booloperator>(constBigNum&T)const;//大数和另一个大数的大小比较
booloperator>(constint&t)const;//大数和一个int类型的变量的大小比较
voidprint();//输出大数
2、类BigNum的UML图如下:
BigNum
-a[500]:
int
-len:
int
+BigNum(constint)
+BigNum(constchar*)
+BigNum(constBigNum&)
+operator=(constBigNum&):
BigNum
+operator>>(istream&,BigNum&):
friendistream
+operator<<(ostream&,BigNum&):
friendostream
+operator+(constBigNum&)const:
BigNum
+operator-(constBigNum&)const:
BigNum
+operator*(constBigNum&)const:
BigNum
+operator/(constint&)const:
BigNum
+operator%(constint&)const:
int
+operator>(constBigNum&T)const:
bool
+operator>(constint&t)const:
bool
+print():
void
2.程序代码及说明
#include
#include
#include
#include
#include
usingnamespacestd;//使用名称空间std
#defineMAXN9999//宏定义,用MAXN代替9999
#defineMAXSIZE10//宏定义,用MAXSIZE代替10
#defineDLEN4//宏定义,用DLEN代替4
classBigNum//大数运算类的定义
{
private:
inta[500];//可以控制大数的位数
intlen;//大数长度
public:
BigNum(){len=1;memset(a,0,sizeof(a));}//构造函数
BigNum(constint);//将一个int类型的变量转化为大数
BigNum(constchar*);//将一个字符串类型的变量转化为大数
BigNum(conststring&src);
BigNum(constBigNum&);//复制构造函数
BigNum&operator=(constBigNum&);//重载赋值运算符,大数之间进行赋值运算
friendistream&operator>>(istream&,BigNum&);//重载输入运算符
friendostream&operator<<(ostream&,BigNum&);//重载输出运算符
BigNumoperator+(constBigNum&)const;//重载加法运算符,两个大数之间的相加运算
BigNumoperator-(constBigNum&)const;//重载减法运算符,两个大数之间的相减运算
BigNumoperator*(constBigNum&)const;//重载乘法运算符,两个大数之间的相乘运算
BigNumoperator/(constint&)const;//重载除法运算符,大数对一个整数进行相除运算
intoperator%(constint&)const;//大数对一个int类型的变量进行取模运算
booloperator>(constBigNum&T)const;//大数和另一个大数的大小比较
booloperator>(constint&t)const;//大数和一个int类型的变量的大小比较
voidprint();//输出大数
};
BigNum:
:
BigNum(constintb)//将一个int类型的变量转化为大数
{
intc,d=b;
len=0;
memset(a,0,sizeof(a));//把从a开始的20个值设置为0
while(d>MAXN)
{
c=d-(d/(MAXN+1))*(MAXN+1);
d=d/(MAXN+1);
a[len++]=c;
}
a[len++]=d;
}
BigNum:
:
BigNum(constchar*s)//将一个字符串类型的变量转化为大数
{
intt,k,index,l,i;
memset(a,0,sizeof(a));
l=strlen(s);
len=l/DLEN;
if(l%DLEN)
len++;
index=0;
for(i=l-1;i>=0;i-=DLEN)
{
t=0;
k=i-DLEN+1;
if(k<0)
k=0;
for(intj=k;j<=i;j++)
t=t*10+s[j]-'0';
a[index++]=t;
}
}
BigNum:
:
BigNum(conststring&src)
{
constchar*s=src.c_str();
intt,k,index,l,i;
memset(a,0,sizeof(a));
l=strlen(s);
len=l/DLEN;
if(l%DLEN)
len++;
index=0;
for(i=l-1;i>=0;i-=DLEN)
{
t=0;
k=i-DLEN+1;
if(k<0)
k=0;
for(intj=k;j<=i;j++)
t=t*10+s[j]-'0';
a[index++]=t;
}
}
BigNum:
:
BigNum(constBigNum&T):
len(T.len)//复制构造函数的实现
{
inti;
memset(a,0,sizeof(a));
for(i=0;i a[i]=T.a[i]; } BigNum&BigNum: : operator=(constBigNum&n)//重载赋值运算符,大数之间进行赋值运算 { inti; len=n.len; memset(a,0,sizeof(a)); for(i=0;i a[i]=n.a[i]; return*this; } istream&operator>>(istream&in,BigNum&b)//重载输入运算符 { charch[MAXSIZE*4]; inti=-1; in>>ch; intl=strlen(ch); intcount=0,sum=0; for(i=l-1;i>=0;) { sum=0; intt=1; for(intj=0;j<4&&i>=0;j++,i--,t*=10) { sum+=(ch[i]-'0')*t; } b.a[count]=sum; count++; } b.len=count++; returnin; } ostream&operator<<(ostream&out,BigNum&b)//重载输出运算符 { inti; out< for(i=b.len-2;i>=0;i--) { out.width(DLEN); out.fill('0'); out< } returnout; } BigNumBigNum: : operator+(constBigNum&T)const//两个大数之间的相加运算 { BigNumt(*this); inti,big;//位数 big=T.len>len? T.len: len; for(i=0;i { t.a[i]+=T.a[i]; if(t.a[i]>MAXN) { t.a[i+1]++; t.a[i]-=MAXN+1; } } if(t.a[big]! =0) t.len=big+1; else t.len=big; returnt; } BigNumBigNum: : operator-(constBigNum&T)const//两个大数之间的相减运算 { inti,j,big; boolflag; BigNumt1,t2; if(*this>T) { t1=*this; t2=T; flag=0; } else { t1=T; t2=*this; flag=1; } big=t1.len; for(i=0;i { if(t1.a[i] { j=i+1; while(t1.a[j]==0) j++; t1.a[j--]--; while(j>i) t1.a[j--]+=MAXN; t1.a[i]+=MAXN+1-t2.a[i]; } else t1.a[i]-=t2.a[i]; } t1.len=big; while(t1.a[len-1]==0&&t1.len>1) { t1.len--; big--; } if(flag) t1.a[big-1]=0-t1.a[big-1]; returnt1; } BigNumBigNum: : operator*(constBigNum&T)const//两个大数之间的相乘运算 { BigNumret; inti,j,up; inttemp,temp1; for(i=0;i { up=0; for(j=0;j { temp=a[i]*T.a[j]+ret.a[i+j]+up; if(temp>MAXN) { temp1=temp-temp/(MAXN+1)*(MAXN+1); up=temp/(MAXN+1); ret.a[i+j]=temp1; } else { up=0; ret.a[i+j]=temp; } } if(up! =0) ret.a[i+j]=up; } ret.len=i+j; while(ret.a[ret.len-1]==0&&ret.len>1) ret.len--; returnret; } BigNumBigNum: : operator/(constint&b)const//大数对一个整数进行相除运算 { BigNumret; inti,down=0; for(i=len-1;i>=0;i--) { ret.a[i]=(a[i]+down*(MAXN+1))/b; down=a[i]+down*(MAXN+1)-ret.a[i]*b; } ret.len=len; while(ret.a[ret.len-1]==0&&ret.len>1) ret.len--; returnret; } intBigNum: : operator%(constint&b)const//大数对一个int类型的变量进行取模运算 { inti,d=0; for(i=len-1;i>=0;i--) { d=((d*(MAXN+1))%b+a[i])%b; } returnd; } BigNumBigNum: : operator^(constint&n)const//大数的n次方运算 { BigNumt,ret (1); inti; if(n<0) exit(-1); if(n==0) return1; if(n==1) return*this; intm=n; while(m>1) { t=*this; for(i=1;i<<1<=m;i<<=1) { t=t*t; } m-=i; ret=ret*t; if(m==1) ret=ret*(*this); } returnret; } boolBigNum: : operator>(constBigNum&T)const//大数和另一个大数的大小比较 { intln; if(len>T.len) returntrue; elseif(len==T.len) { ln=len-1; while(a[ln]==T.a[ln]&&ln>=0) ln--; if(ln>=0&&a[ln]>T.a[ln]) returntrue; else returnfalse; } else returnfalse; } boolBigNum: : operator>(constint&t)const//大数和一个int类型的变量的大小比较 { BigNumb(t); return*this>b; } voidBigNum: : print()//输出大数 { inti;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任意 两个 整数 之间 四则运算 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)