// Expression.cpp : main project file.
// 表达式计算+-*/四则运算,只有整数,没有括号,可以有空格。
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
class Expression
{
public:
char * expr; //表达式字符串
char * ex; //正在转换的字符
char error[100]; //错误信息
double result; //计算结果
double list[22]; //最多个+-号,*号/号不限
//构造函数
Expression( char * e )
{
ex = expr = e;
*error = 0;
}
//计算, 如果成功,返回空字符串,结果保存在result中,否则返回错误信息。
char * Calculat()
{
// 第一步:把字符串转换成数字,运算符也转换成数字,存入list[21]中
double a1 = Convert(); // 取第一个数
int sy; //运算符
int i = 0;
while( (i < 22) && !*error && ((sy=Symbols()) > 0) ) // 如果错误或结尾,停止
{
double a2 = Convert();
if( sy == 3 ) // 乘除法先算出来。
a1 *= a2;
else if( sy == 4 )
a1 /= a2;
else
{
list[i++] = a1;
list[i++] = sy;
a1 = a2;
}
}
if( i == 22 ) // +/- 号太多
return "The symbols of +/- more then 10.";
if( *error ) // 其它错误
return error;
list[i++] = a1; //存最后一个数
//第二部,计算加减法
result = list[0];
for( int j = 1; j < i; j++ )
{
if( list[j++] == 1 )
result += list[j];
else
result -= list[j];
}
return "";
}
//转换一个数,返回浮点型,便于除法计算。
double Convert()
{
for( ; *ex == ' '; ex++ ); //去掉空格
char * p = ex;
for( ; (*ex >= '0') && (*ex <= '9'); ex++ ); //所有数字
if( p == ex ) //错误
{
sprintf( error, "Error at %d", ex - expr );
return 0;
}
return atoi( p );
}
int Symbols()
{
for( ; *ex == ' '; ex++ ); //去掉空格
char c = *ex++;
if( c == '+' )
return 1;
else if( c == '-' )
return 2;
else if( c == '*' )
return 3;
else if( c == '/' )
return 4;
else if( c == 0 ) //结尾
return 0;
else // 错误
{
sprintf( error, "Error at %d", ex - expr );
return -1;
}
}
};
int main()
{
char buffer[81]; // 保存输入的表达式,最多输入个字符。
int i = 0, ch;
printf( "/n" );
while(true)
{
printf( "Expression: " );
for (i = 0; (i < 80) && ((ch = getchar()) != EOF)
&& (ch != '/n'); i++)
{
buffer[i] = (char) ch;
}
if( (*buffer == 'q') || (*buffer == 'Q') )
break;
if( !i )
printf( "/nPlease enter the expression./n");
else if( i >= 80 )
{
printf( "/nThe expression length more then 80./n");
for (i = 0; ((ch = getchar()) != EOF) && (ch != '/n'); i++); //取完多余的字符
}
else
{
buffer[i] = 0; //加上结尾符
Expression exp( buffer );
char * err = exp.Calculat();
if( *err )
{
printf( err );
printf( "/n/n" );
}
else
{
printf( "The result is %g/n/nPress Q and Enter to return./n", exp.result );
}
}
}
}