Першою мовою програмування, до якої я був підданий, був Sinclair BASIC . Як і багато діалектів BASIC, він вимагає нумерації всіх рядків вихідного коду .
В результаті використання GO TOкоманди було ідіоматичним і переходить до заданого номера рядка (без міток).
Також є пов'язана GO SUBкоманда, яка може використовуватися як виклик рудиментарної функції. Знову виконується перехід до заданого номера рядка, але коли RETURNкоманда буде досягнута, виконання переходить до наступної інструкції після GO SUB.
Аналогічно RUNкоманда перезапустить виконання програми в заданому рядку.
Кожен, хто провів будь-який час в інтерпретаторі BASIC з рядковими номерами, навчиться використовувати схему нумерації з пробілами. Це так, що простіше вставити нові рядки коду. Однак навіть тоді ви все ще можете виявити необхідність вставляти нові рядки між послідовно пронумерованими рядками.
Враховуючи рядки BASIC з номером рядків як вхідні дані, виведіть ту саму програму, але перенумеровану таким чином, що номери рядків починаються з 10 і збільшуються на кроках 10. Лістинг вхідних даних може мати GO TOабо GO SUBкоманди, тому номери, пов'язані з цим, також повинні бути відрегульовані.
GO TOіGO SUBкоманди знаходяться або на власних рядках, або в кінціIFTHENрядків. Безпечно сказати^(\d+) .*GO (TO|SUB) (\d+)$, достатньо, щоб відповідати таким рядкам. Ці команди в лапках слід ігнорувати.RUNкоманди завжди будуть у власних рядках. У цьому випадку номер рядка необов’язковий. Якщо його немає, то перекладач просто починається у верхній частині програми.Якщо через
GO TO,GO SUBабоRUNпосилання команди неіснуючої рядок, то замість цього перейти до наступної певної лінії. Ваш запис повинен вирішити це питання та забезпечити фіксацію таких посилань на рядки, щоб вони вказували на правильний рядок. Поведінка може бути невизначеною, якщо номер рядка після закінчення програми вводиться в одній з цих команд.Номери рядків завжди будуть додатними цілими числами від 1 до 9999 (відповідно до посібника). Це означає, що програми введення ніколи не матимуть більше 999 рядків.
Рядки вводу завжди будуть нумеровані у порядку зростання чисельно.
Для цілей цього виклику вхідні списки містять лише друкований ASCII. Вам не потрібно турбуватися про набір символів ZX. Сказавши , що, якщо ваша запис на насправді написано в ZX BASIC або відповідні z80 збірки / машинний код (і є емулятори з там ), то ви можете вибрати для вашого введення , щоб бути закодоване в наборі символів ZX замість.
Ви не можете використовувати будь-які бібліотеки чи утиліти, які спеціально підібрані для цієї мети.
Приклад введення:
1 REM "A rearranged guessing game"
2 INPUT A: CLS
3 INPUT "Guess the number ", B
10 IF A=B THEN PRINT "Correct": STOP
100 IF A<B THEN GO SUB 125
120 IF A>B THEN GO SUB 122
121 GO TO 3
125 PRINT "Try again"
126 RETURN
127 REM "An example of GO TO 7 and GO SUB 13 in quotes"
Приклад Вихід:
10 REM "A rearranged guessing game"
20 INPUT A: CLS
30 INPUT "Guess the number ", B
40 IF A=B THEN PRINT "Correct": STOP
50 IF A<B THEN GO SUB 80
60 IF A>B THEN GO SUB 80
70 GO TO 30
80 PRINT "Try again"
90 RETURN
100 REM "An example of GO TO 7 and GO SUB 13 in quotes"
Я хотів зв’язати посібник із ZX BASIC. Найкраще, що я міг знайти, здається, http://www.worldofspectrum.org/ZXBasicManual/index.html, але це, здається, є мертвим посиланням. Хоча машина зворотного зв'язку має копію .
GOTO 100 + A*10 і в Додатку C до Посібника з спектру ZX, перераховує GO TOяк прийняття числового виразу (без обмеження констант). Ось обговорення достоїнств обчислених GOTOна ZX80 та ZX81. До речі, я не маю уявлення, чому простір було додано у версії Spectrum.