一.设计目标

通过MFC应用程序创建基于对话框的简单计算器, 利用设计的按钮控件输入并实现算数表达式的运算(加、减、乘、除及括号),使表达式与运算结果在编辑框中显示,并保存历史记录。

二.算法思想

1、中缀表达式转成后缀表达式

(后缀表达式队列:postQueue,用于存储逆波兰表达式)
(操作符栈:opStack,对用户输入的操作符进行处理,用于存储运算符)

从左向右依次读取算术表达式的元素X,分以下情况进行不同的处理:
(1)如果X是操作数,直接入队
(2)如果X是运算符,再分以下情况:
a)如果栈为空,直接入栈。
b)如果X==”(“,直接入栈。
c)如果X==”)“,则将栈里的元素逐个出栈,并入队到后缀表达式队列中,直到第一个配对的”(”出栈。(注:“(”和“)”都不 入队)
d)如果是其他操作符(+ - * /),则和栈顶元素进行比较优先级。 如果栈顶元素的优先级大于等于X,则出栈并把栈中弹出的元素入队,直到栈顶元素的优先级小于X或者栈为空。弹出完这些元素后,才将遇到的操作符压入到栈中。
(3)最后将栈中剩余的操作符全部入队。

2、后缀表达式的计算

(先准备一个栈Res_Stack,用于存放计算的中间过程的值和最终结果)

(1)从左开始向右遍历后缀表达式的元素。
(2)如果取到的元素是操作数,直接入栈Res_Stack,如果是运算符,从栈中弹出2个数进行运算,然后把运算结果入栈
(3)当遍历完后缀表达式时,计算结果就保存在栈里了。

三.编程环境

Visual Studio 2019

四.图形界面的使用

1.控件的使用

在工具箱中拖动所需要的控件,如按钮和编辑框等,然后右击设置控件属性,例如ID的更改。

多行先显示时,先将Multiline设为true,添加垂直滚动条Vertical scroll。

2.编辑框的内容的获取与显示

(1)使用GetDlgItemText( )和SetDlgItemText( )

void CSimpleCalculatorDlg::OnBnClickedButton1()
{CString cs;GetDlgItemText(IDC_EDIT_DISPLAY, cs);//获取编辑框中的内容SetDlgItemText(IDC_EDIT_DISPLAY, cs + _T("1"));//更新编辑框中的内容
}

(2)为编辑框添加CEdit类型变量edit

void CSimpleCalculatorDlg::OnBnClickedButton1()
{CString cs;edit.GetWindowTextW(cs); //获取编辑框内容cs = cs + _T("1");edit.SetWindowText(cs); //更新编辑框中的内容
}

(3)添加数值型的变量cstr

void CSimpleCalculatorDlg::OnBnClickedButton1()
{UpdateData(true);//获取编辑框中的内容到变量中cstr = cstr + _T("1");UpdateData(false);; //将变量中的值显示到编辑框内
}

五.代码实现

1.头文件部分
#include "pch.h"
#include "framework.h"
#include "Simple Calculator.h"
#include "Simple CalculatorDlg.h"
#include "afxdialogex.h"
#include "queue"
#include "stack"
using namespace std;#ifdef _DEBUG
#define new DEBUG_NEW
#endif
2.全局变量
struct node {double number; //操作数char operat; //操作符bool flag; //操作数true、操作符false
};CString hcs; //历史记录
CString re;    //表达式的结果
char str[100]; //存放中缀表达式的字符串
stack <node> opStack; //存放操作符的栈
queue <node> postQue; //存放后缀表达式
3.中缀表达式转成后缀表达式
void  CSimpleCalculatorDlg::Transition() { //中缀表达式转后缀表达式  node temp;for (int i = 0; i < strlen(str)-1;) { // 逐一扫描中缀表达式if (str[i] >= '0' && str[i] <= '9') {//如果是操作数,flag = falsetemp.flag = true; temp.number = (double)str[i++]-'0'; //读取个位数字while (i <strlen(str)-1 && str[i] >= '0' && str[i] <= '9') {temp.number = temp.number * 10 + str[i++]-'0';} //判断是否有高位数字,并读取postQue.push(temp); //将操作数压入队列}else {temp.flag = false; // 如果是操作符,flag=falseif (opStack.empty()) { //操作符栈为空,直接入栈temp.operat = str[i];opStack.push(temp);}else if (str[i] == '(') //遇到左括号直接入栈{temp.operat = str[i];opStack.push(temp);}else if (str[i] == ')') { //遇到右括号while (opStack.top().operat != '(') {postQue.push(opStack.top());opStack.pop();}opStack.pop();}else {while (!opStack.empty() && Priority(str[i]) <= Priority(opStack.top().operat)) {postQue.push(opStack.top());opStack.pop();} //若当前操作符优先级小于等于栈顶操作符,则将栈顶操作符压入队列中temp.operat = str[i];opStack.push(temp);}i++;}}while (!opStack.empty()) { //所有操作数入队列后,将栈中剩余操作符压入队列postQue.push(opStack.top());opStack.pop();}
}
4.计算后缀表达式
int  CSimpleCalculatorDlg::Priority(char op)  //定义运算符优先级
{switch (op){case'(':return 0;case '+':case '-':return 1;case '*':case '/':return 2;}
}
void CSimpleCalculatorDlg::Calculator() {double temp1, temp2;node curr, temp;while (!postQue.empty()) {curr = postQue.front(); //记录队列首元素postQue.pop();if (curr.flag == true) opStack.push(curr); //如果是操作数,压入栈中else { //如果是操作符temp2 = opStack.top().number; //先弹出第二个操作数opStack.pop();temp1 = opStack.top().number; //后弹出第一个opStack.pop();temp.flag = true; // 临时的node表示操作数,使用node是为了计算后,将临时数值结果压入栈中if (curr.operat == '+') {temp.number = temp1 + temp2;}else if (curr.operat == '-') {temp.number = temp1 - temp2;}else if (curr.operat == '*') {temp.number = temp1 * temp2;}else if(temp2!=0){temp.number = temp1 / temp2;//定义加减乘除操作}opStack.push(temp); //将临时结果压入栈中}}double result = opStack.top().number; //返回栈中仅有的元素,即最终结果re.Format(_T("%lf"), result);opStack.pop();
}
5.按钮选择在编辑框中的显示
void CSimpleCalculatorDlg::OnBnClickedButton1()//数字0~9以及运算符的类似
{// TODO: 在此添加控件通知处理程序代码CString cs;GetDlgItemText(IDC_EDIT_DISPLAY, cs);//获取编辑框中的内容SetDlgItemText(IDC_EDIT_DISPLAY, cs + _T("1"));//更新编辑框中的内容
}
void CSimpleCalculatorDlg::OnBnClickedButtonBackspace()//后退
{// TODO: 在此添加控件通知处理程序代码CString cs;GetDlgItemText(IDC_EDIT_DISPLAY, cs);cs.Delete(cs.GetLength()-1);SetDlgItemText(IDC_EDIT_DISPLAY, cs);
}
void CSimpleCalculatorDlg::OnBnClickedButtonClear()//清零
{// TODO: 在此添加控件通知处理程序代码SetDlgItemText(IDC_EDIT_DISPLAY, _T(""));re = _T("");
//  for(int i=0;i<strlen(str);i++){//      str[i] = 0;
//  }
}
void CSimpleCalculatorDlg::OnBnClickedButtonEqual()//算术表达式的结果显示及历史记录的保存
{// TODO: 在此添加控件通知处理程序代码CString cs;CString cs1;GetDlgItemText(IDC_EDIT_DISPLAY, cs);int i;for ( i = 0; i < cs.GetLength(); i++) {str[i] = cs[i];}str[i] = '/0';Transition();Calculator();SetDlgItemText(IDC_EDIT_DISPLAY, cs + _T("=") + re);GetDlgItemText(IDC_EDIT_DISPLAY, cs1);
//  if (hcs.IsEmpty()) {//最新的历史记录在底部
//      hcs = hcs + cs1;
//  }
//  else {//      hcs = hcs + "\r\n" + cs1;
//  }hcs = cs1 + "\r\n" + hcs; //最新的历史记录在顶部
}
void CSimpleCalculatorDlg::OnBnClickedButtonHistory()
{// TODO: 在此添加控件通知处理程序代码//edit.SetWindowText(hcs);SetDlgItemText(IDC_EDIT_DISPLAY, hcs);
}

六.调试结果

1.表达式的计算(计算结果为double类型)

2历史记录的显示

七.总结

以上只能实现整数的混合四则运算,小数运算以及三角函数的运算、对数运算、指数运算、进制转换等还有待进一步的完善。

课程设计:简单计算器的实现相关推荐

  1. 编译原理公式计算器C语言,编译原理课程设计-简单计算器实现.doc

    编译原理课程设计-简单计算器实现 课程设计报告课程:编译原理学号:姓名:班级:11级嵌入式应用技术班教师:时间:2014年6月计算机科学与技术系 设计名称:简单计算器的实现设计内容.目的与要求:设计内 ...

  2. java课程设计简单计算器_JAVA课程设计--简易计算器(201521123022 黄俊麟)

    1.团队课程设计博客链接 2.个人负责模板或任务说明 1.初始化业务逻辑. 2.开方.正负.清零.退格.数字内容输入拼接,输出结果的实现. 3.四则运算算法的实现. 4.每个按钮返回对应的业务(每个按 ...

  3. c语言课程设计计算器程序分析,c语言课程设计简单计算器程序..docx

    课程设计名称:C语言课程设计 课程设计题目: 简单计算器程序 TOC \o "1-5" \h \z \o "Current Document" 第1章需求分析1 ...

  4. c语言课程设计计算器软件,C语言课程设计简单计算器程序.docx

    课程设计名称: C 语言课程设计课程设计题目: 简单计算器程序 目录 第1章 需求分析 0 设计要求 0 任务 0 第2章 总体设计 1 TOC \o "1-5" \h \z \o ...

  5. 代分数计算机气在线,c++课程设计--分数计算器.doc

    c课程设计--分数计算器 C++课程设计报告 题 目: 分数计算器 年 级: 11级 专 业: 通信工程 姓 名: 吴辰炜 指导老师: 朱红 难 度 B 级 教师评语: 1.程序功能介绍 分数计算器及 ...

  6. 使用Ext Designer 设计简单计算器

    使用ExtDesigner 设计简单计算器   一,   设计思想. 计算器的设计主要功能是使用,做出来的计算器要能简单的计算加减乘除法的运算,清除复位功能.分析计算器用ExtDesigner设计需要 ...

  7. 计算机网络课程设计小程序,网络课程设计(简单聊天系统的设计与实现).doc

    网络课程设计(简单聊天系统的设计与实现) 简单聊天程序的设计与实现 摘 要 本课程设计主要是设计并实现一个简单的聊天程序,该聊天程序能够支持多人聊天,聊天的内容可以仅仅支持文本信息,聊天程序包括服务器 ...

  8. 网站课程设计(简单线上购物商城)

    网站课程设计(简单线上购物商城) 1.开发环境 ​ VS2019,SQL2012,ASP.NET开发 2.项目主题 ​ ​ ​ ​ ​ ​ ​ 刚好完成了网站的课程设计,觉得该好好纪念一下((✪ω✪) ...

  9. 计算器 毕业论文java_Java课程设计报告 计算器

    文件大小:337.00KB 适用专业:Java 适用年级:大学 论文编号:37422 论文简介: Java课程设计报告 计算器,共22页,3333字. 目 录 目 录I 1需求分析1 1.1计算器的基 ...

  10. java计算机设计总结,java课程设计报告--计算器设计

    java课程设计报告--计算器设计 1 课 程 Java 程序设计 题 目 计算器设计 年 级 2010 级 专 业 信息一班 学 号 姓 名 组 员 指导教师 课程设计题目计算器设计 2 课程设计论 ...

最新文章

  1. python中若干关于类的问题
  2. analyze table tablename
  3. jQuery --- grep
  4. 远程访问数据库出错的解决办法
  5. 巧用Notepad++代码粘贴功能
  6. oracle清空回收站指定表,清空Oracle 10g回收站中以BIN$开头的表
  7. 中职计算机课程授课类型,中职计算机课程「任务引领型」教学方法初探
  8. ubuntu 12.04 修改 grub 启动参数
  9. 16比9尺寸是多少厘米_16:9是多大的尺寸?
  10. matlab 效度,量表的信度、效度检验方法小结
  11. 致翔OA漏洞复现手册
  12. 大数据常见面试题总结,有问必答
  13. ERP发货系统的修改(四十三)
  14. Win10 DirectX 8.1 安装与启用
  15. NGUI动态字体教程
  16. 骨传导耳机排名前十名,列举排行靠前的几款骨感耳机
  17. 在线笔试神器~福利哟
  18. android 7.0关机动画,Android 修改系统关机动画的实现
  19. c语言程序转python_使用f2py将C语言的函数转换为python模块
  20. DAU ARPU 美术

热门文章

  1. MacPS安装服务器当前无响应,最新:M1芯片Mac安装Photoshop2021闪退/卡在启动屏页解决办法...
  2. 波兰表达式(Polish Notation)简要介绍
  3. html5微信自动播放视频,科技常识:HTML5页面音视频在微信和app下自动播放的实现方法...
  4. 场景拆解六步设计法,手把手教你细化场景
  5. Python第三次(下)
  6. java中国象棋网络对弈_基于JAVA的中国象棋对弈系统(附答辩记录)
  7. LCD12864液晶显示模块的使用与分析
  8. 工具教程第三十一讲:电报的使用(二)
  9. 《C++ Primer》第9章 9.3节习题答案
  10. 技术团队人员管理:组建团队的方式