⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex.cpp

📁 可编程计算器
💻 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 + -