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 均为无害化检查。
2133 0
独立部署Xray反练平台——详细说明加举例xxe漏洞
|
数据管理 容器 BI
公开课05期 |基于宜搭的《招聘管理》应用搭建
本文章将以《招聘管理》场景为例,介绍通过Excel导入成线上系统的详细步骤。
13059 0
公开课05期 |基于宜搭的《招聘管理》应用搭建
|
2月前
|
关系型数据库 MySQL 分布式数据库
航天壹进制 PolarDB-X 1.0(DRDS) 数据备份容灾解决方案
本方案基于航天壹进制黑方系统,结合MySQL逻辑备份技术,为阿里云PolarDB-X 1.0(DRDS)构建非侵入式、高可靠的数据备份与恢复体系,支持全量备份、AES-256加密、压缩重删及灵活策略管理,兼容RDS MySQL操作习惯,保障数据安全与业务连续性。
|
安全 Linux 网络安全
在Linux中,如何在Linux中实现虚拟化的安全最佳实践?
在Linux中,如何在Linux中实现虚拟化的安全最佳实践?
|
人工智能 搜索推荐
杨笛一新作:社恐有救了,AI大模型一对一陪聊,帮i人变成e人
【4月更文挑战第24天】杨笛一团队研发的AI大模型,以“AI伙伴”和“AI导师”框架帮助社恐人群提升社交技能。通过模拟真实场景和个性化反馈,该方法降低训练门槛,增强学习者自信。但也有挑战,如保持AI模拟的真实性,防止反馈偏见,并避免过度依赖。研究强调,AI应作为辅助工具而非替代。[论文链接](https://arxiv.org/pdf/2404.04204.pdf)
319 1
|
编译器 开发工具 Android开发
Android 12 新特性深度解析
【2月更文挑战第15天】 随着移动操作系统的不断进化,Android 12带来了一系列创新功能与性能提升。本文将深入剖析Android 12的核心新特性,包括隐私仪表盘、通知管理、设备控制以及性能优化等方面,为开发者和用户提供全面的更新指南。
|
存储 算法 数据处理
【C/C++ 数据结构 】广义表深度解析:从原理到C/C++实现
【C/C++ 数据结构 】广义表深度解析:从原理到C/C++实现
725 0
|
SQL 前端开发 Java
有来实验室|第一篇:Seata1.5.2版本部署和开源全栈商城订单支付业务实战(二)
有来实验室|第一篇:Seata1.5.2版本部署和开源全栈商城订单支付业务实战(二)
|
小程序 搜索推荐 开发者
如何给你的小游戏起个好名字
嗨!大家好,我是小蚂蚁。今天的这篇文章来自于我的一位学员 @Sing 的分享。很多的小游戏开发者给自己的游戏起名字完全是随性或者凭借感觉,其实给小游戏起名字是有一定的方法的,一个好的名字是能给你的小游戏带来一定的搜索自然流量的。 如果你之前起游戏名字靠的是感觉,不妨好好看一下这篇分享,按照文中的方法分析一下,自己起的游戏名字到底好不好。
904 0
如何给你的小游戏起个好名字
|
JavaScript 前端开发
面试官问你selenium元素定位不到有哪些情况?一文讲明白
面试官问你selenium元素定位不到有哪些情况?一文讲明白
365 0