108.递归整数四则运算

网友投稿 570 2022-05-29

/* 在BC31下编译 */

/* compile under Borland C++ 3.1 */

/*

对四则混合运算所提取的形式化表达式(生成式)

-> { }

-> + | -

-> { }

-> * | /

-> ( ) | Number

*/

#include

#include

char token; /*全局标志变量*/

/*递归调用的函数原型*/

int exp( void );

int term( void );

int factor( void );

108.递归整数四则运算

void error( void ) /*报告出错信息的函数*/

{

fprintf( stderr, "错误\n");

exit( 1 );

}

void match( char expectedToken ) /*对当前的标志进行匹配*/

{

if( token == expectedToken ) token = getchar(); /*匹配成功,获取下一个标志*/

else error(); /*匹配不成功,报告错误*/

}

void Message(void)

{

printf("================================================================\n");

printf("* 递归实现的四则运算表达式求值程序 *\n");

printf("****************************************************************\n");

printf("使用方法:请从键盘上直接输入表达式,以回车键结束.如45*(12-2)[回车]\n");

printf("*****************************************************************\n\n");

}

main()

{

int result; /*运算的结果*/

Message();

printf(" >> 请输入表达式: ");

token = getchar(); /*载入第一个符号*/

result = exp(); /*进行计算*/

if( token == '\n' ) /* 是否一行结束 */

printf( " >> 表达式的计算结果为 : %d\n", result );

else error(); /* 出现了例外的字符 */

puts("\n\n 请按任意键退出 ...\n");

getch();

return 0;

}

int exp( void )

{

int temp = term(); /*计算比加减运算优先级别高的部分*/

while(( token == '+' ) || ( token == '-' ))

switch( token ) {

case '+': match('+'); /*加法*/

temp += term();

break;

case '-': match('-');

temp -= term(); /*减法*/

break;

}

return temp;

}

int term( void )

{

int div; /*除数*/

int temp = factor(); /*计算比乘除运算优先级别高的部分*/

while(( token == '*' ) || ( token == '/' ))

switch( token ) {

case '*': match('*'); /*乘法*/

temp *= factor();

break;

case '/': match('/'); /*除法*/

div = factor();

if( div == 0 ) /*需要判断除数是否为0*/

{

fprintf( stderr, "除数为0.\n" );

exit(1);

}

temp /= div;

break;

}

return temp;

}

int factor( void )

{

int temp;

if( token == '(' ) /*带有括号的运算*/

{

match( '(' );

temp = exp();

match(')');

}

else if ( isdigit( token )) /*实际的数字*/

{

ungetc( token, stdin ); /*将读入的字符退还给输入流*/

scanf( "%d", &temp ); /*读出数字*/

token = getchar(); /*读出当前的标志*/

}

else error(); /*不是括号也不是数字*/

return temp;

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:张小白树莓派4B踩坑记(六)使用USB摄像头
下一篇:GaussDB for DWS 负载管理核心技术解密一:全景图及解决的场景
相关文章