【大学课程设计】计算器实现(附源码)
创始人
2024-04-07 16:58:00

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、整体思路

二、思路解析

2.1 类设计

2.2 界面设计

2.3 表达式计算

三、计算器源码

四、总结


本篇文章使用 C++ 实现了一个简单的计算器,支持基本运算加减乘除,下面来详细讲解下 C++ 计算器的制作过程!

首先,先来看一下效果图:

图1 计算器动图演示

一、整体思路

整体的设计包含两个部分:界面的设计和表达式的计算。设计流程图如下所示:

图2 计算器流程图

二、思路解析

2.1 类设计

计算器类的设计如下所示:

/*** C++ 整数计算器*/
class SimpleCalculator {public:SimpleCalculator() {m['+'] = 1;m['-'] = 1;m['*'] = 2;m['/'] = 2;m['('] = 0;error = false;}//初始化操作void init() {system("chcp  65001"); //语言支持system("mode con cols=90 lines=30");//设置终端大小system("cls");}int calaulator();  //计算表达式int solve(int x,int y,char c);void hideCursor(); //隐藏光标void getCoord(int x, int y); //光标重定位,用于在光标处输出void color(int a);  //设置颜色void menu();bool isLegal(char ch);void printEdge();private:string expStr;bool error;stack s1;   //存储数字stack s2;   //存储符号map m;  //定义符号优先级
};

2.2 界面设计

界面的设计主要是主菜单的输出,实现如下所示:

//菜单
void SimpleCalculator::menu() {system("cls"); //清屏hideCursor();while(true) {system("cls"); //清屏printEdge();getCoord(55, 5); color(6); cout<<"计 算 器"; color(7);getCoord(28, 22); color(2); cout<<"说明:清除表达式请按 c 或 enter "; color(7);getCoord(28, 16); color(9); cout<<"计 算 结 果 :"; color(7);getCoord(28, 12); color(9); cout<<"请输入表达式:"; color(7);cin>>expStr;int ans = calaulator();if (!error) {getCoord(28, 16); color(9); cout<<"计 算 结 果 :"; color(7); cout<<"表达式错误!"; color(7);} else {getCoord(28, 16); color(9); cout<<"计 算 结 果 :"; color(7); cout<

2.3 表达式计算

输入表达式的计算通过使用两个栈,一个存储数字,一个存储字符,如下所示:

//计算表达式
int SimpleCalculator::calaulator() {int len = expStr.size();int i = 0;error = true;while (i < len) {if (!isLegal(expStr[i])) {error = false;return -1;}if(expStr[i] >= '0' && expStr[i] <= '9') { // 如果是数字int num = 0;while (expStr[i] >= '0' && expStr[i] <= '9'){num = num * 10 + expStr[i] -'0';i++;}s1.push(num);} else {if (expStr[i] == '('){s2.push(expStr[i]);} else if (expStr[i] == ')') {if(!s2.size()) {error = false;return -1;}while (s2.top() != '(') {char ch = s2.top();s2.pop();if(!s1.size()) {error = false;return -1;}int x = s1.top();s1.pop();if(!s1.size()) {error = false;return -1;}int y = s1.top();s1.pop();s1.push(solve(y, x, ch));}s2.pop();} else {while(s2.size() && m[s2.top()] >= m[expStr[i]]){char ch = s2.top();s2.pop();if(!s1.size()) {error = false;return -1;}int x = s1.top();s1.pop();if(!s1.size()) {error = false;return -1;}int y = s1.top();s1.pop();s1.push(solve(y, x, ch));}s2.push(expStr[i]);}i++;}}//判断是否还有剩余的表达式while (s2.size()){char ch = s2.top();s2.pop();if(!s1.size()) {error = false;return -1;}int x = s1.top();s1.pop();if(!s1.size()) {error = false;return -1;}int y = s1.top();s1.pop();s1.push(solve(y, x, ch));}if (s2.size()) {error = false;}return s2.size() ? -1 : s1.top();
}

主要原理是通过两个栈,一个存储数字,一个存储字符,根据运算符优先级模拟表达式的计算,最后注意查看栈中是否还有剩余的表达式。

如果表达式正确,返回表达式计算的值,否则返回 -1。 

三、计算器源码

下面是C++计算器源码实现,如下所示:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;/*** C++ 整数计算器*/
class SimpleCalculator {public:SimpleCalculator() {m['+'] = 1;m['-'] = 1;m['*'] = 2;m['/'] = 2;m['('] = 0;error = false;}//初始化操作void init() {system("chcp  65001"); //语言支持system("mode con cols=90 lines=30");//设置终端大小system("cls");}int calaulator();  //计算表达式int solve(int x,int y,char c);void hideCursor(); //隐藏光标void getCoord(int x, int y); //光标重定位,用于在光标处输出void color(int a);  //设置颜色void menu();bool isLegal(char ch);void printEdge();private:string expStr;bool error;stack s1;   //存储数字stack s2;   //存储符号map m;  //定义符号优先级
};//设置颜色
void SimpleCalculator::color(int a)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}//光标重定位,用于在光标处输出
void SimpleCalculator::getCoord(int x, int y)
{COORD pos = { x,y };SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}//隐藏光标
void SimpleCalculator::hideCursor()
{CONSOLE_CURSOR_INFO cursor= { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);
}//进行计算
int SimpleCalculator::solve(int x, int y, char c){int ret = 0;if (c == '*') {ret = x*y;} else if (c == '/'){ret = x/y;} else if (c == '+'){ret = x+y;} else if (c == '-'){ret = x-y;}return ret;
}//判断字符是否合法
bool SimpleCalculator::isLegal(char ch) {if (ch >= '0' && ch <= '9') {return true;}if (ch == '*' || ch == '/' || ch == '+' || ch == '-') {return true;}if (ch == '(' || ch == ')') {return true;}return false;
}//计算表达式
int SimpleCalculator::calaulator() {int len = expStr.size();int i = 0;error = true;while (i < len) {if (!isLegal(expStr[i])) {error = false;return -1;}if(expStr[i] >= '0' && expStr[i] <= '9') { // 如果是数字int num = 0;while (expStr[i] >= '0' && expStr[i] <= '9'){num = num * 10 + expStr[i] -'0';i++;}s1.push(num);} else {if (expStr[i] == '('){s2.push(expStr[i]);} else if (expStr[i] == ')') {if(!s2.size()) {error = false;return -1;}while (s2.top() != '(') {char ch = s2.top();s2.pop();if(!s1.size()) {error = false;return -1;}int x = s1.top();s1.pop();if(!s1.size()) {error = false;return -1;}int y = s1.top();s1.pop();s1.push(solve(y, x, ch));}s2.pop();} else {while(s2.size() && m[s2.top()] >= m[expStr[i]]){char ch = s2.top();s2.pop();if(!s1.size()) {error = false;return -1;}int x = s1.top();s1.pop();if(!s1.size()) {error = false;return -1;}int y = s1.top();s1.pop();s1.push(solve(y, x, ch));}s2.push(expStr[i]);}i++;}}//判断是否还有剩余的表达式while (s2.size()){char ch = s2.top();s2.pop();if(!s1.size()) {error = false;return -1;}int x = s1.top();s1.pop();if(!s1.size()) {error = false;return -1;}int y = s1.top();s1.pop();s1.push(solve(y, x, ch));}if (s2.size()) {error = false;}return s2.size() ? -1 : s1.top();
}//打印边框
void SimpleCalculator::printEdge() {int x = 10, y = 2;for(int i = x; i <= 110; ++i) {getCoord(i, y); color(4); cout<<"=";}x = 10, y = 28;for(int i = x; i <= 110; ++i) {getCoord(i, y); color(4); cout<<"=";}x = 10, y = 3;for(int i = y; i <= 27; ++i) {getCoord(x, i); color(4); cout<<"||";}x = 109, y = 3;for(int i = y; i <= 27; ++i) {getCoord(x, i); color(4); cout<<"||";}
}//菜单
void SimpleCalculator::menu() {system("cls"); //清屏hideCursor();while(true) {system("cls"); //清屏printEdge();getCoord(55, 5); color(6); cout<<"计 算 器"; color(7);getCoord(28, 22); color(2); cout<<"说明:清除表达式请按 c 或 enter "; color(7);getCoord(28, 16); color(9); cout<<"计 算 结 果 :"; color(7);getCoord(28, 12); color(9); cout<<"请输入表达式:"; color(7);cin>>expStr;int ans = calaulator();if (!error) {getCoord(28, 16); color(9); cout<<"计 算 结 果 :"; color(7); cout<<"表达式错误!"; color(7);} else {getCoord(28, 16); color(9); cout<<"计 算 结 果 :"; color(7); cout<

四、总结

计算器的实现的重点在输入表达式的计算,通过两个栈,一个存储字符,一个存储输入的数字,实现了对表达式的计算。

⭐优质专栏推荐⭐

 数据结构和算法成神路【精讲】

C/C++面试通关【精讲】

 Linux技术和原理 


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...