// Project1.cpp: 定义控制台应用程序的入口点。
//
/*
表达式:
项目
项目“+”表达式
项目“-”表达式
项目:
优先度
项目“*”优先级
项目“/”优先级
项目“%”优先级
优先级:
“(”表达式“)”
数字
数字:
double型
*/
#include "stdafx.h"
#include<iostream>
#include<string.h>
#include<vector>
#include<cmath>
using namespace std;
double primary();
double term();
class token
{ /*kind用来存储类别,如果是数字kind则为字符0,如果是符号,kind存储这个符号
如果是数字,n就储存这个数字
*/
public:
char kind;
double n;
};
vector<token>tok;
const char SignNum = '8';//用来标识数字
class token_stream
{
/*full用来显示数据流中是否还存在数据,如果有full=true,buffer用来存储把数据返回的值*/
public:
bool full;
token buffer;
token get();//用来从数据流中得到数据
void putback(token t);//把这个数据返回到数据流中
};
void token_stream::putback(token t)
{
buffer = t;
full = true;
}
token token_stream::get()
{
if (full)
{/*如果数据流里面堵塞了,就拿出buffer并且把full返回成false*/
full = false;
return buffer;
}
char temp;
cin >> temp;
switch (temp)
{
case'q':case'Q':
return token{ temp };
case'=':
return token{ temp };
case'(':case')':
case'+':case'-':case'*': case'/':case'%':
return token{ temp };
case'.':
case'0':case'1':case'2':case'3':case'4':
case'5':case'6':case'7':case'8':case'9':
{
cin.putback(temp);
double val;
cin >> val;
return token{ SignNum,val };
}
default:
cout << "错误:输入了未知的符号!!!" << endl;
break;
}
}
token_stream ts;
double expression()
{
double left = term();
token t = ts.get();
while (true)
{
switch (t.kind)
{
case'+':
left+=term();
t = ts.get();
break;
case'-':
left -= term();
t = ts.get();
break;
default:
ts.putback(t);
return left;
}
}
}
double term()
{
double left = primary();
token t = ts.get();
while (true)
{
switch (t.kind)
{
case'*':
left *= primary();
t = ts.get();
break;
case'/':
{
double d = primary();
if (d == 0)
{
cout << "错误:除数为0,无法进行计算!!" << endl;;
}
else
{
left /= d;
t = ts.get();
break;
}
}
case'%':
{
double d = primary();
if (d == 0)
cout << "错误:除数为0" << endl;
left = fmod(left, d);//标准数据库cmath里面的函数,用来取余数运算
t = ts.get();
break;
}
default:
ts.putback(t);
return left;
}
}
}
double primary()
{
token t = ts.get();
switch (t.kind)
{
case'(':
{
double d = expression();
t = ts.get();
if (t.kind!=')')
cout << "错误:公式未正确!!" << endl;
return d;
}
case'8':
return t.n;
case'-':
return -primary();
case'+':
return +primary();
default:
cout << "错误:公式未正确!请检查公式!" << endl;
break;
}
}
const char quit = 'q';//代表退出这个程序
const char quit1 = 'Q';
int main()
{
cout << "按下q键退出计算" << endl;
double val=0;
cout << "输入表达式:";
while (cin)
{
token t = ts.get();
while (t.kind == '=')
t = ts.get();
if (t.kind == quit||t.kind==quit1)
{
return 0;
}
ts.putback(t);
cout << "结果为:" << expression() << endl;
}
return 0;
}
200行的简易计算器(黑窗口)
最新推荐文章于 2020-12-14 09:00:37 发布