DARK BASIC
ОБЩИЕ ВЫРАЖЕНИЯ
ВЫРАЖЕНИЯ ПРИСВОЕНИЯ
Выражение присвоения, которое вы уже использовали, является, наверное, самой распространенной составляющей любого языка программирования. Для присвоения значений переменным или массивам используется символ равенства (=):
a=42
a#=99.9
a$="Здравствуй"
lottery(1,1)=49
ОПЕРАТОРЫ DATA И READ
Порой приходится хранить данные в самой программе. Возьмем наш пример с лотереей. Гораздо удобнее создать в конце программы список выигрышных номеров и просто добавлять в него новые. С помощью операторов DATA и READ можно произвести следующие действия:
DATA 9,"ДЕВЯТЬ",9.9
READ a,a$,a#
Оператор DATA принимает несколько элементов данных, разделенных запятыми. Эти элементы могут быть разного типа, но считываться они должны в определенном порядке. Как видите, первый элемент данных является целым числом 9, второй - символьной строкой "ДЕВЯТЬ", за которой следует вещественное число 9.9.
Оператор READ также считывает в качестве параметров список, но он также должен содержать переменные определенного типа для избежания ошибки при считывании. Когда считывается один элемент данных, указатель перемещается к следующему элементу списка. Первый элемент - целое значение. Это означает, что число 9 будет успешно присвоено переменной целого типа А. Указатель данных перемещается к следующему элементу, которым является строка со значением "ДЕВЯТЬ". Она считывается и присваивается строковой переменной A$. То же самое относится к вещественному числу 9,9.
В памяти компьютера этот список данных выглядел бы так:
9
"ДЕВЯТЬ"
9.9
Если бы вы попытались считать целое число 9, результатом явилась бы пустая строка, так как эти типы несовместимы. Если попытаться считать строку символов в качестве целой или вещественной переменной, ей будет присвоено нулевое значение. Вы сами должны позаботиться о том, чтобы типы присваиваемых данных соответствовали типам считываемых.
ОПЕРАТОР RESTORE
С помощью оператора RESTORE можно в любое время восстановить указатель считывания и переместить его на первый элемент. Например, если пользователь хочет очистить экран и перерисовать его, а данные уже считаны, необходимо считать их заново. После восстановления указателя оператор READ начнет считывать данные с самого начала.
Можно также создать несколько списков данных. Например, если вам требуется не только список выигрышных номеров, но и номера лотерейных билетов, необходимо сформировать два отдельных списка:
lotterydata:
DATA 12,23,34,45,56,67
DATA 23,34,45,56,67,11
DATA 34,45,56,67,33,22
ticketdata:
DATA 01,02,03,04,05,06
DATA 21,32,43,24,13,22
Чтобы вывести на экран первый набор данных, нужно, прежде всего, поместить на него указатель считывания. Это делается с помощью оператора RESTORE, при этом в качестве параметра следует указать метку, которая предваряет список. Метка объявляется путем добавления символа двоеточия (:) в конец ее имени.
RESTORE lotterydata
READ a,b,c,d,e,f
PRINT "LOTTERY ",a,b,c,d,e,f
Чтобы вывести на экран первый номер билета из второго списка данных, следует указать имя второй метки:
RESTORE ticketdata
READ a,b,c,d,e,f
PRINT "TICKET ",a,b,c,d,e,f
Существуют более удобные способы считывания данных из списка, но эти простые примеры демонстрируют, как получить доступ к нескольким спискам.
ОПЕРАТОРЫ ПЕРЕХОДА
Обычно программа выполняет команды последовательно, начиная с первой. Операторы перехода позволяют "перескакивать" к другой части программы. Команда GOSUB переходит к определенной метке и продолжает выполнение с нее. Если встречается команда RETURN, программа возвращается к GOSUB. Возьмем следующий пример:
PRINT "Здравствуй,"
GOSUB MySubroutine
END
MySubroutine:
PRINT "мир"
RETURN
Программа выведет на экран текст "Здравствуй,", затем перейдет к строке MySubroutine и продолжит выполнение. Следующий оператор выведет на экран текст "мир". Затем команда RETURN вернет программу на строку, откуда начался переход, и выполнит следующую за GOSUB команду END.
Оператор GOTO не помнит, откуда он совершил переход, поэтому будет продолжать выполнение с нового места, не возвращаясь на старое. Не рекомендуется часто использовать этот оператор, поскольку существуют более удобные способы управления программой. Тем не менее, приведем пример простой команды GOTO:
MyLabel:
PRINT "Здравствуй, мир";
GOTO MyLabel
Или в качестве альтернативы:
DO
PRINT " Здравствуй, мир";
LOOP
Согласитесь, что последний код более элегантный и "дружественный" и позволяет избежать использование оператора GOTO. Оператор GOTO остался в языке DarkBASIC для совместимости с более старыми версиями Бейсика.
Выражение FOR NEXT
Выражение FOR NEXT уже использовалось в предыдущих примерах. С его помощью создается цикл, в котором переменная увеличивается или уменьшается на определенное значение.
FOR T=1 TO 5
PRINT T;" ";
NEXT T
PRINT "Готово"
Вывод на экран будет выглядеть следующим образом:
1 2 3 4 5
Программа установит значение Т, равным 1, затем перейдет на следующую строку к оператору PRINT. После этого оператор NEXT вернет выполнение к команде FOR и увеличит значение Т до 2. Оператор PRINT выведет новое значение Т. Это продолжается до тех пор, пока Т не примет значение 5. Цикл заканчивается, и программа продолжает выполнение. Следующий после NEXT оператор выводит на экран "Готово", показывая, что цикл закончился.
Можно также создавать вложенные циклы, помещая одно выражение NEXT FOR в тело другого:
FOR A=1 TO 5
PRINT "ОСНОВНОЕ A=";A
FOR B=1 TO 10
PRINT "ПОДЧИНЕННОЕ B=";B
NEXT B
NEXT A
Выражение FOR NEXT увеличивает основную переменную А от 1 до 5, но при каждом цикле А выражение FOR NEXT внутри первого цикла увеличивает свою переменную В от 1 до 3. Эту конструкцию называют вложенным циклом, так как внутренний цикл вкладывается в тело внешнего.
Такие циклы наиболее удобны при обработке массивов данных. Переменные цикла увеличиваются и последовательно обозначают индексы массива. Например, мы можем вывести список выигрышных номеров следующим образом:
FOR week=1 TO 52 STEP 4
PRINT "Выигрышные номера за неделю ";week; " - ";
FOR index=1 to 6
PRINT lottery(week,index);" ";
NEXT index
NEXT week
Обратите внимание на новую команду STEP, добавленную в конец выражения FOR NEXT. Она используется для изменения увеличения (инкремента) переменной цикла со значения по умолчанию равного 1 на другое значение. В нашем случае программа выведет выигрышные номера только для каждой четвертой недели.
Выражение IF THEN
Оператор IF позволяет контролировать поток выполнения программы. Он требует оценки некоего выражения отношения, результатом которой является или "истина" или "ложь". Если результат "истина", выполняются команды, следующие за оператором THEN. Если - "ложь", программа переходит на следующую строку и игнорирует оставшиеся операторы. Например:
INPUT "Введите свой возраст>",age
IF age>=16 THEN PRINT "Вы можете купить лотерейный билет"
Если пользователь вводит значение, равное или больше 16, программа выводит это сообщение. Мы показали самый простой способ использования выражения IF THEN. Чтобы понять, как оно работает, нужно подробнее проанализировать оператор IF. Вначале возьмем выражение отношения
age>=16
Мы уже знаем, что он возвращает 0 или 1, если введенная цифра, обозначающая возраст, больше или равна 16. Оператор IF считает значение 0 ложью, а все остальные - истиной. Тем самым мы можем определить, что если указанный возраст больше или равен 16, результатом будет 1, т. е. с точки зрения оператора IF - истина.
Выражением отношения может быть любое сочетание значений, переменных, массивов и операторов при условии, что оно имеет смысл. Следующие выражения верны:
IF A THEN PRINT "правильно"
IF A = B THEN PRINT "правильно"
IF A > (B - 5) THEN PRINT "правильно"
IF A = (B + (A * 2)) THEN PRINT "правильно"
IF A=1 AND B=2 THEN PRINT "правильно"
IF NAME$="ФРЕД" AND SURNAME$="БЛОГГС" THEN PRINT "правильно"
IF A#=1.5 OR LOTTERY(10,2)=20 THEN PRINT "правильно"
А эти выражения не верны:
IF A = B = THEN PRINT "неправильно"
IF > A = B THEN PRINT "неправильно"
IF A B THEN PRINT "неправильно"
IF AND A THEN PRINT "неправильно"
IF B OR THEN PRINT "неправильно"
В случаях, если после THEN не хватает одной строки, можно использовать выражение IF ENDIF. Используя уже рассмотренную логику, поместите команды в отдельных строках после IF, затем отметьте конец исполняемых команд оператором ENDIF, как в следующем примере:
IF A = B
PRINT "Привет, A и B!"
ENDIF
Это то же самое, что и
IF A = B THEN PRINT "Привет, A и B!"
Однако главное преимущество этого метода заключается в том, что первую строку исходного кода можно изменить следующим образом:
IF A = B
PRINT "Привет, A!"
PRINT "Привет, B!"
PRINT "Привет, A и B!"
PRINT "Привет, B и A!"
PRINT "Привет всем!"
ENDIF
Можно также задать ответное действие, если выражение отношения окажется ложью. В случаях, когда при ложном условии необходимо выполнить другие строки программы, используется оператор ELSE.
IF A = B
PRINT "Значения одинаковые!
ELSE
PRINT "Значения разные!"
ENDIF
Важно помнить, что в расширенном варианте всегда применяется ENDIF. Обратите внимание, что ENDIF помещается в конец выражения, независимо от того, используется или нет оператор ELSE.
Оператор PRINT
Оператор PRINT может выводить более одного значения. Он принимает список параметров, разделенных запятыми, причем данные в списке параметров могут быть любого типа. Хотя в предыдущих примерах мы часто применяли оператор PRINT, у него есть несколько особенностей, о которых вы можете не знать.
Когда оператор PRINT используется для вывода на экран, отдельные буквы печатаются слева направо, а когда вывод заканчивается, курсор переходит на следующую строку. Каждый последующий оператор PRINT будет печатать с новой строки. Перехода на следующую строку можно избежать, если в конец строки параметров добавить символ точка с запятой (;). Например:
PRINT "Привет, ";
PRINT "мир"
Таким же образом с помощью этого символа можно отделять данные в строке параметров, например:
PRINT "Меня зовут, ";name$, " мне ";age;" лет."
Кроме того, с помощью команды SET CURSOR можно поместить текстовый курсор в любое место экрана. В следующем примере текст будет выводиться случайным образом по всему экрану:
DO
SET CURSOR RND(640),RND(480)
PRINT "ТЕКСТ"
LOOP
Кроме названных, в DarkBASIC существует еще ряд сложных команд управления текстом, обрабатывающих шрифты, их цвет, размер и стиль. О них вы узнаете в других разделах справочной системы и руководства пользователя.
Оператор INPUT
Хотя команда INPUT используется редко, она предоставляет очень простой способ получить от пользователя числовые и символьные данные. Определенный тип значения можно получить, используя переменную этого типа, например:
INPUT a$
Это выражение принимает ввод символьных данных пользователя. Если будет введено число, оно будет храниться в виде символьной строки в символьной переменной A$. В программе можно использовать приглашение для ввода определенного типа данных:
INPUT "Введите пароль: ",password$
В этом примере пользователь получает приглашение и вводит свой пароль. Пароль присваивается символьной переменной, как только пользователь нажмет клавишу ввода. То же самое относится к целым и вещественным переменным.
Операторы END и BREAK
Оператор END завершает выполнение программы. Если вы запустили ее из редактора, то вернетесь в интерфейс командной строки (CLI). Применение команды END не позволяет продолжить выполнение программы после ее завершения. Если программа запускается как автономный исполняемый файл, то после ее завершения пользователь возвращается в Windows.
Если в программе встретится оператор BREAK, ее выполнение будет приостановлено, но не завершено. Оператор BREAK используется для приостановки программы и выхода в интерфейс командной строки для отладки. После BREAK выполнение можно продолжить.
Щелкните здесь, чтобы перейти в
следующий раздел
.