108.递归整数四则运算

简介: 108.递归整数四则运算
/* 在BC31下编译 */
/* compile under Borland C++ 3.1 */
/*
对四则混合运算所提取的形式化表达式(生成式)
<exp> -> <term> { <addop> <term> }
<addop> -> + | -
<term> -> <factor> { <mulop> <factor> }
<mulop> -> * | /
<factor> -> ( <exp> ) | Number
*/
#include <stdio.h>
#include <stdlib.h>
char token; /*全局标志变量*/
/*递归调用的函数原型*/
int exp( void );
int term( void );
int factor( void );
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;
}
相关文章
|
小程序
循环结构-求同时被7或11整除的整数
循环结构-求同时被7或11整除的整数
167 0
|
5月前
|
Serverless C语言
C语言----递归函数,计算一个非负整数的数字之和
C语言----递归函数,计算一个非负整数的数字之和
wustojc2002整数四则运算
wustojc2002整数四则运算
64 0
|
算法
不使用+或-运算符,计算两数之和
不使用+或-运算符,计算两数之和
84 0
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
123 0
|
算法 程序员 C语言
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
求实数的整数次幂(循环版)(高效)(位运算解题)
说明:参数 x 为底数,n 为指数。若参数正确,则函数值为 x 的 n 次幂。若参数不正确(当底数为 0 且指数为 0 或负数时无意义),则报告错误,函数值为0。// 这个位运算是大部分都不熟悉也不敢用的东西,但是确实是编程里面的一个非常重要的工具。请编写函数,用循环语句以最快的方法求任意实数的任意整数次幂。要求:不得调用 pow 函数,不得使用递归方法。指数 二进制 公式。
218 0
求实数的整数次幂(循环版)(高效)(位运算解题)
|
C语言
【初识C语言】简单计算n的阶乘以及多个数字的阶乘求和
【初识C语言】简单计算n的阶乘以及多个数字的阶乘求和
202 0
|
存储 算法 C#
C#算法题系列(二)各位相加、 整数反转、回文数、罗马数字转整数
C#算法题系列(二)各位相加、 整数反转、回文数、罗马数字转整数
183 0
|
存储 算法
“两数相加”,小学加法运算而已,不用递归没有灵魂!
“两数相加”,小学加法运算而已,不用递归没有灵魂!
133 0
“两数相加”,小学加法运算而已,不用递归没有灵魂!