Как я могу исправить эти ошибки в моей программе? [закрыто]Python

Программы на Python
Ответить
Anonymous
 Как я могу исправить эти ошибки в моей программе? [закрыто]

Сообщение Anonymous »

Это задача:
Задача
Ваша задача — написать скрипт Python с функцией logo2python(), который получает программу журнала (текстовый файл с расширением .txt ) и создает скрипт Python (текстовый файл с тем же именем, но с расширением .py), который рисует идентичное изображение в программе журнала.
Это мой код, который я создал :

Код: Выделить всё

def logo2python(meno_suboru, tab=4):
# Read Logo code from input file
with open(meno_suboru, 'r') as file:
logo_code = file.read()

python_code = ["import turtle", "t = turtle.Turtle()"]

words = []
temp = ""
for char in logo_code:
if char in {'[', ']'}:
if temp:
words.append(temp.strip())
temp = ""
words.append(char)
elif char.isspace():
if temp:
words.append(temp.strip())
temp = ""
else:
temp += char
if temp:
words.append(temp.strip())

def add_indent(level):
return ' ' * (level * tab)

def is_number(value):
return value.replace('.', '', 1).isdigit() or (value.startswith('-') and value[1:].replace('.', '', 1).isdigit())

# Handle specific cases, including colors, pensize, and loop repetitions
def handle_special_commands(command, argument):
if command == "setpw":
if argument == 'repc':
return "t.pensize(repc)"
return f"t.pensize({argument})"
elif command == "setpc":
argument = argument.strip("'").strip('"')
if argument.startswith('#'):
return f"t.pencolor('{argument}')"
colors = {
"deep": "deep sky blue",
"medium": "medium sea green",
"indian": "indian red"
}
return f"t.pencolor('{colors.get(argument, argument)}')"
return None

# Process blocks (including nested repeats)
def process_block(words, start_index, indent_level):
block = []
i = start_index + 1
while i < len(words) and words[i] != "]":
command = words[i]
if command in {"fd", "bk", "rt", "lt"}:
if i + 1 < len(words):
argument = words[i + 1]
block.append(f"{add_indent(indent_level)}t.{command}({argument})")
i += 2
else:
i += 1
elif command in {"pu", "pd", "home"}:
block.append(f"{add_indent(indent_level)}t.{command}()")
i += 1
elif command == "repeat":
if i + 1 < len(words) and is_number(words[i + 1]):
repeat_count = int(words[i + 1])
i += 2
nested_block, i = process_block(words, i, indent_level + 1)
block.append(f"{add_indent(indent_level)}for repc in range(1, {repeat_count + 1}):")
block.extend(nested_block)
else:
i += 1
elif command == "to":
if i + 1 < len(words):
function_name = words[i + 1]
i += 2
function_body, i = process_block(words, i - 1, indent_level + 1)
if not function_body:
function_body = [add_indent(indent_level + 1) + "pass"]
block.append(f"{add_indent(indent_level)}def {function_name}():")
block.extend(function_body)
else:
i += 1
elif command.isidentifier():
special_case = handle_special_commands(command, words[i + 1] if i + 1 <  len(words) else "")
if special_case:
block.append(f"{add_indent(indent_level)}{special_case}")
i += 2
else:
block.append(f"{add_indent(indent_level)}{command}()")
i += 1
else:
i += 1
return block, i

# Main processing loop
i = 0
while i < len(words):
command = words[i]
if command in {"fd", "bk", "rt", "lt"}:
if i + 1 < len(words):
argument = words[i + 1]
python_code.append(f"t.{command}({argument})")
i += 2
else:
i += 1
elif command in {"pu", "pd", "home"}:
python_code.append(f"t.{command}()")
i += 1
elif command == "setpw":
if i + 1 < len(words):
argument = words[i + 1]
python_code.append(handle_special_commands(command, argument))
i += 2
else:
i += 1
elif command == "setpc":
if i + 1 < len(words):
argument = words[i + 1]
python_code.append(handle_special_commands(command, argument))
i += 2
else:
i += 1
elif command == "repeat":
if i + 1 < len(words) and is_number(words[i + 1]):
repeat_count = int(words[i + 1])
i += 2
loop_body, i = process_block(words, i, 1)
python_code.append(f"for repc in range(1, {repeat_count + 1}):")
python_code.extend(loop_body)
else:
i += 1
elif command == "to":
if i + 1 < len(words):
function_name = words[i + 1]
i += 2
function_body, i = process_block(words, i, 1)
if not function_body:
function_body = ["    pass"]
python_code.append(f"def {function_name}():")
python_code.extend(function_body)
else:
i += 1
elif command.isidentifier():
python_code.append(f"{command}()")
i += 1
else:
i += 1

python_code.append("turtle.done()")

output_filename = meno_suboru.replace(".txt", ".py")
with open(output_filename, 'w') as file:
file.write("\n".join(python_code))
А это ошибки, допущенные при отладке:

Код: Выделить всё

test logo2python('subor1.txt') ... ok
test logo2python('subor2.txt') ... ok
test logo2python('subor3.txt', 2) ... ok
test logo2python('subor4.txt') ... ok
test logo2python('subor5.txt') ... ok
test logo2python('subor6.txt') ... ok
test logo2python('subor7.txt', 3) ... ok
test logo2python('subor8.txt', 1) ... bad line of output subfile: 'sky()'!='for repc in range(1, 6):'
test logo2python('subor9.txt', 10) ... erroneous output substring line: 't.lt(60)'!=' t.lt(60)'
test logo2python('subor10.txt') ... error output substring line: 't.lt(90)'!=' t.lt(90)'
test logo2python('subor11.txt') ... ok
test logo2python('subor12.txt') ... ok
test logo2python('subor13.txt') ... ok
test logo2python('subor14.txt') ... error line of output subfile: 't.rt(90)'!=' t.rt(90)'
test logo2python('subor15.txt') ... ok
test logo2python('subor16.txt') ... ok
test logo2python('subor17.txt') ... bad line of output subfile: 'two()'!=' two()'
test logo2python('subor18.txt') ... bad line of output substring: 'sea()'!='t.pensize(15)'
test logo2python('subor19.txt') ... erroneous output substring line: 'def x():'!=' pass'
test logo2python('subor20.txt') ... ok
Понимание преобразования. Я внимательно просмотрел код, чтобы убедиться, что логика преобразования для команд логотипа, таких как повтор, fd, bk, rt и lt (для перемещения черепахи), верна.Обеспечение правильного форматирования вывода. Цель состоит в том, чтобы убедиться, что выходной код Python правильно отформатирован, обрабатывает вложенные блоки и правильно инициализирует графику черепахи.
Я ожидал удалить все ошибки, но когда я попробовал, он просто продолжал добавлять все больше и больше, и я застрял на 65% из 100%
Файлы, которые тестируют мой код, можно найти здесь: https://pastebin.com/t77yC30g

Подробнее здесь: https://stackoverflow.com/questions/791 ... my-program
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»