📄 ex.cpp
字号:
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include <stdio.h>
#include <string>
#include <windows.h>
using namespace std;
struct data
{
bool m_type;
int m_data;
};
enum RELATION{ BIG,LIT,EQU,WRO };
vector<data> vec;
RELATION Precede( char v0,char v1 )
{
switch( v0 )
{
case '+':
{
switch( v1 )
{
case '+':
{
return BIG;
}break;
case '-':
{
return BIG;
}break;
case '*':
{
return LIT;
}break;
case '/':
{
return LIT;
}break;
case '(':
{
return LIT;
}break;
case ')':
{
return BIG;
}break;
case '#':
{
return BIG;
}break;
}
}break;
case '-':
{
switch( v1 )
{
case '+':
{
return BIG;
}break;
case '-':
{
return BIG;
}break;
case '*':
{
return LIT;
}break;
case '/':
{
return LIT;
}break;
case '(':
{
return LIT;
}break;
case ')':
{
return BIG;
}break;
case '#':
{
return BIG;
}break;
}
}break;
case '*':
{
switch( v1 )
{
case '+':
{
return BIG;
}break;
case '-':
{
return BIG;
}break;
case '*':
{
return BIG;
}break;
case '/':
{
return BIG;
}break;
case '(':
{
return LIT;
}break;
case ')':
{
return BIG;
}break;
case '#':
{
return BIG;
}break;
}
}break;
case '/':
{
switch( v1 )
{
case '+':
{
return BIG;
}break;
case '-':
{
return BIG;
}break;
case '*':
{
return BIG;
}break;
case '/':
{
return BIG;
}break;
case '(':
{
return LIT;
}break;
case ')':
{
return BIG;
}break;
case '#':
{
return BIG;
}break;
}
}break;
case '(':
{
switch( v1 )
{
case '+':
{
return LIT;
}break;
case '-':
{
return LIT;
}break;
case '*':
{
return LIT;
}break;
case '/':
{
return LIT;
}break;
case '(':
{
return LIT;
}break;
case ')':
{
return EQU;
}break;
case '#':
{
return WRO;
}break;
}
}break;
case ')':
{
switch( v1 )
{
case '+':
{
return BIG;
}break;
case '-':
{
return BIG;
}break;
case '*':
{
return BIG;
}break;
case '/':
{
return BIG;
}break;
case '(':
{
return WRO;
}break;
case ')':
{
return BIG;
}break;
case '#':
{
return BIG;
}break;
}
}break;
case '#':
{
switch( v1 )
{
case '+':
{
return LIT;
}break;
case '-':
{
return LIT;
}break;
case '*':
{
return LIT;
}break;
case '/':
{
return LIT;
}break;
case '(':
{
return LIT;
}break;
case ')':
{
return WRO;
}break;
case '#':
{
return EQU;
}break;
}
}break;
}
}
float Operate( float a,char theta,float b )
{
switch( theta )
{
case '+':
{
return a + b;
}break;
case '-':
{
return a - b;
}break;
case '*':
{
return a * b;
}break;
case '/':
{
return a / b;
}break;
}
}
bool In( char c )
{
switch( c )
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':
return true;
default:
return false;
}
}
vector< char > OPTR;
vector< float > OPND;
/*
void EvaluateExpression( float& result )
{
OPTR.push_back( '#' );
char c = getchar();
while( c != '#' || OPTR.back() != '#' )
{
if( !In( c ) )
{
OPND.push_back( c - '0' );
c = getchar();
}
else
{
switch( Precede( OPTR.back(),c ) )
{
case LIT:
{
OPTR.push_back( c );
c = getchar();
}break;
case EQU:
{
char x;
x = OPTR.back();
OPTR.pop_back();
c = getchar();
}break;
case BIG:
{
char theta;
float a,b;
theta = OPTR.back();
OPTR.pop_back();
b = OPND.back();
OPND.pop_back();
a = OPND.back();
OPND.pop_back();
OPND.push_back( Operate( a,theta,b ) );
}break;
}
}
}
result = OPND.front();
}*/
int i = 0;
bool flag = true;
int getdata()
{
float r = vec[i].m_data;
if( i < vec.size() )
{
i++;
}
return r;
}
void EvaluateExpression( float& result )
{
OPTR.push_back( '#' );
int c = getdata();
while( (char)c != '#' || OPTR.back() != '#' )
{
if( !In( (char)c ) )
{
OPND.push_back( c - '0' );
c = getdata();
}
else
{
switch( Precede( OPTR.back(),(char)c ) )
{
case LIT:
{
OPTR.push_back( (char)c );
c = getdata();
}break;
case EQU:
{
char x;
x = OPTR.back();
OPTR.pop_back();
c = getdata();
}break;
case BIG:
{
char theta;
float a,b;
theta = OPTR.back();
OPTR.pop_back();
b = OPND.back();
OPND.pop_back();
a = OPND.back();
OPND.pop_back();
OPND.push_back( Operate( a,theta,b ) );
}break;
case WRO:
{
MessageBox( 0,"表达式错误",0,0 );
flag = false;
return;
}break;
}
}
}
result = OPND.front();
}
int StrToInt( string str );
void Change( string str )
{
string num;
for( int i = 0 ; i < str.size() ; i ++ )
{
switch( str[i] )
{
case '+':
{
data d;
d.m_type = false;
d.m_data = '+';
vec.push_back( d );
}break;
case '-':
{
data d;
d.m_type = false;
d.m_data = '-';
vec.push_back( d );
}break;
case '*':
{
data d;
d.m_type = false;
d.m_data = '*';
vec.push_back( d );
}break;
case '/':
{
data d;
d.m_type = false;
d.m_data = '/';
vec.push_back( d );
}break;
case '(':
{
data d;
d.m_type = false;
d.m_data = '(';
vec.push_back( d );
}break;
case ')':
{
data d;
d.m_type = false;
d.m_data = ')';
vec.push_back( d );
}break;
case '#':
{
data d;
d.m_type = false;
d.m_data = '#';
vec.push_back( d );
}break;
default:
{
while( isdigit( str[i]) )
{
num += str[i];
i++;
}
i--;
data d;
d.m_type = true;
d.m_data = StrToInt( num ) + '0';
vec.push_back( d );
num = "";
}break;
}
}
}
int StrToInt( string str )
{
float num = 0;
float size = str.size();
for( int i = 0 ; i < size ; i ++ )
{
float c = str[i] - '0';
num += c * pow( (float)10,( size - i - 1 ) );
}
return num;
}
string IntToStr( float a )
{
float n;
int m;
n = modf( a,(float*)&m );
string r;
while( m % 10 > 1 )
{
int a = m % 10;
r += a;
m/=10;
}
int b = 0;
r += '.';
while( b < 5 )
{
int c = n * 10;
r += c;
n *= 10;
n -= c;
}
return r;
}
string _ToString( int data )
{
string s;
if( data>= 0 )
{
int t = data;
int len = 0;
while( t >= 1 )
{
t /= 10;
len ++;
}
vector<int> n;
for( int i = 0 ; i < len ; i ++ )
{
int m = data%10;
data /= 10;
n.push_back( m + '0' );
}
for( int i = n.size()-1 ; i >= 0 ; i -- )
{
s += n[i];
}
}
return s;
}
string ToString( int data )
{
string s;
if( data >= 0 )
{
return _ToString( data );
}
else
{
s = "-";
s += _ToString( -data );
return s;
}
}
void main( string& s,string& v )
{
float result = 1234;
try{
Change( s );
EvaluateExpression( result );
if( flag )
{
v=ToString(result);
}
else
{
v.clear();
s.clear();
}
}catch(...)
{
MessageBox( 0,"输入有误",0,0 );
}
flag = true;
i = 0;
vec.clear();
OPTR.clear();
OPND.clear();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -