108.递归整数四则运算

举报
C语言与CPP编程 发表于 2022/05/06 00:47:59 2022/05/06
【摘要】 /* 在BC31下编译 *//* compile under Borland C++ 3.1 */ /*对四则混合运算所提取的形式化表达式(生成式)<exp> -> <term> { <addop> <term> }<addop> -> + | -<term&...

  
  1. /* 在BC31下编译 */
  2. /* compile under Borland C++ 3.1 */
  3. /*
  4. 对四则混合运算所提取的形式化表达式(生成式)
  5. <exp> -> <term> { <addop> <term> }
  6. <addop> -> + | -
  7. <term> -> <factor> { <mulop> <factor> }
  8. <mulop> -> * | /
  9. <factor> -> ( <exp> ) | Number
  10. */
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. char token; /*全局标志变量*/
  14. /*递归调用的函数原型*/
  15. int exp( void );
  16. int term( void );
  17. int factor( void );
  18. void error( void ) /*报告出错信息的函数*/
  19. {
  20. fprintf( stderr, "错误\n");
  21. exit( 1 );
  22. }
  23. void match( char expectedToken ) /*对当前的标志进行匹配*/
  24. {
  25. if( token == expectedToken ) token = getchar(); /*匹配成功,获取下一个标志*/
  26. else error(); /*匹配不成功,报告错误*/
  27. }
  28. void Message(void)
  29. {
  30. printf("================================================================\n");
  31. printf("* 递归实现的四则运算表达式求值程序 *\n");
  32. printf("****************************************************************\n");
  33. printf("使用方法:请从键盘上直接输入表达式,以回车键结束.如45*(12-2)[回车]\n");
  34. printf("*****************************************************************\n\n");
  35. }
  36. main()
  37. {
  38. int result; /*运算的结果*/
  39. Message();
  40. printf(" >> 请输入表达式: ");
  41. token = getchar(); /*载入第一个符号*/
  42. result = exp(); /*进行计算*/
  43. if( token == '\n' ) /* 是否一行结束 */
  44. printf( " >> 表达式的计算结果为 : %d\n", result );
  45. else error(); /* 出现了例外的字符 */
  46. puts("\n\n 请按任意键退出 ...\n");
  47. getch();
  48. return 0;
  49. }
  50. int exp( void )
  51. {
  52. int temp = term(); /*计算比加减运算优先级别高的部分*/
  53. while(( token == '+' ) || ( token == '-' ))
  54. switch( token ) {
  55. case '+': match('+'); /*加法*/
  56. temp += term();
  57. break;
  58. case '-': match('-');
  59. temp -= term(); /*减法*/
  60. break;
  61. }
  62. return temp;
  63. }
  64. int term( void )
  65. {
  66. int div; /*除数*/
  67. int temp = factor(); /*计算比乘除运算优先级别高的部分*/
  68. while(( token == '*' ) || ( token == '/' ))
  69. switch( token ) {
  70. case '*': match('*'); /*乘法*/
  71. temp *= factor();
  72. break;
  73. case '/': match('/'); /*除法*/
  74. div = factor();
  75. if( div == 0 ) /*需要判断除数是否为0*/
  76. {
  77. fprintf( stderr, "除数为0.\n" );
  78. exit(1);
  79. }
  80. temp /= div;
  81. break;
  82. }
  83. return temp;
  84. }
  85. int factor( void )
  86. {
  87. int temp;
  88. if( token == '(' ) /*带有括号的运算*/
  89. {
  90. match( '(' );
  91. temp = exp();
  92. match(')');
  93. }
  94. else if ( isdigit( token )) /*实际的数字*/
  95. {
  96. ungetc( token, stdin ); /*将读入的字符退还给输入流*/
  97. scanf( "%d", &temp ); /*读出数字*/
  98. token = getchar(); /*读出当前的标志*/
  99. }
  100. else error(); /*不是括号也不是数字*/
  101. return temp;
  102. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124576316

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。