《任意两个整数之间的四则运算课程设计.pdf》由会员分享,可在线阅读,更多相关《任意两个整数之间的四则运算课程设计.pdf(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 课程设计报告 课程名称:信息系统开发语言(二)学 期:2013-2014 学年第 2 学期 学时学分:64 学时 4 学分 专业班级:信管 1 学 号:姓 名:指导老师:提交日期:2014 年 6 月 10 日 湖南商学院课程设计 第 1 页 共 25 页 一、课程设计目的 通过课程设计需要达到三个目的:第一是检验和巩固专业知识。通过课程设计,有助于加深我们对 C+这门课程的理解,我们在课堂上学的都是基础理论知识,对于如何用程序语言来描述所学知识还是有一定难度。通过课程设计,我们可以真正理解其内涵。第二是提高综合素质和能力。通过课程设计,逐渐培养学生的编程能力、用计算机解决实际问题的能力。程
2、序设计能直接有效地训练我们分析问题、解决问题的能力。第三是有利于培养认真严谨的学习态度。在程序设计过程里,当我们入程序代码的时候,如果不够认真或细心,就可能导致语法错误,从而无法得出运行结果。我们反复调试,反复修改的过程,可以培养我们认真严谨的作风。二、问题描述与分析 1、问题描述:题号 1:两个任意长度整数之间的四则运算 总体需求:任意给定两个数字,计算它们之间的加减乘除结果。功能需求:(1)输入并保存两个整数,长度不限。(2)通过菜单选择运算类型并输出结果。用户界面:输入:输入两个整数,长度不限 输出:(1)应用程序正常运行后,要在屏幕上显示一个文字菜单。(2)要求用户输入数据时,要给出清
3、晰明确的提示信息,包括输入的数据内容、格式及结束方式等。2、问题分析:本程序要求实现任意长度的两个整数的加减乘除的运算。由题意得,题目的难点在于任意长度,计算的数值和结果精度是任意的。但是在C+语言中定义的类型中精度最多只有二十多位,因而采用数组存储的方式来存放数字。运用do.While 和 switch语句进行选择判断。湖南商学院课程设计 第 2 页 共 25 页 假设字符串为 sa,sb。定义大数为 a,b,c。并分别把 sa 和 sb 赋值给 a 和 b。定义一个 int 型变量 flag,并且给 flag 赋初始值为 0。(1)当输入值为 1 时,case1:c=a+b,调用函数重载,
4、进行加法的运算。因为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)
5、当输入值为其他时,执行default 语句。四、算法分析、设计与描述 本题要求任意长度的整数,所以采用数组存储的方式来存放和表示大整数。一个数组元素,存放大整数中的一位。用字符串作为文本的数据类型。定义一个类为大数,如class BigNum。定义一个比较大的整型数组,控制位数为500,如int a500;构造一个 BigNum 的函数,如BigNum()len=1;memset(a,0,sizeof(a);将一个 int类型的变量转化为大数,如BigNum(const int);将一个字符串类型的变量转化为大数,如BigNum(const char*);重载赋值、输入输出、加减乘除等运算符。
6、通过对+,-,*,/运算符的重新定义,使它们可以完成对对象加减乘除的运算。重载赋值运算符,大数之间就行赋值运算,如BigNum&BigNum:operator=(const BigNum&n)。程序开始,运行主函数,虽然需要进行多次判断选择,但是每一次都是判断同一表达式的值,就没必要在每一个嵌套的 if 语句中都计算一遍表达式的值,为此用switch语句来解决这问题。所以运用 do.While 和 switch 语句进行选择判断。假设字符串为 sa,sb。定义大数为 a,b,c。并分别把 sa 和 sb 赋值给 a 和 b。定义一个int型变量flag,并且给flag赋初始值为0。(1)当输入
7、值为1时,case1:c=a+b,湖南商学院课程设计 第 3 页 共 25 页 调用函数重载,进行加法的运算。因为 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 时,跳出 swi
8、tch 这个选择语句,因为 flag=0等于 0,所以又进入 do.while 循环语句。(6)当输入值为其它数时,则是 default语句。五、程序设计 1、程序设计的基本思路:Class BigNum /大数运算类的定义 private:int a500;/可以控制大数的位数 int len;/大数长度 public:BigNum()len=1;memset(a,0,sizeof(a);/构造函数 BigNum(const int);/将一个 int 类型的变量转化为大数 BigNum(const char*);/将一个字符串类型的变量转化为大数 BigNum(const BigNum&)
9、;/复制构造函数 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();/输出大数 湖南商学院课程设计 第 5 页 共 25 页 2、类BigNum 的 UML 图如下:2程序代码及说明#inc
10、lude /预处理命令,调用标准输入输出头文件 iostream#include /调用字符串文件 BigNum -a500:int -len:int +BigNum(const int)+BigNum(const char*)+BigNum(const BigNum&)+operator=(const BigNum&):BigNum+operator(istream&,BigNum&):friend istream+operator(const BigNum&T)const:bool +operator(const int&t)const:bool+print():void 湖南商学院课程设
11、计 第 6 页 共 25 页#include /调用声明“流操作符”的头文件#include /调用标准库的算法的头文件#include /调用字符串的头文件 using namespace std;/使用名称空间 std#define MAXN 9999 /宏定义,用 MAXN 代替 9999#define MAXSIZE 10 /宏定义,用 MAXSIZE 代替 10#define DLEN 4 /宏定义,用 DLEN 代替 4 class BigNum /大数运算类的定义 private:int a500;/可以控制大数的位数 int len;/大数长度 public:BigNum()l
12、en=1;memset(a,0,sizeof(a);/构造函数 BigNum(const int);/将一个 int 类型的变量转化为大数 BigNum(const char*);/将一个字符串类型的变量转化为大数 BigNum(const string&src);BigNum(const BigNum&);/复制构造函数 BigNum&operator=(const BigNum&);/重载赋值运算符,大数之间进行赋值运算 friend istream&operator(istream&,BigNum&);/重载输入运算符 friend ostream&operator(const BigN
13、um&T)const;/大数和另一个大数的大小比较 bool operator(const int&t)const;/大数和一个 int 类型的变量的大小比较 void print();/输出大数;BigNum:BigNum(const int b)/将一个 int 类型的变量转化为大数 int c,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);alen+=c;alen+=d;BigNum:BigNum(const char*s)/将一
14、个字符串类型的变量转化为大数 int t,k,index,l,i;湖南商学院课程设计 第 8 页 共 25 页 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(k0)k=0;for(int j=k;j=0;i-=DLEN)湖南商学院课程设计 第 9 页 共 25 页 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(con
15、st BigNum&T):len(T.len)/复制构造函数的实现 int i;memset(a,0,sizeof(a);for(i=0;i len;i+)ai=T.ai;BigNum&BigNum:operator=(const BigNum&n)/重载赋值运算符,大数之间进行赋值运算 int i;len=n.len;memset(a,0,sizeof(a);for(i=0;i(istream&in,BigNum&b)/重载输入运算符 湖南商学院课程设计 第 10 页 共 25 页 char chMAXSIZE*4;int i=-1;inch;int l=strlen(ch);int cou
16、nt=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+;b.len=count+;return in;ostream&operator(ostream&out,BigNum&b)/重载输出运算符 int i;out=0;i-)out.width(DLEN);out.fill(0);湖南商学院课程设计 第 11 页 共 25 页 out len?T.len:len;for(i=0;i MAXN)t.ai+1+;t.ai-=MAXN+1;if(t.a
17、big!=0)t.len=big+1;else t.len=big;return t;BigNum BigNum:operator-(const BigNum&T)const /两个大数之间的相减运算 int i,j,big;湖南商学院课程设计 第 12 页 共 25 页 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-
18、=t2.ai;湖南商学院课程设计 第 13 页 共 25 页 t1.len=big;while(t1.alen-1=0&t1.len 1)t1.len-;big-;if(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/(MAX
19、N+1);ret.ai+j=temp1;湖南商学院课程设计 第 14 页 共 25 页 else up=0;ret.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*(MAXN+
20、1)-ret.ai*b;ret.len=len;while(ret.aret.len-1=0&ret.len 1)ret.len-;return ret;湖南商学院课程设计 第 15 页 共 25 页 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 次方运算 BigNum t,ret(1);int i;if
21、(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&t)const /大数和一个 int 类型的变量的大小比较 BigNum b(t);湖南商学院课程设计 第 17
22、 页 共 25 页 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 湖南商学院课程设计 第 18 页 共 25 页 cout1、相加n2、相减n3、相乘n 输入序号确定操作,非以上序号时退出nflag;switch(flag)case 1:c=a+b;
23、break;case 2:c=a-b;break;case 3:c=a*b;break;default:flag=0;break;if(flag!=0)cout结果为:cn-endl;while(flag!=0);return 0;湖南商学院课程设计 第 19 页 共 25 页 五、调试分析 程序的开始的输入运行过程,会有很多的错误,像大小写输入错误,“”忘记输入等,还有一些语句上的错误导致程序运行不出结果,有时显示出一大片出错信息往往使我感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息;有的是少了“”或多了“”有的是书写语句
24、时忘记写“;”或是全角的“;”了,只要加上一个变量定义,或填加“;”就所有错误 都消除了。经过多次的调试,本程序可以实现计算要求。以下列举出程序调试过程中出现的部分错误:(1)错误原因:没有写using namespace std;。在#include,它包含了一个类,在类的使用之前要预处理一下,写上using namespace s td;。就是这个功能,然后你就可以使用cin,cout这两个成员函数了,如果不使用预处理(usingnamespace std;),需要很麻烦的加上std:cin或者std:cout再去使用它的成员函数。程序的错误很多,在同学的帮助下,自己经过漫长的修改,程序终
25、于零错误,并且能正确运行。湖南商学院课程设计 第 20 页 共 25 页 六、程序运行结果分析 (1)加法运算:当输入两个整数,11111111111111111111111111111111111 和111111111111111111111111111111111 用空格分开,再输入 1 序号,为加法,结果为 11222222222222222222222222222222222。经验证,程序运行后所得结果与预计结果相同。由此可确定,该运行结果正确,运行正常。湖南商学院课程设计 第 21 页 共 25 页(2)减法运算:当输入整数 11111111111111111111111111111
26、11111111111111 和111111111111111111111111111111111111111,用空格分开,再输入序号 2,为减法。结果为11110000000000000000000000000000000000。经验证,程序运行后所得结果与预计结果相同。由此可确定,该运行结果正确,运行正常。(3)乘法运算:当输入两个整数 111111111111111111111111111111111 和666666666666666666666 用 空 格 分 开,再 输 入 3 序 号,为 乘 法,结 果 为74074074074074074073333333333333333333
27、333325925925925925925926。湖南商学院课程设计 第 22 页 共 25 页 经验证,程序运行后所得结果与预计结果相同。由此可确定,该运行结果正确,运行正常。七、总结与体会 通过 C+的课程设计,我深深地感受到编写程序的不容易,刚开始看到题目时毫无头绪,不知道从何下手。第一个想到的是上网搜程序,结果发现网上的程序都是有限长度的整数的四则运算,而我的题目要求是任意长度。顿时陷入困境中。一度想随便弄一个程序交作业。但是经过一晚的思考,我觉得只要有心、有毅力,没有什么是做不到的。于是我又重拾信心,从新开始大量的搜集资料,询问比较擅长C+的学霸同学。写程序的过程是最难熬的、枯燥的,
28、每次用 VC 检测出错误很多个的时候就要崩溃。但是我还是没有放弃。最终,程序弄出来了。本程序定义一个类为大数。重载赋值、输入输出、加减乘除等运算符。用字符串来进行数的加、减、乘、除的运算,还进行了字符串类型的变量转化为大数以及整型类型的变量转化为大数。我花了大量的时间去搞懂每一个语句的意思,主函数和调用函数的编写,这不仅仅是在课程上、知识上对自己的强化和锻炼,更是一种心理上的考验,充分的锻炼了我的耐心、细心。这次课程设计我不仅学习到我们在课堂上没有搞得明白的问题,也使我明白了,老师的讲解固然重要,但是我自己对学习的热情和自学的能力也是很重要的。也许有些问题没有得到很好的解决,但是只有这样我才能
29、认识到自己的不足和缺点,并能够通过这种方法不断的进行改进。在这次课程设计中我认识到需要学习的东西还有很多,只有上课认真听讲再适当的进行一些实际操作,才能使理论与实践更好的结合起来。通过这次课程设计教会我如何在以后的学习和生活中对待困难和与人相处交流。最后,感谢学霸同学的耐心分析和讲解,感谢老师这学期以来的付出,以及这一学期对我的关心与教导!湖南商学院课程设计 第 23 页 共 25 页 成绩评定表 优秀 良好 中等 及格 不及格 报 告 文 档 1.完全按照课程设计文档规范要求 2.内容充实、设计合理 1.完全按照课程设计文档规范要求 2 内容较充实、设计较合理 1.基本按照课程设计文档规范要
30、求 2.内容较充实、设计较合理 1.基本按照课程设计文档规范要求 2.内容欠充实、设计欠合理 1.没有按照课程设计文档规范要求 2.内容不充实、设计不合理 算 法 分 析 1算法正确。2算法分析很全面。3算法描述很清晰。1算法正确。2算法分析全面。3算法描述清晰。1算法正确。2算法分析较全面。3算法描述较清晰。1算法基本正确。2算法分析欠全面。3算法描述欠清晰。1算法不正确。2算法分析不全面。3算法描述不清晰。程 序 实 现 1 程序设计思路很清晰。2 程序代码编写很完整。3程序运行正确。1 程序设计思路清晰。2 程序代码编写完整。3程序运行正确。1 程序设计思路较清晰。2 程序代码编写较完整
31、。3程序运行正确。1 程序设计思路欠清晰。2 程序代码编写欠完整。3 程序运行基本正确。1程序设计思路不清晰。2程序代码编写不完整。3程序运行不正确。结 果 分 1有运行结果描述。2结果描述很清1有运行结果描述。2结果描述清晰、1有运行结果描述。2结果描述较清1有运行结果描述。2结果描述欠清1无运行结果描述。2结果描述不清 湖南商学院课程设计 第 24 页 共 25 页 析 晰、很完整。3结果分析很深入。完整。3结果分析深入。晰、较完整。3结果分析较深入。晰、欠完整。3结果分析欠深入。晰、很完整。3结果分析不深入。设 计 总 结 1有课程总结。2课程总结很全面、很深入。3 能从课程中总结出创新成果。1有课程总结。2课程总结全面、深入。3 能从课程中总结出创新成果。1有课程总结。2课程总结较全面、较深入。1有课程总结。2课程总结欠全面、欠深入。1无课程总结。2课程总结不全面、不深入。平 时 成 绩 1.作业无缺交、迟交 2.作业完成度好 3.出勤、课堂纪律很好 1.作业无缺交、迟交 2.作业完成度较好 3.出勤、课堂纪律好 1.作业无缺交 2.作业完成度较好 3.出勤、课堂纪律较好 1.作业无缺交,有或迟交 2.作业完成度一般 3.出勤、课堂纪律一般 1.作业有缺交 2.作业完成度较差 3.出勤、课堂纪律差 综合成绩评定:评阅老师(签章):评审时间:年 月 日
限制150内