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

如题所述

#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 ) );
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-11-16
给你一个解释器的代码吧
如果要改成图形化的计算器的话需要用到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;
}本回答被网友采纳
第2个回答  2018-12-19
你的这个要求绝对不会有人满足的。因为你的这个要求不只是一个编写一个最简单的计算器问题。
主要是在编写这个程序的过程中,还涉及到了计算机软件专业中的“编译原理”这门课程的其中重要知识。即:表达式的分析与求值(即:何时将相应的数字、以及运算符压入堆栈,何时又需要将相应的数字、以及运算符弹出堆栈)、以及对运算符优先级的处理(例如:括号的最优先最高、乘除法的优先级高于加减法)。
所以说你的这个要求可以说是:至少是一个大作业了。而且了,另外还有一个别的任何人无法满足你的原因就是:对于编写任何程序来说,都是必须要通过自己上机编写程序源代码、编译、链接、通过花费很多的时间和精力去调试,最终才能够得出程序的正确运行结果。
第3个回答  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;
}

}

}
相似回答