梦想护卫舰 第九期 表达式求值
先跟大家道个歉哈~群内掉不过来了,估计都去过年去了,这也情有可原吧?所以没办法,只能我老板顶替员工了{:10_266:} {:10_266:} {:10_266:}
好吧,开始!
鱼C旅行团完事之后,你们的梦想之旅驶入了一片原始森林,很显然,这片森林的某个地方对你发出了呼唤:
呀??!身边的小甲鱼咋不见了?!!
这时,天上飞下来一只鹰,他告诉你小甲鱼被抓走了!!!现在,由他带着你,拯救小甲鱼
先跨过这条小溪吧
任务:
可用编译器助力跨过
不能用蛮力跨过
详情:
本关卡由陈尚涵提供,若有违规,机构没有任何责任!
表达式求值
输入一个表达式:(1+2)/3
输出结果:1
虽然题目很好理解
但还是有难度的
提示:先转化成逆波兰,再使用栈
好了,剩下的交给你了!玩得愉快~
正确方法:
麻烦认真思考后查看答案,不要听小怪的!!!!{:10_244:}
**** Hidden Message *****
功勋表彰大会:
我代表整个梦想护卫舰,对您进行荣誉表彰!!
(不是你第一个回复就能得到第一名的)
第一名:
第二名:
第三名
之后发生的事情:
恭喜你成功越过小溪,前方,是野人村寨……
求福方法:
订阅这些淘专辑,更好学编程!梦想护卫舰系列 + 好贴——字字精华,开卷有益 + 梦想护卫舰 解压甲板(不喜欢更要订阅{:10_249:})
python呢{:10_256:}{:10_256:}
eval(input()) 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$
提供者:@陈尚涵 @zhangjinxuan 不用什么逆波兰,可以转化为表达式树{:10_256:} zhangjinxuan 发表于 2023-1-16 11:04
不用什么逆波兰,可以转化为表达式树
转载转载,跟我无关 高山 发表于 2023-1-16 11:05
转载转载,跟我无关
哈哈 元豪 发表于 2023-1-16 11:19
python呢
{:10_256:} 哈哈 666 有一本书,书的名字就叫flex&bison
就是讲这个的
看看 小mi糊 发表于 2023-1-16 16:07
看看
不建议提前看答案{:10_244:} 高山,我除夕当天准备:
五六点:起床
七点:从家出发
八点:上海南赶火车(软卧真舒服)
十二点(不二点):可恶,除夕吃方便面
十六点半(石榴点半):到达鹰潭西(鹰潭西站就等于鹰潭站)
print(eval(input())) 回复看内容
tomok 发表于 2023-1-17 08:47
回复看内容
直接看答案是不好的。 顶(栈的知识我还没学。先看看?) 谢谢 xiexie
页:
[1]