文件链接本题附件地址
本题总分:15 分
【问题描述】
附件 prog.txt 中是一个用某种语言写的程序。
其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,
从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。
例如如下片段:
REPEAT 2:
A = A + 4
REPEAT 5:
REPEAT 6:
A = A + 5
A = A + 7
A = A + 8
A = A + 9
A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的
循环两次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。
A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。
请问该程序执行完毕之后,A 的值是多少?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
题解
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws Exception {
//使用缓冲流读取文件,便于一行一行处理
FileReader fr = new FileReader("src/prog.txt");
BufferedReader br = new BufferedReader(fr);
//定义循环栈存储每一层的循环次数
Stack<Integer> cycle = new Stack<>();
//定义数栈对于每层循环单独运算
Stack<Integer> nums = new Stack<>();
//先给数栈一个0用于对最外层的运算
nums.push(0);
//循环处理每一行
String s = "";
while ((s = br.readLine()) != null){
//先计算空格数
int spaceNum = 0;
while (s.charAt(spaceNum) == ' ') spaceNum ++;
//如果空格数少于这一层,代表退出这一层循环
//将数栈栈顶元素弹出,与循环栈栈顶相乘,作为本次循环完成后的结果
//并将结果加入上层
while (spaceNum < (nums.size() - 1) * 4){
int c = cycle.pop();
int n = nums.pop();
int sum = nums.pop();
sum += c * n;
nums.push(sum);
}
//检查当前行,如果是运算,就和数栈栈顶元素相加
//如果是循环,就将循环次数压入循环栈,并将向数栈压入一个0用于下一层循环的计算
if (s.indexOf("REPEAT") == -1){
//运算行 取最后一个字符
int newNum = s.charAt(s.length() - 1) - '0';
int n = nums.pop();
nums.push(n + newNum);
} else {
//循环行 取倒数第二个字符
int c = s.charAt(s.length() - 2) - '0';
cycle.push(c);
nums.push(0);
}
//在控制台输出每一行结束之后栈的状态,测试使用
//System.out.println(cycle + " " + nums);
}
//处理完所有数据之后,检查循环栈是否还有未退出的循环
//处理方式与前面一样
while (!cycle.isEmpty()) {
int c = cycle.pop();
int n = nums.pop();
int sum = nums.pop();
sum += c * n;
nums.push(sum);
}
//所有循环退出之后,数栈顶部元素即是答案
System.out.println(nums.peek());
}
}
练习题:REPEAT 程序
附件 prog.txt 中是一个用某种语言写的程序。附件在本文的末尾。
其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。
该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。
A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。
请问该程序执行完毕之后,A 的值是多少?
题目给出的 prog.txt 文件:
A = 0
REPEAT 2:
A = A + 4
REPEAT 5:
REPEAT 6:
A = A + 5
A = A + 7
REPEAT 6:
A = A + 7
REPEAT 4:
A = A + 2
A = A + 7
A = A + 2
REPEAT 7:
REPEAT 4:
A = A + 8
A = A + 7
A = A + 4
A = A + 5
A = A + 8
REPEAT 8:
A = A + 5
REPEAT 1:
A = A + 2
REPEAT 7:
A = A + 5
A = A + 5
REPEAT 2:
REPEAT 3:
A = A + 1
A = A + 1
REPEAT 5:
A = A + 1
REPEAT 9:
REPEAT 6:
A = A + 5
A = A + 1
REPEAT 6:
A = A + 2
A = A + 8
A = A + 3
REPEAT 2:
A = A + 5
REPEAT 3:
A = A + 9
REPEAT 1:
A = A + 4
REPEAT 2:
A = A + 9
REPEAT 1:
A = A + 6
A = A + 6
A = A + 4
REPEAT 3:
A = A + 7
A = A + 1
REPEAT 2:
A = A + 3
REPEAT 5:
A = A + 2
A = A + 5
A = A + 2
A = A + 4
A = A + 3
REPEAT 4:
A = A + 4
A = A + 3
A = A + 7
REPEAT 5:
REPEAT 4:
A = A + 5
A = A + 7
REPEAT 5:
A = A + 3
REPEAT 3:
A = A + 3
A = A + 1
A = A + 8
A = A + 2
REPEAT 9:
A = A + 5
REPEAT 1:
A &#