1、任意两个整数之间的四则运算课程设计 课程设计报告 课程名称: 信息系统开发语言(二) 学 期: 2013-2014学年第2学期 学时学分: 64学时 4学分 专业班级: 信管1 学 号: 姓 名: 指导老师: 提交日期: 2014 年 6月10日 一、课程设计目的 通过课程设计需要达到三个目的: 第一是检验和巩固专业知识。通过课程设计,有助于加深我们对C+这门课程的理解,我们在课堂上学的都是基础理论知识,对于如何用程序语言来描述所学知识还是有一定难度。通过课程设计,我们可以真正理解其内涵。 第二是提高综合素质和能力。通过课程设计,逐渐培养学生的编程能力、用计算机解决实际问题的能力。程序设计能直
2、接有效地训练我们分析问题、解决问题的能力。 第三是有利于培养认真严谨的学习态度。在程序设计过程里,当我们入程序代码的时候,如果不够认真或细心,就可能导致语法错误,从而无法得出运行结果。我们反复调试,反复修改的过程,可以培养我们认真严谨的作风。二、问题描述与分析1、问题描述:题号1:两个任意长度整数之间的四则运算总体需求:任意给定两个数字,计算它们之间的加减乘除结果。功能需求:(1)输入并保存两个整数,长度不限。 (2)通过菜单选择运算类型并输出结果。用户界面:输入: 输入两个整数,长度不限 输出:(1)应用程序正常运行后,要在屏幕上显示一个文字菜单。 (2)要求用户输入数据时,要给出清晰明确的
3、提示信息,包括输入的数据内容、格式及结束方式等。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)当输入值为
4、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语句。四、算法分析、设计与描述 本题要求任意长度的整数,所以采用数组存储的方式来存放和表
5、示大整数。一个数组元素,存放大整数中的一位。用字符串作为文本的数据类型。定义一个类为大数,如class BigNum。定义一个比较大的整型数组,控制位数为500,如int a500;构造一个BigNum的函数,如BigNum() len = 1;memset(a,0,sizeof(a);将一个int类型的变量转化为大数,如BigNum(const int); 将一个字符串类型的变量转化为大数,如BigNum(const char*); 重载赋值、输入输出、加减乘除等运算符。通过对+,-,*,/运算符的重新定义,使它们可以完成对对象加减乘除的运算。重载赋值运算符,大数之间就行赋值运算,如BigN
6、um& BigNum:operator=(const BigNum & 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时,cas
7、e2: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、程序设计的基本思路:Class BigNum /大数运算类的定义private: in
8、t a500; /可以控制大数的位数 int len; /大数长度public: BigNum() len = 1;memset(a,0,sizeof(a); /构造函数 BigNum(const int); /将一个int类型的变量转化为大数 BigNum(const char*); /将一个字符串类型的变量转化为大数 BigNum(const BigNum &); /复制构造函数 BigNum &operator=(const BigNum &); /重载赋值运算符,大数之间进行赋值运算 friend istream& operator(istream&, BigNum&); /重载输入运
9、算符 friend ostream& operator(const BigNum & T)const; /大数和另一个大数的大小比较 bool operator(const int & t)const; /大数和一个int类型的变量的大小比较 void print(); /输出大数 2、类BigNum的UML图如下: BigNum -a500:int -len:int +BigNum(const int)+BigNum(const char*)+BigNum(const BigNum &)+operator=(const BigNum &):BigNum+operator(istream&,B
10、igNum&):friend istream+operator(const BigNum & T)const:bool +operator(const int & t)const:bool+ print():void2程序代码及说明#include /预处理命令,调用标准输入输出头文件iostream#include /调用字符串文件#include /调用声明 “流操作符”的头文件#include /调用标准库的算法的头文件#include /调用字符串的头文件using namespace std; / 使用名称空间std#define MAXN 9999 /宏定义,用MAXN代替9999
11、#define MAXSIZE 10 /宏定义,用MAXSIZE代替10#define DLEN 4 /宏定义,用DLEN代替4class BigNum /大数运算类的定义private: int a500; /可以控制大数的位数 int len; /大数长度public: BigNum() len = 1;memset(a,0,sizeof(a); /构造函数 BigNum(const int); /将一个int类型的变量转化为大数 BigNum(const char*); /将一个字符串类型的变量转化为大数 BigNum( const string &src ); BigNum(const
12、 BigNum &); /复制构造函数 BigNum &operator=(const BigNum &); /重载赋值运算符,大数之间进行赋值运算 friend istream& operator(istream&, BigNum&); /重载输入运算符 friend ostream& operator(const BigNum & T)const; /大数和另一个大数的大小比较 bool operator(const int & t)const; /大数和一个int类型的变量的大小比较 void print(); /输出大数;BigNum:BigNum(const int b) /将一个i
13、nt类型的变量转化为大数 int c,d = b; len = 0; memset(a,0,sizeof(a);/ 把从a开始的20个值设置为0while(d MAXN) c = d - (d / (MAXN + 1) * (MAXN + 1); d = d / (MAXN + 1); alen+ = c; alen+ = d;BigNum:BigNum(const char*s) /将一个字符串类型的变量转化为大数 int t,k,index,l,i; memset(a,0,sizeof(a); l=strlen(s); len=l/DLEN; if(l%DLEN) len+; index=
14、0; for(i=l-1;i=0;i-=DLEN) t=0; k=i-DLEN+1; if(k0) k=0; for(int j=k;j=0;i-=DLEN) t=0; k=i-DLEN+1; if(k0) k=0; for(int j=k;j=i;j+) t=t*10+sj-0; aindex+=t; BigNum:BigNum(const BigNum & T) : len(T.len) /复制构造函数的实现 int i; memset(a,0,sizeof(a); for(i = 0 ; i len ; i+) ai = T.ai;BigNum & BigNum:operator=(co
15、nst BigNum & n) /重载赋值运算符,大数之间进行赋值运算 int i; len = n.len; memset(a,0,sizeof(a); for(i = 0 ; i (istream & in, BigNum & b) /重载输入运算符 char chMAXSIZE*4; int i = -1; inch; int l=strlen(ch); int count=0,sum=0; for(i=l-1;i=0;) sum = 0; int t=1; for(int j=0;j=0;j+,i-,t*=10) sum+=(chi-0)*t; b.acount=sum; count+
16、; b.len =count+; return in;ostream& operator(ostream& out, BigNum& b) /重载输出运算符 int i; out = 0 ; i-) out.width(DLEN); out.fill(0); out len ? T.len : len; for(i = 0 ; i MAXN) t.ai + 1+; t.ai -=MAXN+1; if(t.abig != 0) t.len = big + 1; else t.len = big; return t; BigNum BigNum:operator-(const BigNum & T
17、) const /两个大数之间的相减运算 int i,j,big; bool flag; BigNum t1,t2; if(*thisT) t1=*this; t2=T; flag=0; else t1=T; t2=*this; flag=1; big=t1.len; for(i = 0 ; i big ; i+) if(t1.ai i) t1.aj- += MAXN; t1.ai += MAXN + 1 - t2.ai; else t1.ai -= t2.ai; t1.len = big; while(t1.alen - 1 = 0 & t1.len 1) t1.len-; big-; if
18、(flag) t1.abig-1=0-t1.abig-1; return t1; BigNum BigNum:operator*(const BigNum & T) const /两个大数之间的相乘运算 BigNum ret; int i,j,up; int temp,temp1; for(i = 0 ; i len ; i+) up = 0; for(j = 0 ; j MAXN) temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); up = temp / (MAXN + 1); ret.ai + j = temp1; else up = 0; re
19、t.ai + j = temp; if(up != 0) ret.ai + j = up; ret.len = i + j; while(ret.aret.len - 1 = 0 & ret.len 1) ret.len-; return ret; BigNum BigNum:operator/(const int & b) const /大数对一个整数进行相除运算 BigNum ret; int i,down = 0; for(i = len - 1 ; i = 0 ; i-) ret.ai = (ai + down * (MAXN + 1) / b; down = ai + down *
20、(MAXN + 1) - ret.ai * b; ret.len = len; while(ret.aret.len - 1 = 0 & ret.len 1) ret.len-; return ret;int BigNum:operator %(const int & b) const /大数对一个int类型的变量进行取模运算 int i,d=0; for (i = len-1; i=0; i-) d = (d * (MAXN+1)% b + ai)% b; return d;BigNum BigNum:operator(const int & n) const /大数的n次方运算 BigNu
21、m t,ret(1); int i; if(n1) t=*this; for( i=1;i1=m;i(const BigNum & T) const /大数和另一个大数的大小比较 int ln; if(len T.len) return true; else if(len = T.len) ln = len - 1; while(aln = T.aln & ln = 0) ln-; if(ln = 0 & aln T.aln) return true; else return false; else return false;bool BigNum:operator (const int &
22、t) const /大数和一个int类型的变量的大小比较 BigNum b(t); return *thisb;void BigNum:print() /输出大数 int i; cout = 0 ; i-) cout.width(DLEN); cout.fill(0); cout ai; cout endl;int main(void) while( true ) system( cls ); BigNum a, b, c; string sa, sb; coutsasb; a = sa; b = sb; int flag = 0; do cout1、相加n2、相减n3、相乘n输入序号确定操作,非以上序号时退出nflag; switch( flag ) case 1: c = a + b; break; case 2: c = a - b; break; case 3: c = a * b; break; de
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1