Добавлен: 01.04.2023
Просмотров: 108
Скачиваний: 2
LET имя.переменной = содержимое переменной
Использование оператора LET не является обязательным, формат
имя.переменной = содержимое переменной
тоже является верным и не нарушает синтаксис[22]. В качестве содержимого переменной при объявлении имени может выступать результат математической операции, объединения строк (конкатенация), любой другой функции/оператора, например: LET int25 = 5*5. Способы указания типа содержимого переменной рассмотрены далее.
Принудительно указать тип переменной можно тремя способами[23]:
- явное указание типа с помощью соответствующего символа, добавляемого к имени переменной, например: k%, factorial&, summa!, integral#, str$, где: k% – признак целой переменной, factorial& – признак длинной целой переменной, summa! – признак переменной одинарной точности (Подробнее о типах см. раздел 2.4).
- неявное указание типа переменной по первой букве ее имени при помощи оператора DEF:
DEFтип {буква|диапазон_букв}[,{буква|диапазон_букв}]…
где тип соответствует одному из зарезервированных типов: INT — тип integer, LNG — тип long, SNG — тип single, DBL — тип double, STR — тип string, буква – первая буква имен переменной, диапазон_букв – набор латинских символов в алфавитном порядке, которые являются первыми буквами имен переменных. Например:
DEFINT i-n (переменные, чьи имена начинаются на i, k, l, m, n, теперь имеют тип INTEGER – целая переменная, см. 2.4);
DEFSTR a,r-t (переменные, чьи имена начинаются на a, r, s, t, теперь имеют тип STRING – строка символов, см. 2.4);
- явное указание типа переменной при помощи оператора DIM:
DIM имя AS тип [, DIM имя AS тип]…
где имя – имя переменной, тип – тип содержимого переменной, например: DIM str1 AS STRING, index AS INTEGER
QBasic позволяет произвести обмен содержимым переменных через оператор SWAP. В качестве параметра обязательно передаются два параметра – имена переменных. Фактически происходит изменение имен-ссылок на адреса памяти. Например:
LET A = 1 ← объявляем переменную А с содержимым 1;
LET B = 2 ← объявляем переменную B с содержимым 2;
SWAP A, B ← вызов оператора с передачей параметров;
PRINT A ← вывод на экран содержимого переменной A: 2;
PRINT B ← вывод на экран содержимого переменной B: 1.
2.5.2 Массивы
QBasic позволяет работать с массивами, при этом объявление и работа с массивом во многом аналогична работе с переменной. Технически работа с массивом и есть работа с имененем-указателем на блок данных в памяти. В QBasic массив называется индексированной переменной (см. раздел 2.2). Для работы с массивами используются операторы DIM, ERASE и REDIM[24]. Параметры операторов:
имя – имя массива или простой переменной, правила написания соответствуют правилам для имени переменной;
индексы – константы, переменные или арифметические выражения, разделенные запятыми, максимальные значения которых определяют величину массива, а число индексов – размерность массива. Индексы вводятся в формате: [начало TO] конец
начало и конец – устанавливают нижнюю и верхнюю границы индексов массива из диапазона -32768 до 32767. Если отсутствует параметр начало, то он равен нулю;
тип – устанавливает тип элементов массива или простой переменной. В случае отсутствия, параметр по умолчанию – SINGLE;
SHARED – атрибут, который предписывает переменную или массив сделать глобальным (см 2.5.1).
Оператор DIM (DIMension – резервирование места). Примеры объявления:
DIM SHARED a(50), b(10 TO 100) AS DOUBLE
В данном примере объявлено два массива:
- с именем a одномерный массив с данными типа двойной точности, содержащий 51 элемент (условно 51 переменную): a(0), a(1), …, a(50);
- с именем b двухмерный массив с данными типа двойной точности, индексы которого меняются от 10 до 100.
DIM wiza(100,100)
В данном примере объявлен массив с именем wiza, содержащий 101*101 элемент с типом по умолчанию (SINGLE).
DIM k%(15), k!(15), k#(15), k$(15)
В данном примере объявлены 4 массива, формально имеющие одно и то же имя – k, но, фактически, это совершенно разные массивы с разными типами данных по 16 элементов в каждом: k# – массив элементов двойной точности, k$ – массив строковых переменных и т. д.
Следующие три оператора/команды эквивалентны:
- DIM f(8,3)
- DIM f(0 TO 8, 0 TO 3)
- DIM f(8, 0 TO 3)
Объявление массивов с отрицательными границами возможно только в следующем формате: DIM s(-4 TO 10), b(-99 TO -5, -3 TO 0).
Оператор ERASE (ERASE – стирать) – этот оператор используется для управления памятью, обнуления элементов статических массивов (см. STATIC раздел 2.5.1) и удаления динамических массивов.
Синтаксис оператора: ERASE имя_массива
Оператор REDIM – предназначен для переопределения границ объявленного ранее динамического массива. Например:
DIM a(49, 49) ← объявление динамического массива
REDIM a(19, 14) ← переопределение границ динамического массива
3. Управляющие операторы, организация циклов и передача управления
При запуске программы, написанной на языке QBasic, операторы выполняются последовательно, в порядке из записи в коде, передача управления к следующему оператору происходит только при завершении предыдущего. В случае необходимости организации цикличности или ветвления предусмотрены операторы передачи управления[25]. Такие операторы можно выделить в три группы:
- операторы ветвления – позволяют реализовать структурное программирование;
- операторы цикла – позволяют многократно выполнять группу операторов;
- оператор безусловного перехода[26].
При этом, общим признаком для операторов ветвления и операторов цикла является наличие условия для работы оператора, в отличии от оператора безусловного перехода.
3.1 Операторы ветвления
Операторы ветвления – это операторы передачи управления, предназначенные для изменения порядка выполнения операторов в соответствии с заданным условием[27]. Операторами ветвления являются:
-
-
- IF...THEN...ELSE (подробно описан далее по тексту в качестве примера структуры синтаксиса);
- CASE...SELECT (описание отсутствует, так как выходит за рамки задач курсовой работы).
-
Оператор IF...THEN...ELSE (если…тогда...иначе). Полная форма записи при однострочной записи:
IF условие THEN оператор/ы группы 1 ELSE оператор/ы группы 2
Полная форма записи при многострочной записи (добавляется END IF для определения окончания конструкции ветвления):
IF условие THEN
оператор/ы группы 1
ELSE
оператор/ы группы 2
END IF
Принцип работы заключается в вычислении условия (ИСТИНА/ЛОЖЬ) и передаче управления одной из групп операторов. Если условие истинно (например 1=1), то выполняется оператор/ы группы 1, после выполнения управление передается оператору, который идут после конструкции ветвления игнорируя оператор/ы группы 2. Если условие ложно (например 1=2), то выполняется оператор/ы группы 2, после выполнения управление передается оператору, который записан после конструкции ветвления игнорируя оператор/ы группы 1.
Блок-схема:
Условие всегда содержит знак сравнения для вычисления истинности:
- < – меньше;
- > – больше;
- = – равно;
- <= – меньше или равно;
- >= – больше или равно;
- <> – не равно;
Кроме того, условия могут быть простыми и сложными[28]. Простое условие содержит одно вычисление (например, 1=1), сложное условие состоит из двух и более простых условий через союзы AND или OR. Союз AND – каждое из простых условий должно быть истинно (например, 1=1 AND 2=2). Союз OR – одно из простых условий должно быть истинно (например, 1=2 OR 1=1).
Пример ветвления с простым условием (однострочная запись):
IF 1=1 THEN PRINT "1=1" ELSE PRINT "1<>1"
Пример ветвления с простым условием (многострочная запись):
a = 1
b = 2
IF a=b THEN
PRINT "число 1 рано числу 2 (1=2)"
ELSE
PRINT "число 1 не равно числу 2 (1<>2)"
END IF
Пример ветвления со сложным условием (многострочная запись):
a = 1
b = 2
IF a>b OR a<b THEN
PRINT "число 1 больше или меньше числа 2"
ELSE
PRINT "число 1 равно числу 2"
END IF
Неполная[29] форма записи: IF условие THEN оператор/ы (или метка перехода). В неполной форме может быть опущен оператор ELSE, тогда, при невыполнении условия, управление передается следующему в коде оператору, записанному после конструкции оператора ветвления.
Пример:
IF 1=2 THEN
PRINT "эта строка никогда не будет исполнена"
END IF
PRINT "эта строка всегда будет выполнятся, независимо от условия"
Расширить оператор ветвления можно при помощи ключевого слова ELSEIF[30]. Пример записи:
a = 1
b = 2
IF a=b THEN ← условие ложно
PRINT "a = b" ← этот оператор не будет запущен
ELSEIF a>b THEN ← условие ложно
PRINT "a > b" ← этот оператор не будет запущен
ELSEIF a<b THEN ← условие истинно
PRINT "a < b" ← этот оператор будет запущен
END IF
Число вставок ELSEIF не ограничено. Оператор CASE...SELECT структурно похож на оператор IF...THEN...ELSE с ключевым словом ELSEIF.
3.2 Операторы цикла
Операторы цикла позволяют определенный набор операторов выполнить какое-то (обычно известное) число раз образуя цикл операций – циклический алгоритм[31][32].
Список операторов цикла:
-
-
- FOR...NEXT (цикл со счетчиком)
- WHILE...WEND (цикл с проверкой условия)
- DO...LOOP (цикл с проверкой условия)
-
Оператор FOR...NEXT (для...следующий). Формат записи:
FOR переменная цикла = нзп TO кзп ← начало цикла
группа операторов ← тело
NEXT переменная цикла ← конец цикла
Этот оператор/цикл состоит из двух частей:
- начало цикла, где, нзп – начальное значение переменной цикла, кзп – конечное значение переменной цикла. По умолчанию шаг равен единице, для изменения шага используется ключевое слово STEP (первая строка будет иметь следующий вид «FOR переменная цикла = нзп TO кзп STEP шаг», где шаг, это шаг изменения переменной);
- конец цикла, где проверяются значения переменной и принимается решение, если переменная цикла > конечного значения (кзн), то управление передается оператору, следующему за NEXT, а если переменная цикла <= конечного значения (кзн), то переменная цикла увеличивается на заданный в операторе шаг (по умолчанию на единицу) и последовательно запускаются все операторы в теле цикла.
Оператор WHILE...WEND (WHILE – пока; While END – конец цикла)[33]. Формат записи: