文档详情

卢梦云VC课程设计简单计算器的设计

ch****o
实名认证
店铺
DOC
157.51KB
约28页
文档ID:156735476
卢梦云VC课程设计简单计算器的设计_第1页
1/28

课程设计说明书 计算器(VC++课程设计)学生姓名: 指导教师: 王新祥 专 业: 计算机科学与技术 系 部: 计算机与信息科学系 学 号: 班 级: 完成时间: 目 录一、设计任务 11.1 选题意义 11.2 设计目标 11.3 关于virtualc++ 21.4 可行性及需求分析 3二、程序设计与实现 32.1 程序结构 32.2 详细设计 42.2.1 程序流程图 4 程序设计具体步骤 52.2.3 程序运行界面 23三、设计难点与解决方法 24四、设计效果与不足之处 244.1程序效果图 244.2 不足之处 27五、参考资料 27六、课程设计总结 27 一、 设计任务1.1选题意义此题选择意义在于引导学生学会设计简单的科学计算器,进一步掌握Visual C++应用程序统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境Visual C++,并在此环境下设计并实现一个简单计算器系统。

该计算器应能实现如下功能: 1)、数的加、减、乘、除、乘方等简单计算 2)、科学计算函数,包括正弦、余弦、正切、余切、开方、对数、指数等函数运算3)、具备历史计算的记忆功能1.2 设计目标使计算器含有以下功能:(1)、基本运算功能:可以进行加、减、乘、除等基本运算2)、三角函数运算功能:可以一次完成三角函数之间的计算,求正弦函数(sin)、余弦函数(cos)、正切函数(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++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 Studio( Visual C++、Visual Foxpro)”等产品的第一张CD盘上一般都有一个VC的自动安装程序,也可以执行VC6目录下的setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式在安装好VC 6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe安装程序,安装程序会检测当前系统安装VC6的足件,用户单击“添加/删除”按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件与一般的应用软件一样,有以下两种启动方式:(1)通过“开始”按钮,选择“程序”菜单,然后打开“Microsoft Visual studio 6.0中文版”子菜单中的“Microsoft Visual C++ 6.0 中文版”程序。

2)用户也可以使用命令行启动VC单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:\Program Files\Microsoft Visual Studio\VC98\VC6.exe(按默认盘符和路径安装)即可1.4 可行性及需求分析本设计是简单计算器日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美观的软件封面使用人员能快捷简单地进行操作即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助本软件主要用于计算机windows 2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能要程序能实现:加,减,乘,除,开方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能另外还可以实现多种科学计算的功能,如:三角函数的计算,弧度与角度间的转换,对数指数的计算等等二、 程序设计与实现2.1程序结构本计算器首先是通过在计算器的界面上按下相应的按钮,来进行基本的加,减,乘,除等基本运算,计算器还能够进行平方运算,求平方根运算,乘方运算,三角函数运算(包括正弦函数(sin)、余弦函数(cos)、正切函数(tan)、余切函数(cot)),对数函数(ln、log),指数函数(exp),幂函数(x~)等运算。

2.2详细步骤2.2.1程序的流程图结束开始加法运算输入数据反三角运算乘方运算正切运算余弦运算正弦运算除法运算乘法运算减法运算归零功能平方运算根式运算输出结果果输入数据指数运算对数运算程序设计具体步骤1) 总体功能:整个计算器除了基本的加、减、乘、除运算外,另外还有7个功能可以实现七大运算:三角函数运算功能、对数函数运算功能、指数函数运算功能、乘方运算功能、平方运算功能、根式运算功能、归零功能各个运算功能的详细设计说明分别如下:a、基本运算功能 主要实现数据的加、减、乘、除运算,提供简单的科学计算!b、三角函数运算功能用来执行三角函数的运算,包括正弦函数(sin)、余弦函数(cos)和正切函数(tan) 三角函数c、对数函数运算功能用来执行对数函数的运算,包括以e为底ln函数和以10为底的lg函数d、指数函数运算功能用来执行指数函数的运算e、乘方运算功能用来执行乘方的运算,进行数值的成倍计算f、平方运算功能用来执行平方运算,说到底它也属于乘方运算的范畴g、根式运算功能用来执行根式的运算 h.归零、删除功能主要实现数据的清零,当用户输入数据出错时,使用此功能可以清除已输入的内容并重新输入新的运算内容。

具体程序如下: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; 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') 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; 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 fu[18] = {'\n', ')', '+', '-', '*', '/', '%', '^', 'Q', 'L', 'C', 'S', 'T', 'c', 's', 't', '('};int compare[1000]; //表现出各运算符号的优先级double shu[1000];//存储 "数" 的数组double dai_result;//运算的结果,是为了处理 M 运算(简介函数里有M的定义)int biao = 0;//和dia_result 一样,为了处理 M 运算char line[SIZE];//输入的所要计算的表达式void init()//初始化{ compare[fu[0]] = -2;//用数字的大小表现出符号的优先级 compare[fu[1]] = -1; compare[fu[2]] = 2; compare[fu[3]] = 2; compare[fu[4]] = 4; compare[fu[5]] = 4; compare[fu[6]] = 4; compare[fu[7]] = 5; for(int i = 8; i <= 15; i++) compare[fu[i]] = 6; compare[fu[16]] = 7; S_num.base = (double*)malloc(sizeof(double)*SIZE);//为栈开辟空间 S_char.base = (char*)malloc(sizeof(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_top_char()//得到运算符号的栈中最顶端的运算符号{ return *S_char.top;}3) 整个表达式具体运算程序:double compute() //对整个表达式的计算{ char c; //表示运算符号 int p = 0;//用于shu[++p], 先初始化 int i, j; init();//进行初始化 push_char('\n'); line[strlen(line)] = '\n'; line[strlen(line)+1] = '\0'; if(biao) push_num(dai_result);//把运算的结果先进栈, 在这个结果的基础上继续进行运算 biao = 0; for(i = 0; line[i] != '\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(line[i] == fu[j]) { flag1 = 0; break; } } if(line[i] == '_') { break; } if(line[i] == '.') { i++; ge = 0; biao_dian = 1; } if(line[i] == 'P') { shu[++p] = pi; i++; break; } if(line[i] == 'E') { shu[++p] = e; i++; break; } if(flag1) { h = h * 10 + (line[i] - '0'); flag = 1; i++; if(biao_dian) ge++; } else break; } if(flag) { if(biao_dian) { int r = 1; for(int k = 1; k <= ge; k++) r *= 10; h /= r; } shu[++p] = h;//把转化而来的数字存于数组 } if(line[i] == '+') shu[++p] = -1; else if(line[i] == '-') shu[++p] = -2; else if(line[i] == '*') shu[++p] = -3; else if(line[i] == '/') shu[++p] = -4; else if(line[i] == '%') shu[++p] = -5; else if(line[i] == '^') shu[++p] = -6; else if(line[i] == 'Q') shu[++p] = -7; else if(line[i] == 'L') shu[++p] = -8; else if(line[i] == 'C') shu[++p] = -9; else if(line[i] == 'S') shu[++p] = -10; else if(line[i] == 'T') shu[++p] = -11; else if(line[i] == 'c') shu[++p] = -12; else if(line[i] == 's') shu[++p] = -13; else if(line[i] == 't') shu[++p] = -14; else if(line[i] == '(') shu[++p] = -15; else if(line[i] == ')') shu[++p] = -16; else if(line[i] == '\n') shu[++p] = -17; i++; } i = 1; while(shu[i] != -17 || get_top_char() != '\n') { double m = shu[i]; if(m >= 0) { push_num(m); i++; } else { if(m == -1) c = '+'; else if(m == -2) c = '-'; else if(m == -3) c = '*'; else if(m == -4) c = '/'; else if(m == -5) c = '%'; 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 = '('; else if(m == -16) c = ')'; else if(m == -17) c = '\n'; char ch = get_top_char();//得到最顶端运算符号 if(compare[ch] < compare[c])//运算符号级别的比较 { push_char(c); i++; } else if(ch == '(' && c == ')') { pop_char(); i++; } else if(compare[ch] >= compare[c] && ch != '(' && 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_num(); char dian = pop_char(); push_num(operate_L(two_L, one_L, dian)); } else { double x = pop_num(); double y = pop_num(); char dian = pop_char(); if(dian == '/' && x == 0)//判断是否除了"零" { cout<<"由于您除了零,结果将是错误的"<= 3) return 0; else return 1;}void output(double result)//打出结果{ printf("所得结果是: "); cout<>cc) { if(cc == 'M') { system("cls"); introduce(); printf("您上次所得结果为: "); cout<next = NULL; int i; for(i = 0; line[i] != '\0'; i++)//建立链表 { p = new node; p->data = line[i]; 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; head->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 = -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<<" ***的计算器简要介绍"<

解决策略:通过看书、上网查资料和与同学讨论,自己再反复修改代码,运行程序,直到实际效果满意为止设计难点2:在编译程序时,出现类型不匹配的错误,查找是Cstring和double类型之间没有转换解决策略:查找到Format()和atof()函数可以进行他们之间的转换四、 设计效果与不足之处4.1程序运行结果图(1)计算机主界面:(2)输入表达式计算结果:(3)按M继续输入表达式进行简单计算:关闭计算器:4.2 程序的不足之处:计算器的计算功能还不是很多,设计效果也不是很理想,只能进行简单的运算 五、 参考文献[1] 严华峰. Visual C++课程设计案例精编. 北京:中国水利水电出版社,2002[2] 张宏军,党留群,赵天巨.Visual C++ 6.0编程案例精解.北京:电子工业出版社,2005[3] 郑阿奇,丁有和.Visual C++教程.北京:机械工业出版社,2006六、 课程设计总结经过对VC++课程设计的编写设计,加深了我对《VC++程序设计》课程所学知识的进一步理解,掌握了各种函数的应用和调用这次的课程设计,让我更加了解VC++程序的内部结构和资源使用总之,完成这次课程设计之后,使我更加掌握了编程的基本要素,学会了用编程思想解决生活中的常见问题,用所学知识解决实际问题。

下载提示
相关文档
正为您匹配相似的精品文档