P11738 [集训队互测 2015] 未来程序·改
题目背景
洛谷可提交代码长度最长为 50KB。如果您的代码超过 50KB,请尝试压行、替换变量名等操作。
题目描述
在 2111 年,第 128 届全国青少年信息学奥林匹克冬令营前夕,Z 君找到了 2015 年,第 32 届冬令营的题目来练习。
他打开了第三题 “未来程序” 这道题目:
“本题是一道提交答案题,一共 10 个测试点。
对于每个测试点,你会得到一段程序的源代码和这段程序的输入。你要运行这个程序,并保存这个程序的输出。
遗憾的是这些程序都效率极其低下,无法在比赛的 5 个小时内得到输出。”
Z 君想了一下,决定用 2111 年的计算机来试着运行这个题目,但是问题来了,Z君已经找不到 96 年前的那次比赛的测试数据了……
没有给出输入数据的提交答案题就不成其“提交答案题”之名,为了解决这个问题,Z君决定将这个题目改造成传统题。
Z 君知道 96 年前的计算机的性能比现在差多了,所以这道题的测试数据中,输入数据的规模被设计成很小,从而,做这道题的选手只需要暴力模拟源代码的工作流程就可以通过它。
现在这道题摆到了你的面前。
本题是一道传统题,一共有 10 个测试点。
对于每个测试点,你的程序会得到一段程序的源代码和这段程序的输入。你的程序需要运行这段程序,并输出这段程序的输出。
### **关于给出的源代码的约定**
Z 君是一名 C++ 选手。为了简化这个问题,Z君在给出的源代码中去掉了 C++ 语言的大量特性。从而这个源代码具有以下特点:
- 第一行必定为 `#include` (不含引号)
- 这个库中只会调用到对象 `cin`,`cout`,`endl`,`cin` 的 `>>(int)` 函数和 `cout` 的 `
输入格式
输入文件分为两个部分。
第一行,有一个整数 $N$。它描述了源代码对应的输入文件 `program.in` 中包含的整数数目。
以下 $N$ 个整数构成了源代码对应的输入文件 `program.in`。
这之后的部分构成了源代码 `program.cpp`。
输出格式
输出文件是将 `program.cpp` 编译后输入 `program.in` 后所得到的输出。
说明/提示
### 限制与约定
输入的所有 `program.cpp` 都是手打的,每个输入文件的大小不超过 $7\texttt{KB}$。
- 测试点 #1 的 `program.cpp` 见样例数据及附加文件下载。
- 测试点 #2 到 #4 的 `program.cpp` 符合以下格式:
```cpp
#include
#include
using namespace std;
int main()
{
cout using namespace std ; FUNC_AND_VAR
FUNC_AND_VAR ::=
| ε
| int NAME ( OPTPARAMS ) { STATEMENTS } FUNC_AND_VAR
| int DEFINEVAR DEFINEVARS ; FUNC_AND_VAR
OPTPARAMS ::=
| ε
| int NAME PARAMS
PARAMS ::=
| ε
| , int NAME PARAMS
STATEMENTS ::=
| ε
| STATEMENT STATEMENTS
STATEMENT ::=
| EXPRESSION ;
| { STATEMENTS }
| int DEFINEVAR DEFINEVARS ;
| if ( EXPRESSION ) STATEMENT
| if ( EXPRESSION ) STATEMENT else STATEMENT
| for ( STATEMENT_IN_FOR ; OPTEXPRESSION ; STATEMENT_IN_FOR ) STATEMENT
| while ( EXPRESSION ) STATEMENT
| return EXPRESSION ;
STATEMENT_IN_FOR ::=
| OPTEXPRESSION
| int DEFINEVAR DEFINEVARS
OPTEXPRESSION ::=
| ε
| EXPRESSION
EXPRESSION ::=
| UNIT9
| EXPRESSION > UNIT9
UNIT0 ::=
| INT_CONSTANT
| UNIT0 [ EXPRESSION ]
| ( EXPRESSION )
| NAME ( OPTARGUS ) // 注:此处的 NAME 是一个函数名
| NAME // 注:此处的 NAME 是一个变量名
| cin
| cout
| endl
UNIT1 ::=
| UNIT0
| + UNIT1
| - UNIT1
| ! UNIT1
UNIT2 ::=
| UNIT1
| UNIT2 * UNIT1
| UNIT2 / UNIT1
| UNIT2 % UNIT1
UNIT3 ::=
| UNIT2
| UNIT3 + UNIT2
| UNIT3 - UNIT2
UNIT4 ::=
| UNIT3
| UNIT4 < UNIT3
| UNIT4 UNIT3
| UNIT4 >= UNIT3
UNIT5 ::=
| UNIT4
| UNIT5 == UNIT4
| UNIT5 != UNIT4
UNIT6 ::=
| UNIT5
| UNIT6 ^ UNIT5
UNIT7 ::=
| UNIT6
| UNIT7 && UNIT6
UNIT8 ::=
| UNIT7
| UNIT8 || UNIT7
UNIT9 ::=
| UNIT8
| UNIT8 = UNIT9
OPTARGUS ::=
| ε
| EXPRESSION ARGUS
ARGUS ::=
| ε
| , EXPRESSION ARGUS
DEFINEVARS ::=
| ε
| , DEFINEVAR DEFINEVARS
DEFINEVAR ::=
| NAME
| DEFINEVAR [ INT_CONSTANT ]
NAME ::= 仅包含大小写字母、数字、下划线的非空字符串,且不以数字开头。
INT_CONSTANT ::= 仅包含数字的非空字符串,且不以0开头,或这个字符串就是0。
```