编写一个程序实现求解任意算术表达式的值

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/30 00:28:04
编写一个程序实现求解任意算术表达式的值

编写一个程序实现求解任意算术表达式的值
编写一个程序实现求解任意算术表达式的值

编写一个程序实现求解任意算术表达式的值
#include
#include
#include
#include
#include
#include
int Check_bracket(char *p_str);
int Get_SubString(char *p_substr, const char *p_str, int *p_bpos, int *p_length);
int Calc_SubExpr(char *p_result, const char *p_expr);
void Insert_SubExpr(char *p_str, const char *p_result, int p_bpos, int p_length);
int Change_StrToFloat(float *p_fdata, char *p_operator, const char *p_result, int *p_num);
int main( int argc, char *argv[])
{
int i;
int j;
int i_sts;
int i_sts1;
int i_sts2;
int i_pos;
int i_length;
char i_expr[256];
char i_subexpr[128];
char i_rusult[128];



while (1){
i = 0;
j = 0;
i_sts = 0;
i_sts1 = 0;
i_sts2 = 0;
i_pos = 0;
i_length = 0;
memset(i_expr, 0x00, sizeof(i_expr));
memset(i_subexpr, 0x00, sizeof(i_subexpr));
memset(i_rusult, 0x00, sizeof(i_rusult));
/* */

printf("please intput the expression > ");
gets( i_expr );

if(memcmp(i_expr,"exit",sizeof("exit"))==0) break;
/* */
while ( i_sts == 0 )
{
memset(i_subexpr, 0x00, sizeof(i_subexpr));
memset(i_rusult, 0x00, sizeof(i_rusult));
i_sts = Check_bracket( i_expr );
if( i_sts == -1 )
{
printf("This is not a expression\n");
break;
}
else if (i_sts == 2)
{
i_sts2 = Calc_SubExpr(i_rusult, i_expr);
if (i_sts2 != 0)
{
printf("This is not a expression\n");
break;
}
break;
}
else if (i_sts == 1)
{
printf("This is not a expression\n");
break;
}
i_sts1 = Get_SubString(i_subexpr, i_expr, &i_pos, &i_length);
if (i_sts1 == 0)
{
i_sts2 = Calc_SubExpr(i_rusult, i_subexpr);
if (i_sts2 != 0)
{
printf("This is not a expression\n");
break;
}
Insert_SubExpr(i_expr, i_rusult, i_pos, i_length);
}

}


puts( i_rusult );
}
return 0;
}
//
int Change_StrToFloat(float *p_fdata, char *p_operator, const char *p_result, int *p_num)
{
float i_temp;
int i;
int j;
int k;
int m;
int sts;
char data[128];

i = 0;
j = 0;
k = 0;
m = 0;
i_temp = 0;
sts = 0;
memset(data, 0x00, sizeof(data));

for(i=0; p_result[i] != '\0'; i++)
{
if ((p_result[0] == '.') || (p_result[0] == '+')
|| (p_result[0] == '*') || (p_result[0] == '/'))
{
return -1;
}


switch( p_result[i] ) {
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
case '0' :
data[j++] = p_result[i];
break;
case '.' :
if( ( (p_result[i+1] == '+') || (p_result[i+1] == '-')
|| (p_result[i+1] == '*') || (p_result[i+1] == '/')
|| (p_result[i+1] == '.') || (p_result[i+1] == (char)0))
&& (sts = 1 ))
{
return -1;
}
data[j++] = p_result[i];
sts = 1;
break;
case '+' :
case '-' :
case '*' :
case '/' :
if( (p_result[i+1] == '+') || ( (p_result[i+1] == '-') && ( (p_result[i+2] == '+') || (p_result[i+2] == '-' )
|| (p_result[i+2] == '*') || (p_result[i+2] == '/' )
|| (p_result[i+2] == '.') || (p_result[i+2] == (char)0)))
|| (p_result[i+1] == '*') || (p_result[i+1] == '/')
|| (p_result[i+1] == '.') || (p_result[i+1] == (char)0))
{
return -1;
}
i_temp = (float)atof(data);
p_fdata[k++] = i_temp;
p_operator[m++] = p_result[i];
j = 0;
memset(data, 0x00, sizeof(data));
sts = 0;
break;
default:
break;
}
}
i_temp = (float)atof(data);
p_fdata[k] = i_temp;
*p_num = m;
return 0;
}