卢梦云VC课程设计简单计算器的设计_第1页
卢梦云VC课程设计简单计算器的设计_第2页
卢梦云VC课程设计简单计算器的设计_第3页
卢梦云VC课程设计简单计算器的设计_第4页
卢梦云VC课程设计简单计算器的设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 课程设计说明书 计算器(VC+课程设计)学生姓名: 指导教师: 王新祥 专 业: 计算机科学与技术 系 部: 计算机与信息科学系 学 号: 班 级: 完成时间: - 26 - / 28文档可自由编辑打印目 录一、设计任务11.1 选题意义11.2 设计目标11.3 关于virtualc+21.4 可行性及需求分析3二、程序设计与实现32.1 程序结构32.2 详细设计42.2.1 程序流程图42.2.2 程序设计具体步骤52.2.3 程序运行界面23三、设计难点与解决方法24四、设计效果与不足之处244.1程序效果图244.2 不足之处27五、参考资料27六、课程设计总结27 一、 设计任务

2、1.1选题意义此题选择意义在于引导学生学会设计简单的科学计算器,进一步掌握Visual C+应用程序。统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境Visual C+,并在此环境下设计并实现一个简单计算器系统。该计算器应能实现如下功能: 1)、数的加、减、乘、除、乘方等简单计算 2)、科学计算函数,包括正弦、余弦、正切、余切、开方、对数、指数等函数运算3)、具备历史计算的记忆功能。1.2 设计目标使计算器含有以下功能:(1)、基本运算功能:可以进行加、减、乘、除等基本运算。(2)、三角函数运算功能:可以一次完成三角函数之间的计算,求正弦函数(sin)、余弦函数(cos)、正切

3、函数(tan)、余切函数(cot)等函数的值。(3)、对数、指数运算功能:可以一次求的对数函数(log、ln)、指数函数(exp)等函数的运算。(4)、删除功能:可以在输入错误时删除已输入的数值。(5)、归零功能:可以在计算完成后清空编辑框中的已有数值。1.3关于virtualc+关于Visual C+Visual C+6.0 是Microsoft公司在1998年推出的基于Windows 9X和Windows NT的优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开发环境轻松地访问C+源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。Visual C+

4、6.0不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在Visual C+6.0集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作。VC+6.0是Windows 95/98、XP或Windows NT下的一个应用程序,本身对软硬件没有特殊要求。就是说它对环境的要求与Windows 95/98、Windows NT要求是一致的。硬件要求:一般在586以上的处理器、16MB以上内存、100MB以上的硬盘。软件要求:Windows 95/98或Windows NT3.51以上版本。VC+ 6.0系统可以在一张CD盘上,也可以在“Visual Stu

5、dio( Visual C+、Visual Foxpro)”等产品的第一张CD盘上。一般都有一个VC的自动安装程序,也可以执行VC6目录下的setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。在安装好VC 6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe安装程序,安装程序会检测当前系统安装VC6的足件,用户单击“添加删除”按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件。与一般的应用软件一样,有以下两种启动方式:(1)通过“开始”按钮,选择“程序”菜单,然后打开“Microsoft Visual studio 6.0

6、中文版”子菜单中的“Microsoft Visual C+ 6.0 中文版”程序。(2)用户也可以使用命令行启动VC。单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:Program FilesMicrosoft Visual StudioVC98VC6.exe(按默认盘符和路径安装)即可。1.4 可行性及需求分析本设计是简单计算器。日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美观的软件封面。使用人员能

7、快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。本软件主要用于计算机windows 2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。要程序能实现:加,减,乘,除,开方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。另外还可以实现多种科学计算的功能,如:三角函数的计算,弧度与角度间的转换,对数指数的计算等等。二、 程序设计与实现2.1程序结构本计算器首先是通过在计算器的界面上按下相应的按钮,来进行基本的加,减,乘,除等基本运算,计算器还能够进行平方运算,求平方根运算,乘方运算,

8、三角函数运算(包括正弦函数(sin)、余弦函数(cos)、正切函数(tan)、余切函数(cot),对数函数(ln、log),指数函数(exp),幂函数(x)等运算。2.2详细步骤2.2.1程序的流程图结束开始加法运算输入数据反三角运算乘方运算正切运算余弦运算正弦运算除法运算乘法运算减法运算归零功能平方运算根式运算输出结果果输入数据指数运算对数运算2.2.2程序设计具体步骤1) 总体功能:整个计算器除了基本的加、减、乘、除运算外,另外还有个功能可以实现七大运算:三角函数运算功能、对数函数运算功能、指数函数运算功能、乘方运算功能、平方运算功能、根式运算功能、归零功能。各个运算功能的详细设计说明分别

9、如下:a、基本运算功能主要实现数据的加、减、乘、除运算,提供简单的科学计算!b、三角函数运算功能用来执行三角函数的运算,包括正弦函数(sin)、余弦函数(cos)和正切函数(tan) 三角函数正切运算余弦运算正弦运算c、对数函数运算功能用来执行对数函数的运算,包括以e为底ln函数和以10为底的lg函数。d、指数函数运算功能用来执行指数函数的运算。e、乘方运算功能用来执行乘方的运算,进行数值的成倍计算。f、平方运算功能用来执行平方运算,说到底它也属于乘方运算的范畴。g、根式运算功能用来执行根式的运算。 h.归零、删除功能主要实现数据的清零,当用户输入数据出错时,使用此功能可以清除已输入的内容并重

10、新输入新的运算内容。具体程序如下:double operate(double y, char c, double x) /对两个数计算 (含是双目运算符:如 *, / 等等)double r;if(c = '-')r = x - y;else if(c = '+')r = x + y;else if(c = '/' && y != 0)r = x / y;else if(c = '*')r = x * y;else if(c = '')r = 1;for(int i = 1; i <= y;

11、i+)r *= x;else if(c = '%')int r0 = (int)x % (int)y;r = double(r0);return r;double operate_one(double one, char cc) /对一个数运算(含单目运算符:如log(L), sin(S) 等等)double r;if(cc = 'Q')r = sqrt(one);else if(cc = 'C')r = cos(one);else if(cc = 'S')r = sin(one);else if(cc = 'T'

12、)r = tan(one);else if(cc = 'c')r = acos(one);else if(cc = 's')r = asin(one);else if(cc = 't')r = atan(one);return r;double operate_L(double a, double b, char dian)/求对数的值double r = log(b) / log(a);return r;2) 运算符的比较等级具体程序如下:typedef struct node /为了处理符号而建立的链表(如: 1+(-2)char data;

13、node *next;node;typedef struct stack_num /存储 数 的栈double *top;double *base;stack_num;typedef struct stack_char /存储 运算符号 的栈char *top;char *base;stack_char;stack_num S_num;/定义stack_char S_char;/定义char fu18 = 'n', ')', '+', '-', '*', '/', '%', '

14、;', 'Q', 'L', 'C', 'S', 'T', 'c', 's', 't', '('int compare1000; /表现出各运算符号的优先级double shu1000;/存储 "数" 的数组double dai_result;/运算的结果,是为了处理 M 运算(简介函数里有M的定义)int biao = 0;/和dia_result 一样,为了处理 M 运算char lineSIZE;/输入的所要计算的表达式

15、void init()/初始化comparefu0 = -2;/用数字的大小表现出符号的优先级comparefu1 = -1;comparefu2 = 2;comparefu3 = 2;comparefu4 = 4;comparefu5 = 4;comparefu6 = 4;comparefu7 = 5;for(int i = 8; i <= 15; i+)comparefui = 6;comparefu16 = 7;S_num.base = (double*)malloc(sizeof(double)*SIZE);/为栈开辟空间S_char.base = (char*)malloc(s

16、izeof(char)*SIZE);/同上S_num.top = S_num.base;S_char.top = S_char.base;void push_num(double n)/数字进栈* +S_num.top = n;void push_char(char c)/运算符号进栈* +S_char.top = c;double pop_num()/数字出栈double m = *S_num.top;S_num.top-;return m;char pop_char()/运算符号出栈char cc = *S_char.top;S_char.top-;return cc;char get_t

17、op_char()/得到运算符号的栈中最顶端的运算符号return *S_char.top;3) 整个表达式具体运算程序:double compute() /对整个表达式的计算char c; /表示运算符号int p = 0;/用于shu+p, 先初始化int i, j;init();/进行初始化push_char('n');linestrlen(line) = 'n'linestrlen(line)+1 = '0'if(biao)push_num(dai_result);/把运算的结果先进栈, 在这个结果的基础上继续进行运算biao = 0;f

18、or(i = 0; linei != '0')/把表达式中的数字字符串转化成可计算的数字int flag = 0;int flag1 = 1;/标记是否是运算符号/int flag2 = 1;/标记是否出现'_'double h = 0;int ge;/位数int biao_dian = 0;/是否是小数的类型while(1)flag1 = 1;for(j = 0; j <= 16; j+)if(linei = fuj)flag1 = 0;break;if(linei = '_')break;if(linei = '.')i

19、+;ge = 0;biao_dian = 1;if(linei = 'P')shu+p = pi;i+;break;if(linei = 'E')shu+p = e;i+;break;if(flag1)h = h * 10 + (linei - '0');flag = 1;i+;if(biao_dian)ge+;elsebreak;if(flag)if(biao_dian)int r = 1;for(int k = 1; k <= ge; k+)r *= 10;h /= r;shu+p = h;/把转化而来的数字存于数组if(linei =

20、 '+')shu+p = -1;else if(linei = '-')shu+p = -2;else if(linei = '*')shu+p = -3;else if(linei = '/')shu+p = -4;else if(linei = '%')shu+p = -5;else if(linei = '')shu+p = -6;else if(linei = 'Q')shu+p = -7;else if(linei = 'L')shu+p = -8;else

21、 if(linei = 'C')shu+p = -9;else if(linei = 'S')shu+p = -10;else if(linei = 'T')shu+p = -11;else if(linei = 'c')shu+p = -12;else if(linei = 's')shu+p = -13;else if(linei = 't')shu+p = -14;else if(linei = '(')shu+p = -15;else if(linei = ')

22、9;)shu+p = -16;else if(linei = 'n')shu+p = -17;i+;i = 1;while(shui != -17 | get_top_char() != 'n')double m = shui;if(m >= 0)push_num(m);i+;elseif(m = -1)c = '+'else if(m = -2)c = '-'else if(m = -3)c = '*'else if(m = -4)c = '/'else if(m = -5)c = '

23、;%'else if(m = -6)c = ''else if(m = -7)c = 'Q'else if(m = -8)c = 'L'else if(m = -9)c = 'C'else if(m = -10)c = 'S'else if(m = -11)c = 'T'else if(m = -12)c = 'c'else if(m = -13)c = 's'else if(m = -14)c = 't'else if(m = -15)c =

24、 '('else if(m = -16)c = ')'else if(m = -17)c = 'n'char ch = get_top_char();/得到最顶端运算符号if(comparech < comparec)/运算符号级别的比较push_char(c);i+;else if(ch = '(' && c = ')')pop_char();i+;else if(comparech >= comparec && ch != '(' &&

25、 ch != 'n')if(ch = 'Q' | ch = 'C' | ch = 'S'| ch = 'T'| ch = 'c' | ch = 's' | ch = 't')double one = pop_num();char dian = pop_char();push_num(operate_one(one, dian); else if(ch = 'L')double one_L = pop_num();double two_L = pop_n

26、um();char dian = pop_char();push_num(operate_L(two_L, one_L, dian);elsedouble x = pop_num();double y = pop_num();char dian = pop_char();if(dian = '/' && x = 0)/判断是否除了"零"cout<<"由于您除了零,结果将是错误的"<<endl;push_num(operate(x, dian, y);/把进行一次计算的结果入栈elsepush_cha

27、r(c);i+;double result = pop_num();/得到结果return result;4) 检查表达式的书写错误:int check_kuohao()/检查表达式括号是否匹配int i, f = 0;int kuoSIZE, key = 1;memset(kuo, 0, sizeof(kuo);for(i = 0; linei != '0' i+)if(linei = '(')kuo+f = 1;else if(linei = ')')if(kuof = 1)kuof = 0;f-;elsekey = 0;break;if(k

28、ey && f = 0)return 1;elsereturn 0;int check_char()/检查运算符号是否合法(如: 1 +* 4)int i, ge;for(i = 0; linei != '0' )ge = 0;while(linei = '+' | linei = '-' | linei = '*'| linei = '/' | linei = '%' | linei = ''| linei = 'Q' | linei = '

29、L' | linei = 'S'| linei = 'C' | linei = 'T' | linei = 's'| linei = 'c' | linei = 't')ge+;i+;i+;if(ge >= 3)return 0;else return 1;void output(double result)/打出结果printf("所得结果是: ");cout<<result<<endl;void check()/检查表达式是否合法void

30、 introduce();char cc;/决定计算器按哪种功能进行计算double result;/结果void input();/定义if( check_kuohao() && check_char() )/看是否合法, 合法则计算result = compute();output(result);cout<<"输入一个字符'M'或'D'或'F', 决定是否继续: "<<endl;while(cin>>cc)if(cc = 'M')system("

31、;cls");introduce();printf("您上次所得结果为: ");cout<<result<<endl;cout<<"在上次计算结果的基础上, 请继续输入想计算的表达式"<<endl;dai_result = result;biao = 1;input();/输入表达式break;else if(cc = 'D')system("cls");introduce();cout<<"计算器已清零, 请输入您所要计算的表达式&quo

32、t;<<endl;input();/输入表达式break;else if(cc = 'F')system("cls");cout<<"计算器关闭, 谢谢使用!"<<endl;break;elsecout<<"所输入字符无效, 请输入一个字符'M'或'D'或'F'!"<<endl;continue;else/不合法,分两种不合法if(check_kuohao() = 0 && check_char(

33、) = 1)cout<<"您所输入的表达式括号不匹配, 请重新输入:"<<endl;input();/输入表达式elsecout<<"您所输入的表达式不合法, 请重新输入:"<<endl;input();/输入表达式5) 负号的处理方式:void tackle_fuhao()/处理负号node *root, *head, *p, *q, *p1;root = head = new node;head->next = NULL;int i;for(i = 0; linei != '0'

34、i+)/建立链表p = new node;p->data = linei;p->next = head->next;head->next = p;head = p;/ delete p;q = (node*)malloc(sizeof(node);head = root;if(root->next->data = '+' | root->next->data = '-')/处理第一个字符p = new node;p->data = '0'p->next = head->next;h

35、ead->next = p;if(root->next != NULL)for(q = root->next; q; q = q->next)if(q->data = '(' && (q->next->data = '-' | q->next->data = '+')p = new node;p->data = '0'p->next = q->next;q->next = p;/ delete q;p1 = new node;int qi

36、 = -1;for(p1 = root->next; p1; p1 = p1->next)line+qi = p1->data;line+qi = '0'void input()/输入cin>>line;if(biao = 0)tackle_fuhao();/处理负号check();/检查表达式是否合法6) 程序主界面的设计:void introduce()/对计算器的符号功能的简要介绍 cout<<" *的计算器简要介绍"<<endl<<endl;cout<<"|C(cos)| S(sin) | T(tan) | a(arccos) | c(arcsin) | t(arctan) |"<<endl;cout<<"|-|-|-|-|-|-|"<<endl;cout<<"| 7 | 8 | 9 | / | on | L(log) |"<<endl;cout<<"|-|-|-|-|-|-|"<<endl;cout<<"| 4 | 5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论