鱼C论坛

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

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

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

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

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

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

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

好了,剩下的交给你了!玩得愉快~
正确方法:
麻烦认真思考后查看答案,不要听小怪的!!!!
游客,如果您要查看本帖隐藏内容请回复
[/hide]
功勋表彰大会:
我代表整个梦想护卫舰,对您进行荣誉表彰!!
(不是你第一个回复就能得到第一名的)
第一名:
第二名:
第三名
之后发生的事情:
恭喜你成功越过小溪,前方,是野人村寨……
求福方法:
订阅这些专辑,更好学编程!梦想护卫舰系列 + 好贴——字字精华,开卷有益 + 梦想护卫舰 解压甲板(不喜欢更要订阅
最佳答案
2023-1-16 11:50:35
flex&bison
^_^

  1. sh-5.1$ ls
  2. Makefile  parser.y  scanner.l
  3. sh-5.1$ cat Makefile
  4. CFLAGS = -g -Wall -Wextra -Wno-unused-function

  5. all: bc

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

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

  11. clean:
  12.         rm -f bc
  13.         rm -f scanner.o parser.o
  14.         rm -f scanner.c parser.c
  15.         rm -f parser.h
  16. sh-5.1$ cat parser.y
  17. %define parse.trace
  18. %define parse.lac full
  19. %define parse.error detailed
  20. %{
  21. #include <stdio.h>

  22. int yylex(void);

  23. void yyerror(const char *s) {
  24.     fprintf(stderr, "bc: %s\n", s);
  25. }
  26. %}
  27. %token NUMBER
  28. %left '+' '-'
  29. %left '*' '/'
  30. %nonassoc UMINUS
  31. %%
  32. line: %empty
  33.     | line ';'
  34.     | line exp ';'  {printf("= %d\n", $2);}
  35.     ;
  36. exp:  NUMBER
  37.     | exp '+' exp   {$$ = $1 + $3;}
  38.     | exp '-' exp   {$$ = $1 - $3;}
  39.     | exp '*' exp   {$$ = $1 * $3;}
  40.     | exp '/' exp   {$$ = $1 / $3;}
  41.     | '(' exp ')'   {$$ = $2;}
  42.     | '|' exp %prec UMINUS  {$$ = $2 < 0 ? -$2 : $2;}
  43.     | '-' exp %prec UMINUS  {$$ = -$2;}
  44.     ;
  45. %%
  46. int main(void) {
  47.     //yydebug = 1;
  48.     yyparse();
  49.     return 0;
  50. }
  51. sh-5.1$ cat scanner.l
  52. %option noyywrap
  53. /*%option debug*/
  54. %{
  55. #include "parser.h"
  56. %}
  57. %%
  58. "//".*              {}
  59. [[:space:]]+        {}
  60. ([1-9][0-9]*)|0     {sscanf(yyget_text(), "%d", &yylval); return NUMBER;}
  61. .                   {return yyget_text()[0];}
  62. %%
  63. sh-5.1$ make
  64. flex -o scanner.c scanner.l
  65. bison --header=parser.h -o parser.c parser.y
  66. cc -g -Wall -Wextra -Wno-unused-function   -c -o scanner.o scanner.c
  67. cc -g -Wall -Wextra -Wno-unused-function   -c -o parser.o parser.c
  68. cc -g -Wall -Wextra -Wno-unused-function -o bc scanner.o parser.o
  69. sh-5.1$ ls
  70. bc  Makefile  parser.c        parser.h  parser.o  parser.y  scanner.c  scanner.l  scanner.o
  71. sh-5.1$ ./bc
  72. 123+0+456-789*(1+2-3*4)/30;
  73. = 815
  74. 1+2+3+4+5;
  75. = 15
  76. sh-5.1$
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

点评

我很赞同!: 5.0
前三排名完成后发放奖励  发表于 2023-1-16 11:20
我很赞同!: 5
^_^  发表于 2023-1-16 11:19
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 11:50:35 | 显示全部楼层    本楼为最佳答案   
flex&bison
^_^

  1. sh-5.1$ ls
  2. Makefile  parser.y  scanner.l
  3. sh-5.1$ cat Makefile
  4. CFLAGS = -g -Wall -Wextra -Wno-unused-function

  5. all: bc

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

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

  11. clean:
  12.         rm -f bc
  13.         rm -f scanner.o parser.o
  14.         rm -f scanner.c parser.c
  15.         rm -f parser.h
  16. sh-5.1$ cat parser.y
  17. %define parse.trace
  18. %define parse.lac full
  19. %define parse.error detailed
  20. %{
  21. #include <stdio.h>

  22. int yylex(void);

  23. void yyerror(const char *s) {
  24.     fprintf(stderr, "bc: %s\n", s);
  25. }
  26. %}
  27. %token NUMBER
  28. %left '+' '-'
  29. %left '*' '/'
  30. %nonassoc UMINUS
  31. %%
  32. line: %empty
  33.     | line ';'
  34.     | line exp ';'  {printf("= %d\n", $2);}
  35.     ;
  36. exp:  NUMBER
  37.     | exp '+' exp   {$$ = $1 + $3;}
  38.     | exp '-' exp   {$$ = $1 - $3;}
  39.     | exp '*' exp   {$$ = $1 * $3;}
  40.     | exp '/' exp   {$$ = $1 / $3;}
  41.     | '(' exp ')'   {$$ = $2;}
  42.     | '|' exp %prec UMINUS  {$$ = $2 < 0 ? -$2 : $2;}
  43.     | '-' exp %prec UMINUS  {$$ = -$2;}
  44.     ;
  45. %%
  46. int main(void) {
  47.     //yydebug = 1;
  48.     yyparse();
  49.     return 0;
  50. }
  51. sh-5.1$ cat scanner.l
  52. %option noyywrap
  53. /*%option debug*/
  54. %{
  55. #include "parser.h"
  56. %}
  57. %%
  58. "//".*              {}
  59. [[:space:]]+        {}
  60. ([1-9][0-9]*)|0     {sscanf(yyget_text(), "%d", &yylval); return NUMBER;}
  61. .                   {return yyget_text()[0];}
  62. %%
  63. sh-5.1$ make
  64. flex -o scanner.c scanner.l
  65. bison --header=parser.h -o parser.c parser.y
  66. cc -g -Wall -Wextra -Wno-unused-function   -c -o scanner.o scanner.c
  67. cc -g -Wall -Wextra -Wno-unused-function   -c -o parser.o parser.c
  68. cc -g -Wall -Wextra -Wno-unused-function -o bc scanner.o parser.o
  69. sh-5.1$ ls
  70. bc  Makefile  parser.c        parser.h  parser.o  parser.y  scanner.c  scanner.l  scanner.o
  71. sh-5.1$ ./bc
  72. 123+0+456-789*(1+2-3*4)/30;
  73. = 815
  74. 1+2+3+4+5;
  75. = 15
  76. sh-5.1$
复制代码

点评

我感觉你在写乱码,我快晕了,算了,送你个最佳答案吧^_^  发表于 2023-1-16 11:53
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-16 10:55:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 11:04:42 | 显示全部楼层
不用什么逆波兰,可以转化为表达式树
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

转载转载,跟我无关
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-16 11:19:27 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-16 11:53:03 | 显示全部楼层
哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-16 12:00:09 From FishC Mobile | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

1.png

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-16 16:07:34 From FishC Mobile | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

不建议提前看答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2023-1-16 18:07:54 | 显示全部楼层
  1. print(eval(input()))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

直接看答案是不好的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-20 23:27:41 From FishC Mobile | 显示全部楼层
顶(栈的知识我还没学。先看看?)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-24 10:53:02 | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-24 20:28:48 | 显示全部楼层
xiexie
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 07:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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