2013-04-10 5 views
0

В настоящее время я работаю над симулятором BASIC в Python, как следует из названия. Вот мой код для этой проблемы:Как сохранить список номеров, которые я уже зарегистрировал?

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. В результате этого вторая половина этой функции является просто заполнителем. Если бы вы могли помочь мне разобраться, как это решить, было бы весьма полезно. Благодарю.

+0

возможно дубликат [Python 3 - BASIC Simulator] (http://stackoverflow.com/questions/15832517/python-3-basic-simulator) –

+0

Пожалуйста, используйте название, которое на самом деле отражает ваш вопрос. –

+0

Две вещи: 1. В вашей петле поставьте условие для выхода, если вы достигнете последней строки. 2. Вместо использования 'while True', установите ограничение на количество шагов, которые может выполнить ваша программа (например:' for i in range (1000000) ') –

ответ

0

Вы сохраняете список мест, которые были посещены (вы уже это сделали), а затем, когда вы сталкиваетесь с goto, вы проверяете, работает ли она с уже посещенной линией, и если она была посещена, вы Выход.

Одна ошибка прямо сейчас заключается в том, что вы делаете список, который до тех пор, пока программа. Это довольно бессмысленно. Просто держать список посещенных номеров строк вместо, и проверить с

if current_line in visited: 
+0

Я не совсем уверен, как это будет работать, но будет ли последний элемент (конец) в списке ложным после цикла для количества элементов в этом списке указать бесконечный цикл? Хотя я не уверен, как это сделать. Что можно было бы сделать, чтобы программа подсчитала, сколько раз что-то было посещено? – Dan

+0

@dan: "но будет ли последний элемент (конец) в списке ложным после цикла для количества элементов в этом списке, указывает бесконечный цикл?" - Я не могу разобрать этот вопрос. –

+0

@dan: «Что я мог реализовать, чтобы программа подсчитывала, сколько раз что-то было посещено?«У вас есть словарь со списком вещей, которые были посещены, и несколько раз он был посещен. –

0

Попробуйте добавить, если заявление объявить строку в гостевой список, чтобы быть правдой, когда он встречается в цикле. Это мое решение:

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) 
Смежные вопросы