Программирование на Бейсик 48/128 для ZX-Spectrum 1993 г.

SPECTRUM-бейсик - ввод данных с клавиатуры во время выполнения программы. Переходы. Останов и продолжение выполнения программы. Переходы по условию. Ввод символьных данных. Логические операции.


Ввод данных с клавиатуры
во время выполнения программы

INPUT

Хотя написанная нами программа верно пересчитывает рубли в
доллары, работать с ней неудобно. Для перевода другой суммы, да
еще при постоянно меняющемся курсе, ее надо редактировать:
изменять числа в строках 10 и 50 и снова запускать.

В ситуации, когда данные, необходимые для работы программы,
нужно вводить по ходу ее выполнения, поможет оператор INPUT. В
простейшем виде он записывается так:

10 INPUT Kurs

Натолкнувшись на него,
компьютер останавливает вы-
полнение программы, вы-
ставляет в последней строке
экрана курсор и ждет, пока
мы не введем с клавиатуры
какое-нибудь число. После
подтверждения ввода клави-
шей Enter оператор INPUT за-
носит введенное число в чис-
ловую переменную, имя кото-
рой указано вслед за ключевым словом (в нашем случае в пере-
менную Kurs), и продолжает выполнение программы. INPUT не успо-
коится, пока не получит хоть какое-нибудь число. Если попытаться
на запрос ничего не набирать, а сразу нажать Enter, то он укажет,
что мы не правы — выведет знак вопроса (?). Можно, конечно,
вместо числа предложить имя другой числовой переменной. Тогда
переменной, стоящей вслед за INPUT будет присвоено значение
набранной переменной, но только, если последняя ранее была
определена. Иначе программа прервет работу с сообщением об
ошибке: Variable not found.

Вслед за INPUT может стоять и несколько переменных. В этом
случае оператор будет запрашивать числа столько раз, сколько
переменных мы к нему прицепим:

10 INPUT Kurs; Rub

Возможности INPUT этим не исчерпываются. Кроме ввода дан-
ных он еще способен частично исполнять обязанности PRINT —
выводить на экран текст. Используя это его свойство, мы можем
заменить строки 10 и 50 нашей программы одной строкой:

10 INPUT "Текущий курс (руб. за 1$): "; Kurs; " Сумма (руб.): "; Rub

Формат записи данных в INPUT тот же, что и в PRINT: с теми же
кавычками, с теми же знаками препинания. Так же с помощью
PAPER, INK, BRIGHT, FLASH можно управлять атрибутами, а с по-
мощью AT и TAB — позицией вывода.

Переходы

GO ТО

Есть еще одно неудобство — нашу программу после каждого
расчета нужно запускать заново. Избавиться от этого предельно
просто — стоит только ввести в действие оператор GO ТО. Дослов-
но он переводится «пошел на» строку с таким-то номером:

80 GO ТО 10

Введя эту строку, мы, как говорится, «зациклим» программу: с
последней строки отошлем компьютер опять к ее началу. Теперь
без остановки программы можно пересчитать цены хоть всех това-
ров, выпускаемых в России. Но чтобы каждый раз не вводить курс
доллара, все же разнесем ввод данных на две строки и переход по
GO ТО сделаем на строку 35:

5 REM Программа пересчета рублей в доллары
10 INPUT "Текущий курс (руб. за 1$): "; Kurs
33 PRINT AT 0,1; "Текущий курс: "; Kurs; " рублей за 1$"
35 INPUT " Сумма (руб.): "; Rub
70 LET Dol=INT(Rub/Kurs*100+0.5)/100: REM Расчет
75 PRINT AT 1f 1; Rub; " руб. - ";"$"; Dol:"
80 GO TO 35

Пробелы (10 штук) в конце 75-й строки призваны затирать
«хвост» выведенной в предыдущем расчете суммы.

Останов и продолжение выполнения программы

STOP, CONTINUE

Теперь возникла другая проблема: как остановить программу?
Не выключать же компьютер. Можно, конечно, сделать сброс, но
тогда сотрется программа.

Вообще, выполнение программы практически в любом месте
можно прервать по команде Break (клавиши CS/Space). На это
компьютер отреагирует одним из сообщений: BREAK into program
(прерывание во время выполнения программы) либо BREAK -
CONT repeats (прерывание — CONTINUE повторит) и после нажатия
Enter перейдет в редактор Бейсика. Продолжить выполнение про-
граммы можно, введя оператор CONTINUE.

Вторую возможность остановить программу дает оператор INPUT.
Если на его запрос вместо данных ввести оператор STOP, то с
сообщением STOP in INPUT (стоп при вводе) мы «вывалимся» из
программы. Как и после Break, продолжить выполнение програм-
мы можно по CONTINUE: вновь выполняется оператор INPUT.

Переходы по условию

IF... THEN

Требовать от пользователя, не посвященного в тонкости Бейсика
(скажем, от продавца валютного магазина), чтобы он «вываливал-
ся» из программы по Break или STOP, по меньшей мере, несерьез-
но. Каждая программа должна корректно и просто завершаться. И
информация о том, как это можно сделать, должна всегда присут-
ствовать на экране. Например, в таком виде: «Для выхода из
программы нажмите такую-то клавишу».

Поскольку наша программа постоянно ожидает получения ново-
го числа, то проще всего организовать выход из нее при условии,
что введено 0 руб. Следовательно, нам необходим оператор, спо-
собный проанализировать, равна ли переменная Rub нулю или
нет. Если Rub равна нулю, то необходимо организовать выход из
программы, а если Rub не равна нулю — пересчитать сумму в
доллары и перейти к ожиданию ввода нового числа. Оператор,
принимающий подобные решения, так и выглядит:

IF (если, англ.) <условие> THEN (тогда, англ.) <действие>

<Условием> может являться любое выражение. На принятие ре-
шения: выполнять или не выполнять действие, указанное за THEN,
влияет результат вычисления этого выражения. Если значение
выражения равно нулю, считается, что условие ложно, не равно
нулю — истинно.

Чаще всего в качестве условия, стоящего за IF, используются
выражения сравнения с использованием знаков «равно» (=),
«больше» (>), «меньше» (<), «больше или равно» (>=), «неравно»
(О), «меньше или равно» (<=). (Обратите внимание на то, что
знаки >=, О и <= вводятся нажатием клавиш Q, W и Е одно-
временно с SS).

< Действие > — это любой
оператор Бейсика либо це-
почка операторов, разде-
ленных двоеточием. При
истинности условия вы-
полняться будет весь
«хвост» строки следом за
THEN.

В нашем примере усло-
вием является Rub=0, а
действием — оператор
STOP. Программа после
включения новых строк
приобретет такой вид:

10 INPUT "Текущий курс (руб. за 1$): "; Kurs

33 PRINT AT 0,1; "Текущий курс: "; Kurs; " рублей за 1$"

34 PRINT AT 15, 0; "Для окончания работы введите 0"

35 INPUT " Сумма (руб.): "; Rub

62 IF Rub=0 THEN STOP

70 LET Dol=INT(Rub/Kurs* 100+0.5)/100: REM Расчет

75 PRINT AT 1, 1; Rub; " руб. - ";"$"; Dol:"

80 GO TO 35

Если условие, стоящее за IF, не выполняется (ложно), то компь-
ютер, не обращая внимания на THEN, переходит к следующей
строке программы.

Ввод символьных данных

INPUT, INPUT LINE

Конечная цель программиста — не написание программы, кото-
рая в принципе как-то работает, а создание такого продукта, кото-
рый был бы защищен от ошибочных действий пользователя. Что,
например, произойдет, если при работе с нашей программой ввес-
ти вместо числа букву (это можно сделать и чисто случайно,
скажем, перепутав букву О с цифрой 0)? Программа «вывалится»,
но не нормальным образом, а с сообщением об ошибке: Variable not
found. Должны мы предотвратить подобные ситуации? Конечно.

Компьютер не будет ругаться на нажатие любой клавиши, если
попросить оператор INPUT ожидать ввода символьного значения.
Сделать это просто — надо подставить в INPUT вместо числовой
переменной символьную:

35 INPUT " Сумма (руб.): "; R$

На то, что ожидается ввод именно символьного значения, поль-
зователю укажут кавычки, в которые INPUT заключит курсор и
вводимый текст. От кавычек на экране можно избавиться, если
перед символьными переменными, стоящими за INPUT, ставить
ключевое слово LINE:

35 INPUT " Сумма (руб.): "; LINE R$

Хорошо, но в конечном итоге нам ведь необходимо получить
число, а не символы.

Символьное значение, введенное с помощью INPUT LINE, преоб-
разуем в числовое, используя функцию VAL:

60 LET Rub=VAL R$

К сожалению, этим проблема защиты от ошибочного ввода не
решена. Ведь если теперь будет введено не числовое значение, то
ошибку «выкинет» уже функция VAL. У нас остается один выход —
проверить каждый введенный символ: является ли он цифрой или
нет. Сделать это можно, анализируя коды введенных символов.

Для начала выделим как подстроку первый символ и определим
его код:

40 LET Cod=CODE R$(1)

Далее проверим, попадает ли он в интервал от 48 до 57 (коды,
соответствующие цифрам от 0 до 9, см. табл. 1 на стр. 100). Если
символ не цифра, переходим на строку 100:

42 IF Cod<48 THEN GO ТО 100

45 IF Cod>57 THEN GO TO 100

В 100-й строке мы в дальнейшем организуем обработку ошиб-
ки.

Логические операции

OR, NOT, AND

В этом месте немного отвлечемся от нашей программы и посмот-
рим, как можно две строки с номерами 42 и 45, проверяющие
различные условия, заменить одной. Этот частный пример введет
нас в пространство логических операций.

Логика оперирует с несколькими условиями и помогает делать
вывод об истинности или ложности их сочетаний. Например, в
нашей программе необходимо выяснить, выполняется ли хотя бы
одно из двух условий: Cod<48 ИЛИ Cod>57. Нет ничего проще.
Надо только русское ИЛИ заменить на английское, то есть на
логический оператор OR:

Cod <48 OR Cod >57

Это объединенное условие истинно, если верно любое из срав-
нений. Учитывая, что истинное выражение принимает значение 1,
а ложное — 0, можно записать:

х OR у = 1, если либо х=1, либо у=1, либо и х=1, и у=1

х OR у = 0, только если х=0 и у=0

Проверить, что введенный символ не цифра, можно и другим
способом: выяснить, не попадает ли его код в промежуток от 48
до 57, то есть НЕ выполняются ли одновременно два условия:
Cod>48 И Cod<57. Заменив НЕ на логический оператор NOT, а И —
на AND, запишем:

NOT(Cod>48 AND Cod<57)

Выражение в скобках будет истинно только в том случае, если
истинны оба условия. Так и запишем:

х AND у = 1, только если х=1 и у=1
х AND у = 0, если либо х=0, либо у=0, либо х=0 и у=0

Логический оператор NOT — это оператор отрицания. Из ис-
тинного утверждения он делает ложное и, наоборот, из ложного —
истинное:

NOT х = 0, если х=1
NOT х = 1, если х=0

Вот и все логические операции, существующие в Spectrum-Бей-
сике. В качестве примера посмотрим, в каком случае может быть
истинно утверждение мальчика Вовочки: «Я сегодня буду есть
мороженое» (доллары пока в сторону). Итак, начнем:

(«Мама даст денег»
AND

((«будет работать магазин» AND «там будет мороженое»)
OR

(«будет работать киоск» AND «там будет мороженое»))
AND NOT
«пойдет дождь»)
OR

(«мороженое принесет папа»
AND NOT

«мама оставит мороженое в холодильнике до завтра»)

Вот такая ЛОГИКА.

Теперь вместо двух строк нашей «валютной» программы, прове-
ряющих, что введенный символ — цифра, можно записать одну:

45 IF CODE R$(1)<48 OR CODE R$(1)>57 THEN GO TO 100

В этой строке мы избавились от лишней переменной Cod.

Такую проверку надо организовать для каждого символа пере-
менной R$, то есть продолжить:

46 IF CODE R$(2)<48 OR CODE R$(2)>57 THEN GO TO 100

Однако если кто-нибудь захочет перевести в доллары, скажем, 3
рубля (ха-ха!), и, следовательно, переменная R$ будет состоять
вс&го из одного символа, то программа в строке 46 «вылетит» по
ошибке (параметр в сечении превысит пределы допустимого). В
подобных случаях необходимо сначала определить длину символь-
ной переменной и выполнить проверку столько раз, сколько сим-
волов в переменной R$, то есть организовать цикл.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Воросы Чапаю - мы банда.
Игротека - Потрясающий шедевр: описание игры 8-й отдел.
Hackers - парочка программ для Вас.

В этот день...   14 декабря