题目描述
【问题描述】
附件 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中的文件大致长这样:
文件中的每一行的缩进都是严格按照Python的代码规则来的,只是是用自然语言表述的,如果能把PEPEAT x 改写成 for i in range(x),那么将修改后的内容直接在Python编辑器中运行即可,不需要再分析伪代码的逻辑,编辑程序。
当然,如果分析清楚了运算的逻辑,也可编写代码完成。
现在下面介绍一下这两种方法:
法一
正如问题描述中所介绍的那样,这是一道运算次数略多的纯加法运算
REPEAT 2:
A = A + 4
REPEAT 5:
REPEAT 6:
A = A + 5
A = A + 7
A = A + 8
A = A + 9
由于A=A+5被嵌套在三次循环当中,这里的A=A+5其实表示2×5×6个5相加,因而对于每次A=A+X的运算,我们需要弄清楚这句话被嵌套在几个REPEAT循环中,而要看REPEAT循环次数,有需要对文档中的REPEAT X:语句进行解析
代码如下:
import re
#看字符串Str中有有多少个缩进,四个连续的空格' '代表一个缩进
def get_indent(Str):
spaceL=re.findall(r' ',Str)
now_indent=len(spaceL)
return now_indent
def main():
path = 'prog.txt'
with open(path,'r') as f:
contentList = f.readlines() #将prog.txt中的数读入contentList列表中
f.close()
i=1 #i表示contenList列表的下标,遍历时跳过第一行A=0
A=0
multiplier=1
indent=0
multiplier_list=[]
while(i<len(contentList)):
Str=contentList[i]
now_indent=get_indent(Str)
if now_indent<indent:
multiplier/=multiplier_list[-1]
multiplier_list.pop() #将列表中最后一个元素弹出
if 'REPEAT' in Str:
times=int(Str[-3]) #注意:Str最后一个字符是换行符'\n'
multiplier*=times
multiplier_list.append(times)
if 'A = A' in Str:
addend=int(Str[-2]) #注意:Str最后一个字符是换行符'\n'
A+=multiplier*addend
i+=1
indent=now_indent
print(A)
main()
这里的代码参考了亓官劼的这篇文章,我在此基础上对程序作了改进,程序执行的语句应该要更少
法二
由于txt中的伪代码与Python近似,只REPEAT X: 这一句是Python所不能理解的,将其改为Python可理解 for i in range(x):语句即可
代码有1001行,手动改比较费时,可写一个简单Python程序进行更改
代码如下:
path='prog.txt' #原文本文档
newfile="newprog.txt" #修改后的文本文档
with open(path,'r') as f,open(newfile,'w') as w:
content=f.readlines()
for item in content:
if 'REPEAT' in item: #修改REPEAT所在行的语句
Range='range('+item[item.find(':')-1]+')'
item=item.replace(item[item.find(':')-1],Range)
item=item.replace('REPEAT','for i in ')
w.write(item)
f.close()
w.close()
运行程序,将生成的newprog.txt文档中的内容copy到.py文件中运行即可,如下图;
两种方法得出的答案均为 241830