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;
}
相关文章
|
XML 存储 SQL
独立部署Xray反练平台——详细说明加举例xxe漏洞
xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有:检测速度快。发包速度快; 漏洞检测算法高效。支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。
1937 0
独立部署Xray反练平台——详细说明加举例xxe漏洞
|
11月前
|
Java 测试技术 开发者
💡Java 零基础:彻底掌握 for 循环,打造高效程序设计
【10月更文挑战第15天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
319 63
|
11月前
|
自动驾驶 物联网 5G
标题:5G频段解析:低频、中频与毫米波的奥秘
标题:5G频段解析:低频、中频与毫米波的奥秘
1068 64
|
11月前
|
机器学习/深度学习 人工智能 搜索推荐
AI技术在医疗领域的应用及挑战
【9月更文挑战第36天】随着人工智能技术的不断发展,其在医疗领域的应用也日益广泛。本文将从AI技术在医疗领域的应用场景、优势以及面临的挑战等方面进行探讨。通过分析AI技术在医疗领域的应用,我们可以更好地了解其发展趋势和未来前景。
211 3
|
11月前
|
人工智能 JavaScript 数据可视化
Cursor、v0 和 Bolt.new:当今 AI 编程工具的全面解析与对比
本文深入解析了 Cursor AI、v0 和 Bolt.new 三大 AI 编程工具的特点与应用场景。Cursor 适合日常编码与团队协作,v0 专注于 UI 原型设计,Bolt.new 擅长全栈原型开发。各工具在功能上互为补充,开发者可根据需求灵活选择,以提升工作效率。
4829 1
|
存储 安全 网络安全
SSL VPN
SSL VPN
576 5
|
存储 数据处理 C++
内存 vs 硬盘:固态硬盘代替内存可以工作吗?
内存 vs 硬盘:固态硬盘代替内存可以工作吗?
361 2
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT的应用场景和局限性,以及发展前景
ChatGPT的应用场景和局限性,以及发展前景
512 0
|
数据采集 网络协议 物联网
C# | 上位机开发新手指南(一)概述
C#,是微软主推的编程语言。它在工业控制、自动化、物联网等领域应用非常广泛。由于国内在工业控制领域技术发展路径的原因,早期的自动化控制面板由Window环境提供,大量的MFC、VB6控制应用被部署在了工厂车间。在用户习惯和界面环境的双料加持下,给C#在工业领域的推广打下的坚实的基础。使用C#进行上位机开发已经是行业内的主流选择。 如果正在读文章的你准备或正在从事C#的上位机开发,本专栏将会是您在这条路线上的路标。欢迎一同打卡每一个节点。
2068 0
C# | 上位机开发新手指南(一)概述
|
Rust JavaScript 前端开发
Zig
Zig 是一门系统编程语言,旨在提供一种简单、安全且高效的方式来构建软件。它的设计受到了 Rust、C 和 C++ 的影响,但与这些语言相比,Zig 更加简单易用。Zig 的语法和抽象级别使得它易于学习和使用,同时它还提供了许多现代编程语言的功能,如高级类型、模块化编程和内存安全等。
537 6