0

正如标题所示,我目前正在使用 Python 开发 BASIC 模拟器。这是我解决这个问题的代码:

def getBASIC():
   l = []
   x = 1
   while x == 1:
      i = input()
      l.append(i)
      if len(i.split()) != 3:
         x = 0
   return l

def findLine(prog, target):
   for l in range(0, len(prog)):
      progX = prog[l].split()
      if progX[0] == target:
          return l

 def execute(prog):
      location = 0
      visited = [False] * len(prog)
      while True:
        T = prog[location].split()[2]
        location = findLine(prog, T)
        visited[location] = True
      if visited[len(visited)-1] == False:
          return "infinite loop"
      else:
          return "success"

第一个函数做了它打算做的事情——将 BASIC 代码的输入转换成一个列表。第二个函数 findLine 也做了它打算做的事情,因为它找到包含等于输入的字符串的项目。然而,最后一个功能,我无法开始工作。我知道我必须做什么,那就是检查它的一部分是否被访问过两次。由于 while 循环的存在,我无法弄清楚如何做到这一点。因此,该函数的后半部分只是占位符。如果您能帮我弄清楚如何解决这个问题,将不胜感激。谢谢。

4

2 回答 2

0

尝试添加一个 if 语句,当在循环中遇到时,在访问列表中声明一行为真。这是我的解决方案:

    def execute(prog):
       location = 0
       visited=[False]*len(prog)
   while True:
           if location==len(prog)-1:
           return "success"
       if visited[location]==True:
           return "infinite loop"
       if visited[location]==False:
           visited[location]=True
       line2strings=prog[location].split()
       T=line2strings[-1]
       location=findLine(prog, T)
于 2013-09-12T23:20:55.970 回答
0

您保留一个已访问过的地点列表(您已经这样做了),然后当您遇到 goto 时,检查它是否对已访问过的线路有效,如果已访问过,则退出。

现在的一个错误是您列出的列表与程序一样长。这很没有意义。只需保留已访问行号的列表,然后检查

if current_line in visited:
于 2013-04-11T04:42:10.237 回答