求一个用C++编写的计算器程序

我想求一个用C++编写的计算器程序,我在网上找了很久,在百度的“知道”里也找了,在这个吧里也搜索了,但一直没找到合适的,只能请各位大大们帮个忙了。不仅要求用C++编写,而... 我想求一个用C++编写的计算器程序,我在网上找了很久,在百度的“知道”里也找了,在这个吧里也搜索了,但一直没找到合适的,只能请各位大大们帮个忙了。不仅要求用C++编写,而且要用类来写,具体要求如下:

问题描述
设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。
要求:
程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入’=’ 符号后,窗口显示出结果。如果用户输入的表达式不合法,可以判别出来并给出相应的错误提示。
实现提示:
可定义一个计算器类,该类包括两个组件对象,一个计算引擎和一个用户接口,用户接口对象处理接受的键盘输入信息,并显示答案,计算引擎对象对给出的数据执行相应操作,并存储操作的结果。

十分感谢!!!
展开
 我来答
财富创造源泉
2020-05-09 · TA获得超过3793个赞
知道大有可为答主
回答量:3084
采纳率:25%
帮助的人:447万
展开全部
一个二维数组保存
+-*/()
共6个运算符的优先级。
一个堆栈用来接收输入的四则混合运算式,并设置开始结束标志(比如#)
出栈时遇到运算符就检查运算符的优先级来决定是否进行计算。
建议找本数据结构的书看看,会有比较详细的介绍,而且会给出伪代码,根据伪代码来写很容易的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
测开人小江
2007-05-22 · 正在努力工作,开心生活
测开人小江
采纳数:83 获赞数:680

向TA提问 私信TA
展开全部
上面的程序,在最后一行的;号后面多了一个d,
也就是return no_of_errors;d 这句。把d去掉,程序可以运行,不过我没有仔细看代码。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友78cbfd66a
2007-05-10 · TA获得超过171个赞
知道答主
回答量:69
采纳率:0%
帮助的人:0
展开全部
上面给你的那个不行吗?
// The desk calulator

// includes character-level input (sec6.1.3) and
// command line input (sec6.1.7),
// but no namespaces and
// no exceptions

// pp 107-119, sec 6.1, A Desk Calculator

// uses += rather than push_back() for string
// to work around standard library bug

// uses istrstream from <strstream> rather than istringstream from <sstream>
// to work around standard library bug

// No guarantees offered. Constructive comments to bs@research.att.com

/*
program:
END // END is end-of-input
expr_list END

expr_list:
expression PRINT // PRINT is semicolon
expression PRINT expr_list

expression:
expression + term
expression - term
term

term:
term / primary
term * primary
primary

primary:
NUMBER
NAME
NAME = expression
- primary
( expression )
*/

#include <string>
#include <cctype>
#include<iostream>
#include<map>

//#include<sstream> // string streams
#include<strstream> // C-style string streams

using namespace std;

istream* input; // pointer to input stream

int no_of_errors; // note: default initialized to 0

double error(const char* s)
{
no_of_errors++;
cerr << "error: " << s << '\n';
return 1;
}

enum Token_value {
NAME, NUMBER, END,
PLUS='+', MINUS='-', MUL='*', DIV='/',
PRINT=';', ASSIGN='=', LP='(', RP=')'
};

Token_value curr_tok = PRINT;
double number_value;
string string_value;

Token_value get_token()
{
char ch;

do { // skip whitespace except '\en'
if(!input->get(ch)) return curr_tok = END;
} while (ch!='\n' && isspace(ch));

switch (ch) {
case ';':
case '\n':
return curr_tok=PRINT;
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 '.':
input->putback(ch);
*input >> number_value;
return curr_tok=NUMBER;
default: // NAME, NAME=, or error
if (isalpha(ch)) {
string_value = ch;
while (input->get(ch) && isalnum(ch))
string_value += ch; // string_value.push_back(ch);
// to work around library bug
input->putback(ch);
return curr_tok=NAME;
}
error("bad token");
return curr_tok=PRINT;
}
}

map<string,double> table;

double expr(bool); // cannot do without

double prim(bool get) // handle primaries
{
if (get) get_token();

switch (curr_tok) {
case NUMBER: // floating-point constant
{ 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: // unary minus
return -prim(true);
case LP:
{ double e = expr(true);
if (curr_tok != RP) return error(") expected");
get_token(); // eat ')'
return e;
}
default:
return error("primary expected");
}
}

double term(bool get) // multiply and divide
{
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) // add and subtract
{
double left = term(get);

for (;;) // ``forever''
switch (curr_tok) {
case PLUS:
left += term(true);
break;
case MINUS:
left -= term(true);
break;
default:
return left;
}
}

int main(int argc, char* argv[])
{

switch (argc) {
case 1: // read from standard input
input = &cin;
break;
case 2: // read argument string
// input = new istringstream(argv[1]);
input = new istrstream(argv[1]);
break;
default:
error("too many arguments");
return 1;
}

table["pi"] = 3.1415926535897932385; // insert predefined names
table["e"] = 2.7182818284590452354;

while (*input) {
get_token();
if (curr_tok == END) break;
if (curr_tok == PRINT) continue;
cout << expr(false) << '\n';
}

if (input != &cin) delete input;
return no_of_errors;d
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式