高山 发表于 2023-1-16 10:53:41

梦想护卫舰 第九期 表达式求值

先跟大家道个歉哈~群内掉不过来了,估计都去过年去了,这也情有可原吧?
所以没办法,只能我老板顶替员工了{:10_266:} {:10_266:} {:10_266:}
好吧,开始!
鱼C旅行团完事之后,你们的梦想之旅驶入了一片原始森林,很显然,这片森林的某个地方对你发出了呼唤:

呀??!身边的小甲鱼咋不见了?!!
这时,天上飞下来一只鹰,他告诉你小甲鱼被抓走了!!!现在,由他带着你,拯救小甲鱼

先跨过这条小溪吧
任务:
可用编译器助力跨过
不能用蛮力跨过
详情:
本关卡由陈尚涵提供,若有违规,机构没有任何责任!

表达式求值
输入一个表达式:(1+2)/3
输出结果:1
虽然题目很好理解
但还是有难度的
提示:先转化成逆波兰,再使用栈
好了,剩下的交给你了!玩得愉快~
正确方法:
麻烦认真思考后查看答案,不要听小怪的!!!!{:10_244:}
**** Hidden Message *****
功勋表彰大会:
我代表整个梦想护卫舰,对您进行荣誉表彰!!
(不是你第一个回复就能得到第一名的)
第一名:
第二名:
第三名
之后发生的事情:
恭喜你成功越过小溪,前方,是野人村寨……
求福方法:
订阅这些淘专辑,更好学编程!梦想护卫舰系列 + 好贴——字字精华,开卷有益 + 梦想护卫舰 解压甲板(不喜欢更要订阅{:10_249:})

元豪 发表于 2023-1-16 11:19:05

python呢{:10_256:}{:10_256:}
eval(input())

人造人 发表于 2023-1-16 11:50:35

flex&bison
^_^

sh-5.1$ ls
Makefileparser.yscanner.l
sh-5.1$ cat Makefile
CFLAGS = -g -Wall -Wextra -Wno-unused-function

all: bc

bc: scanner.o parser.o
        $(CC) $(CFLAGS) -o $@ $^

parser.c scanner.c: parser.y scanner.l
        flex -o scanner.c scanner.l
        bison --header=parser.h -o parser.c parser.y

clean:
        rm -f bc
        rm -f scanner.o parser.o
        rm -f scanner.c parser.c
        rm -f parser.h
sh-5.1$ cat parser.y
%define parse.trace
%define parse.lac full
%define parse.error detailed
%{
#include <stdio.h>

int yylex(void);

void yyerror(const char *s) {
    fprintf(stderr, "bc: %s\n", s);
}
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%%
line: %empty
    | line ';'
    | line exp ';'{printf("= %d\n", $2);}
    ;
exp:NUMBER
    | exp '+' exp   {$$ = $1 + $3;}
    | exp '-' exp   {$$ = $1 - $3;}
    | exp '*' exp   {$$ = $1 * $3;}
    | exp '/' exp   {$$ = $1 / $3;}
    | '(' exp ')'   {$$ = $2;}
    | '|' exp %prec UMINUS{$$ = $2 < 0 ? -$2 : $2;}
    | '-' exp %prec UMINUS{$$ = -$2;}
    ;
%%
int main(void) {
    //yydebug = 1;
    yyparse();
    return 0;
}
sh-5.1$ cat scanner.l
%option noyywrap
/*%option debug*/
%{
#include "parser.h"
%}
%%
"//".*            {}
[[:space:]]+      {}
(*)|0   {sscanf(yyget_text(), "%d", &yylval); return NUMBER;}
.                   {return yyget_text();}
%%
sh-5.1$ make
flex -o scanner.c scanner.l
bison --header=parser.h -o parser.c parser.y
cc -g -Wall -Wextra -Wno-unused-function   -c -o scanner.o scanner.c
cc -g -Wall -Wextra -Wno-unused-function   -c -o parser.o parser.c
cc -g -Wall -Wextra -Wno-unused-function -o bc scanner.o parser.o
sh-5.1$ ls
bcMakefileparser.c        parser.hparser.oparser.yscanner.cscanner.lscanner.o
sh-5.1$ ./bc
123+0+456-789*(1+2-3*4)/30;
= 815
1+2+3+4+5;
= 15
sh-5.1$

高山 发表于 2023-1-16 10:55:48

提供者:@陈尚涵 @zhangjinxuan

zhangjinxuan 发表于 2023-1-16 11:04:42

不用什么逆波兰,可以转化为表达式树{:10_256:}

高山 发表于 2023-1-16 11:05:00

zhangjinxuan 发表于 2023-1-16 11:04
不用什么逆波兰,可以转化为表达式树

转载转载,跟我无关

zhangjinxuan 发表于 2023-1-16 11:05:37

高山 发表于 2023-1-16 11:05
转载转载,跟我无关

哈哈

高山 发表于 2023-1-16 11:19:27

元豪 发表于 2023-1-16 11:19
python呢

{:10_256:}

高山 发表于 2023-1-16 11:53:03

哈哈

sfqxx 发表于 2023-1-16 12:00:09

666

人造人 发表于 2023-1-16 12:10:04

有一本书,书的名字就叫flex&bison
就是讲这个的

小mi糊 发表于 2023-1-16 16:07:34

看看

高山 发表于 2023-1-16 16:22:07

小mi糊 发表于 2023-1-16 16:07
看看

不建议提前看答案{:10_244:}

hveagle 发表于 2023-1-16 18:05:29

高山,我除夕当天准备:
五六点:起床
七点:从家出发
八点:上海南赶火车(软卧真舒服)
十二点(不二点):可恶,除夕吃方便面
十六点半(石榴点半):到达鹰潭西(鹰潭西站就等于鹰潭站)

hveagle 发表于 2023-1-16 18:07:54

print(eval(input()))

tomok 发表于 2023-1-17 08:47:08

回复看内容


高山 发表于 2023-1-17 09:09:48

tomok 发表于 2023-1-17 08:47
回复看内容

直接看答案是不好的。

额外减小 发表于 2023-1-20 23:27:41

顶(栈的知识我还没学。先看看?)

natural-waken 发表于 2023-8-24 10:53:02

谢谢

unsigned_int 发表于 2023-8-24 20:28:48

xiexie
页: [1]
查看完整版本: 梦想护卫舰 第九期 表达式求值