首页 > 其他分享 >2-表达式求值

2-表达式求值

时间:2024-10-08 21:20:29浏览次数:3  
标签:return cur double next char 求值 else 表达式

#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<math.h>
#define eps 1e-8
using namespace std;
bool illegal;
char s[10005];
int cur=0,n;
string OP="+-*/^";
bool isOper(char c){
    for(int i=0;i<OP.length();i++)
        if(OP[i]==c)return true;
    return false;
}
int sgn(double x){
    if(fabs(x)<=eps)return 0;
    return x>0?1:-1;
}
char next_char(){
    for(;s[cur]==' '||s[cur]=='\t';cur++);
    return cur<n?s[cur]:EOF;
}
int get_priority(char ch){
    if(ch=='^')return 3;
    else if(ch=='*'||ch=='/')return 2;
    return 1;
}
double calc(double a,char op,double b){
    if(op=='+')return a+b;
    else if(op=='-')return a-b;
    else if(op=='*')return a*b;
    else if(op=='/'){
        if(sgn(b)==0){
            illegal=true;
            return 1.0;
        }else return a/b;
    }else if(op=='^')return pow(a,b);
}
double P();
double calc_exp(int p){
    double a=P();
    while(isOper(next_char())&&get_priority(next_char())>=p){
        char op=next_char();
        cur++;
        a=calc(a,op,calc_exp(get_priority(op)+1));
    }
    return a;
}
char temp[1005];
double P(){
    if(next_char()=='-'){
        cur++;
        return -P();
    }else if(next_char()=='+'){
        cur++;
        return P();
    }else if(next_char()=='('){
        cur++;
        double r=calc_exp(0);
        if(next_char()==')')cur++;
        return r;
    }else{
        int len=0;
        while(next_char()>='0'&&next_char()<='9'||next_char()=='.'){
            temp[len++]=next_char();
            cur++;
        }
        temp[len]=0;
        double x;
        sscanf(temp,"%lf",&x);
        return x;
    }
}
int main(){
    printf("请输入一个由+ - * / 数字 括号构成的表达式:\n");
    while(gets(s)){
        printf("请输入一个由+ - * / 数字 括号构成的表达式:\n");
        n=strlen(s);
        cur=0;
        illegal=false;
        double res=calc_exp(0);
        if(illegal)
            printf("The teacher is so lazy!\n");
        else printf("%.8f\n",res);
    }
    return 0;
}
 

标签:return,cur,double,next,char,求值,else,表达式
From: https://blog.csdn.net/weixin_68261440/article/details/142769867

相关文章

  • 对UVM添加超时前的打印信息+AXI低功耗接口+process的await语句+对象当成参数+sv的单例
    对UVM添加超时前的打印信息首先获取到UVM的超时值,然后手动设定\$time的比较和while延时循环,当超出时间后,打印特殊的debug信息。$time<set_time,则进行循环。uvm_cmdline_processorclp;clp=uvm_cmdline_processor::get_inst();stringtimeout_settings[$];stringtimeout......
  • 白骑士的JavaScript教学JavaScript语法基础篇之运算符与表达式 2.2.4 逻辑运算符
            逻辑运算符是用于布尔逻辑运算的符号,它们常用于控制流程和条件判断,帮助程序员编写更复杂和更动态的条件语句。在JavaScript中,主要的逻辑运算符包括逻辑与(‘&&‘)、逻辑或(‘||‘)、逻辑非(‘!‘)以及一些其他特定场景的运算符。逻辑运算符用于将多个布尔值或表达式......
  • 白骑士的JavaScript教学JavaScript语法基础篇之运算符与表达式 2.2.5 条件运算符(三元
            条件运算符,也称为三元运算符,是JavaScript中唯一的三目运算符,它提供了一种简洁的方式来编写条件判断和赋值语句。通过使用条件运算符,你可以在一行代码中实现简单的条件判断,从而让代码更加紧凑和易读。条件运算符        条件运算符由三个部分组成:条件......
  • Python 正则表达式高级应用指南
    正则表达式是一种强大的文本模式匹配工具,在Python中,我们可以使用re模块来进行正则表达式的操作。以下是一些高级的正则表达式应用示例:复杂的模式匹配importretext="Hello,[email protected]."email_pattern=r'\b[......
  • Leetcode 10. 正则表达式匹配
    1.题目基本信息1.1.题目描述给你一个字符串s和一个字符规律p,请你来实现一个支持‘.’和‘*’的正则表达式匹配。‘.’匹配任意单个字符‘*’匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。1.2.题目地址https://leetcode.c......
  • SpringBoot 多元化配置(正则表达式,配置文件优先级)
    1.配置绑定所谓“配置绑定”就是把配置文件中的值与JavaBean中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过Java代码去读取该配置文件,并且把配置文件中指定的配置封装到JavaBean(实体类)中。SpringBoot提供了以下2种方式进行配......
  • 正则表达式和通配符及相关linux命令实操
    正则表达式和通配符含义是完全不同的 正则表达式基本组成: 单引号与双引号在命令中使用单引号,不转义引号内容,原样输出;使用双引号,转义引号内容*并非适用于所有命令 逻辑测试语句&&||!a&&ba执行成功才执行ba||ba执行失败才执行b!aa执行结果取反 》......
  • EL表达式修改js的路径
    request.setAttribute方法用于在Servlet的请求上下文中设置属性,其用途通常是为了在请求的处理过程中传递数据。它与JS路径修改无直接关系,除非你需要在请求处理中修改JS文件的路径并传递给前端页面。如果你需要在Servlet中修改JS路径并通过request.setAttribute传递给JSP页面,你可......
  • 正则表达式和三剑客
    image-20220403163240849什么是正则表达式正则表达式就是为了处理大量的字符串而定义的一套规则和方法。通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理的。image-20220405180916410如何用正则表达式通......
  • 信息学奥赛复赛复习10-CSP-J2020-03表达式求值-栈、后缀表达式、isdigit函数、c_str函
    PDF文档公众号回复关键字:202410031P7073[CSP-J2020]表达式[题目描述]小C热衷于学习数理逻辑。有一天,他发现了一种特别的逻辑表达式。在这种逻辑表达式中,所有操作数都是变量,且它们的取值只能为0或1,运算从左往右进行。如果表达式中有括号,则先计算括号内的子表达式的......