鱼C论坛

 找回密码
 立即注册
查看: 2267|回复: 22

[已解决]梦想护卫舰 第九期 表达式求值

[复制链接]
发表于 2023-1-16 10:53:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先跟大家道个歉哈~群内掉不过来了,估计都去过年去了,这也情有可原吧?
所以没办法,只能我老板顶替员工了
好吧,开始!
鱼C旅行团完事之后,你们的梦想之旅驶入了一片原始森林,很显然,这片森林的某个地方对你发出了呼唤:
133226i2i44m28n2prngi4.jpg
呀??!身边的小甲鱼咋不见了?!!
这时,天上飞下来一只鹰,他告诉你小甲鱼被抓走了!!!现在,由他带着你,拯救小甲鱼

先跨过这条小溪吧
任务:
可用编译器助力跨过
不能用蛮力跨过
详情:
本关卡由陈尚涵提供,若有违规,机构没有任何责任!
表达式求值
输入一个表达式:(1+2)/3
输出结果:1
虽然题目很好理解
但还是有难度的
提示:先转化成逆波兰,再使用栈

好了,剩下的交给你了!玩得愉快~
正确方法:
麻烦认真思考后查看答案,不要听小怪的!!!!
游客,如果您要查看本帖隐藏内容请回复
[/hide]
功勋表彰大会:
我代表整个梦想护卫舰,对您进行荣誉表彰!!
(不是你第一个回复就能得到第一名的)
第一名:
第二名:
第三名
之后发生的事情:
恭喜你成功越过小溪,前方,是野人村寨……
求福方法:
订阅这些专辑,更好学编程!梦想护卫舰系列 + 好贴——字字精华,开卷有益 + 梦想护卫舰 解压甲板(不喜欢更要订阅
最佳答案
2023-1-16 11:50:35
flex&bison
^_^
sh-5.1$ ls
Makefile  parser.y  scanner.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:]]+        {}
([1-9][0-9]*)|0     {sscanf(yyget_text(), "%d", &yylval); return NUMBER;}
.                   {return yyget_text()[0];}
%%
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
bc  Makefile  parser.c        parser.h  parser.o  parser.y  scanner.c  scanner.l  scanner.o
sh-5.1$ ./bc
123+0+456-789*(1+2-3*4)/30;
= 815
1+2+3+4+5;
= 15
sh-5.1$

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-16 11:19:05 | 显示全部楼层
python呢
eval(input())

点评

我很赞同!: 5.0
前三排名完成后发放奖励  发表于 2023-1-16 11:20
我很赞同!: 5
^_^  发表于 2023-1-16 11:19
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 11:50:35 | 显示全部楼层    本楼为最佳答案   
flex&bison
^_^
sh-5.1$ ls
Makefile  parser.y  scanner.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:]]+        {}
([1-9][0-9]*)|0     {sscanf(yyget_text(), "%d", &yylval); return NUMBER;}
.                   {return yyget_text()[0];}
%%
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
bc  Makefile  parser.c        parser.h  parser.o  parser.y  scanner.c  scanner.l  scanner.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 11:53
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-16 10:55:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 11:04:42 | 显示全部楼层
不用什么逆波兰,可以转化为表达式树
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-16 11:05:00 | 显示全部楼层
zhangjinxuan 发表于 2023-1-16 11:04
不用什么逆波兰,可以转化为表达式树

转载转载,跟我无关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 11:05:37 | 显示全部楼层
高山 发表于 2023-1-16 11:05
转载转载,跟我无关

哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-16 11:19:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-16 11:53:03 | 显示全部楼层
哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-16 12:00:09 From FishC Mobile | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-16 12:10:04 | 显示全部楼层
有一本书,书的名字就叫flex&bison
就是讲这个的

1.png

评分

参与人数 2鱼币 +3 贡献 +3 收起 理由
傻眼貓咪 + 3
高山 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 16:07:34 From FishC Mobile | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-16 16:22:07 | 显示全部楼层

不建议提前看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 18:05:29 | 显示全部楼层
高山,我除夕当天准备:
五六点:起床
七点:从家出发
八点:上海南赶火车(软卧真舒服)
十二点(不二点):可恶,除夕吃方便面
十六点半(石榴点半):到达鹰潭西(鹰潭西站就等于鹰潭站)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 18:07:54 | 显示全部楼层
print(eval(input()))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-17 08:47:08 | 显示全部楼层
回复看内容


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-17 09:09:48 From FishC Mobile | 显示全部楼层
tomok 发表于 2023-1-17 08:47
回复看内容

直接看答案是不好的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-20 23:27:41 From FishC Mobile | 显示全部楼层
顶(栈的知识我还没学。先看看?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-24 10:53:02 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-24 20:28:48 | 显示全部楼层
xiexie
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表