求一个用C++编写的计算器程序
我想求一个用C++编写的计算器程序,我在网上找了很久,在百度的“知道”里也找了,在这个吧里也搜索了,但一直没找到合适的,只能请各位大大们帮个忙了。不仅要求用C++编写,而...
我想求一个用C++编写的计算器程序,我在网上找了很久,在百度的“知道”里也找了,在这个吧里也搜索了,但一直没找到合适的,只能请各位大大们帮个忙了。不仅要求用C++编写,而且要用类来写,具体要求如下:
问题描述
设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。
要求:
程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入’=’ 符号后,窗口显示出结果。如果用户输入的表达式不合法,可以判别出来并给出相应的错误提示。
实现提示:
可定义一个计算器类,该类包括两个组件对象,一个计算引擎和一个用户接口,用户接口对象处理接受的键盘输入信息,并显示答案,计算引擎对象对给出的数据执行相应操作,并存储操作的结果。
十分感谢!!! 展开
问题描述
设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。
要求:
程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入’=’ 符号后,窗口显示出结果。如果用户输入的表达式不合法,可以判别出来并给出相应的错误提示。
实现提示:
可定义一个计算器类,该类包括两个组件对象,一个计算引擎和一个用户接口,用户接口对象处理接受的键盘输入信息,并显示答案,计算引擎对象对给出的数据执行相应操作,并存储操作的结果。
十分感谢!!! 展开
3个回答
展开全部
一个二维数组保存
+-*/()
共6个运算符的优先级。
一个堆栈用来接收输入的四则混合运算式,并设置开始结束标志(比如#)
出栈时遇到运算符就检查运算符的优先级来决定是否进行计算。
建议找本数据结构的书看看,会有比较详细的介绍,而且会给出伪代码,根据伪代码来写很容易的。
+-*/()
共6个运算符的优先级。
一个堆栈用来接收输入的四则混合运算式,并设置开始结束标志(比如#)
出栈时遇到运算符就检查运算符的优先级来决定是否进行计算。
建议找本数据结构的书看看,会有比较详细的介绍,而且会给出伪代码,根据伪代码来写很容易的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
上面的程序,在最后一行的;号后面多了一个d,
也就是return no_of_errors;d 这句。把d去掉,程序可以运行,不过我没有仔细看代码。
也就是return no_of_errors;d 这句。把d去掉,程序可以运行,不过我没有仔细看代码。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
上面给你的那个不行吗?
// 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
}
// 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
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询