#include <iostream>
#include <map>
#include <string>
#include <cctype>
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 error(const string &s)
{
no_of_errors++;
cerr<<"error: "<<s<<endl;
return 1;
}
Token_value get_token() //取字符
{
char ch;
do {
if(!cin.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 '.':
{
cin.putback(ch);
cin>>number_value;
return curr_tok = NUMBER;
}
default:
{
if(isalpha(ch)) {
string_value = ch;
while(cin.get(ch) && isalnum(ch)) string_value += ch;
cin.putback(ch);
return curr_tok = NAME;
}
error("bad token");
return curr_tok = PRINT;
}
}
}
double expr(bool get); //加和减
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.7182818284590452354;
cout<<"please input your string to calculator:"<<endl;
while(cin) {
get_token();
if(curr_tok == END) break;
if(curr_tok == PRINT) continue;
cout<<expr(false)<<endl<<"please input your string to calculator:"<<endl;
}
return no_of_errors;
}
C++发明者编写的C++计算器源码
5星 · 超过95%的资源 需积分: 10 93 浏览量
2011-08-24
14:43:25
上传
评论 1
收藏 1MB RAR 举报
c916734374
- 粉丝: 0
- 资源: 5
最新资源
- 全卷积网络基于voc2012数据集简单pytorch实现
- pycharm的一些介绍-用于更好的学习python
- 基于C++的程序设计大赛天梯赛L2答案(天梯赛)
- 基于python实现的三次样条插值和均值插值法实现
- Python语言教程2-python批量图片大小处理-多文件夹
- Python语言教程1-python批量图片重命名,将后缀某几个不想要的字去除
- Space Combat Kit 太空战斗套件Unity游戏开发插件资源unitypackage C#
- Universal Device Preview 通用设备预览Unity游戏开发插件资源unitypackage
- Paladin Anim Set 圣骑士动画集Unity游戏动作动画插件资源unitypackage
- 计算机财务管理期末考报表部分题目及答案.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈