如何用c++写一个简单的计算器程序

 我来答
Miafifi
2016-11-16 · TA获得超过451个赞
知道小有建树答主
回答量:277
采纳率:93%
帮助的人:172万
展开全部
#include <cstdio>

int calculator ( const int& a, const int& b, const char& s ) {
switch ( s ) {
case '+' :
return a + b;
case '-' :
return a - b;
case '*' :
return a * b;
case '/' :
if ( b == 0 ) {
puts( "error" ); return 0;
}
return a / b;
case '%' :
return a % b;
default  :
puts( "error" );
return 0;
}
}

int main() {
int val_1 = 0;
int val_2 = 0;
char oprt = NULL;

puts( "equation? " );
scanf( "%d %c %d", &val_1, &oprt, &val_2 );

printf( "ans: %d\n", calculator( val_1, val_2, oprt ) );
}

就烦条0o
2016-11-16 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
给你一个解释器的代码吧
如果要改成图形化的计算器的话需要用到GUI库
代码来自《C++ programming language》

#include<cctype>
#include<iostream>
#include<map>
#include<string>
using namespace std;
enum Token_value{
NAME,NUMBER,END,PLUS='+',MINUS='-',MUL='*',DIV='/',PRINT=';',ASSIGN='=',LP='(',RP=')'
};
Token_value curr_tok=PRINT;
map<string,double> table;
double number_value;
string string_value;
int no_of_errors;
double expr(bool get);
double term(bool get);
double prim(bool get);
Token_value get_token();
double error(const string& s)
{
no_of_errors++;
cerr<<"error:"<<s<<endl;
return 1;
}
Token_value get_token()
{
char ch=0;
cin>>ch;
switch (ch) {
case 0:
return curr_tok=END;
case ';':case '*':case '/':case '+':case '-':case '(':case ')':case '=':
return curr_tok=Token_value(ch);
case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':case '.':
cin.putback(ch);
cin>>number_value;
return curr_tok=NUMBER;
default:
if (isalpha(ch)) {
cin.putback(ch);
cin>>string_value;
return curr_tok=NAME;
}
error("bad token");
return curr_tok=PRINT;
}
}
double prim(bool get)
{
if (get) get_token();
switch (curr_tok) {
case NUMBER:
{ double v=number_value;
get_token();
return v;
}
case NAME:
{ double& v=table[string_value];
if (get_token()==ASSIGN) v=expr(true);
return v;
}
case MINUS:
return -prim(true);
case LP:
{ double e=expr(true);
if (curr_tok!=RP) return error(") expected");
get_token();
return e;
}
default:
return error("primary expected");
}
}
double term(bool get)
{
double left=prim(get);
for (;;)
switch (curr_tok) {
case MUL:
left*=prim(true);
break;
case DIV:
if (double d=prim(true)) {
left/=d;
break;
}
return error("divide by 0");
default:
return left;
}
}
double expr(bool get)
{
double left=term(get);
for(;;)
switch(curr_tok) {
case PLUS:
left+=term(true);
break;
case MINUS:
left-=term(true);
break;
default:
return left;
}
}
int main()
{
table["pi"]=3.1415926535897932385;
table["e"]=2.718284590452354;
while (cin) {
get_token();
if (curr_tok==END) break;
if (curr_tok==PRINT) continue;
cout<<expr(false)<<endl;
}
return no_of_errors;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qzhao_1
2018-12-19 · TA获得超过2.4万个赞
知道大有可为答主
回答量:2.4万
采纳率:76%
帮助的人:4398万
展开全部
你的这个要求绝对不会有人满足的。因为你的这个要求不只是一个编写一个最简单的计算器问题。
主要是在编写这个程序的过程中,还涉及到了计算机软件专业中的“编译原理”这门课程的其中重要知识。即:表达式的分析与求值(即:何时将相应的数字、以及运算符压入堆栈,何时又需要将相应的数字、以及运算符弹出堆栈)、以及对运算符优先级的处理(例如:括号的最优先最高、乘除法的优先级高于加减法)。
所以说你的这个要求可以说是:至少是一个大作业了。而且了,另外还有一个别的任何人无法满足你的原因就是:对于编写任何程序来说,都是必须要通过自己上机编写程序源代码、编译、链接、通过花费很多的时间和精力去调试,最终才能够得出程序的正确运行结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2016-11-16
展开全部
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

void main() {
string leftParStr;
int leftParInt;
int rightParInt;
string rightParStr;
string calculator;

while(true) {
cout << "Number1:";
cin >> leftParStr;

cout << "运算符:";
cin >> calculator;

if(calculator == "exit"){
return;
}

cout << "Number2:";
cin >> rightParStr;

leftParInt = atoi(leftParStr.c_str());
rightParInt = atoi(rightParStr.c_str());

if(calculator == "+") {
cout <<leftParInt + rightParInt << endl;
}else
if(calculator == "-") {
cout << leftParInt - rightParInt << endl;
}else if(calculator == "*") {
cout << leftParInt * rightParInt << endl;
}else if(calculator == "/") {
cout << leftParInt / rightParInt << endl;
}

}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式