ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ QuickBASIC

 

Изучаемые темы:

 

1. Начальные сведения о языке программирования BASIC.

2. Операторы языка QuickBASIC 4.5.

3. Среда QuickBASIC 4.5.

4. Модульное программирование.

5. Простейшие графические возможности языка QuickBASIC 4.5.


Тема № 1

НАЧАЛЬНЫЕ СВЕДЕНИЯ О ЯЗЫКЕ ПРОГРАММИРОВАНИЯ BASIC

(на примере QuickBASIC 4.5)

 

Вопросы: 1. Алфавит и типы данных.

                  2. Операции и выражения.

 

1. Алфавит и типы данных

 

1.1. Алфавит

 

Алфавит QuickBASIC включает в себя буквы, цифры, символы и зарезервированные слова:

a) буквы - латинские (прописные и строчные) от A до Z;

б) цифры - арабские от 0 до 9 и шестнадцатеричные от 0 до 10 (первые 10 - арабские,  остальные шесть латинские буквы - (A - F) или (a - f);

в) символы - + - * / = ,  . : ; < > [ ] ( ) { } ', $, пары <> <= >= := (* *) (.  .), пробел (символы (.  .) соответствуют символам [ ], несколько пробелов считаются одним);

г) зарезервированные слова (всего более 200) - ABS, AND, APPEND, AS, CALL, CASE, CONST, COS, DATA, DECLARE, DIM, DO, ELSE, ELSEIF, END, ENDIF, FOR, FUNCTION, GOTO, IF, INPUT, INTEGER, LONG, LOOP, MOD, NAME, NEXT, NOT, OR, OUTPUT, READ, RETURN, RUN, SELECT, SIN, SQR, STEP, STRING, SUB, TAN, THEN, TO, TYPE, UNTIL, VAL, WEND, WHILE, WRITE.

 

1.2. Типы данных

 

1.2.1. Числовые и символьные типы данных

 

Числовые данные представляют собой числа. Они бывают следующих типов: целые, длинные целые, обычной точности, двойной точности.

Целые (INTEGER) - занимают в памяти 2 байта и используются для значений в диапазоне от -32768 до +32769;

Длинные целые (LONG) - 4 байта. Используются для значений в диапазоне от -2 147 483 648 до +2 147 483 647. Они используются в тех случаях, когда необходимы операции с целочисленными переменными, выходящими за рамки диапазона целых чисел в представлении QuickBASIC;

Обычной точности (SINGLE) - 4 байта. Используются для значений в диапазоне от -3.402823Е+38 до -1.40129Е-45 для отрицательных значений и от +1.40129Е-45 до -3.402823Е+38 для положительных значений;

Двойной точности (DOUBLE) - 8 байт.  Используются для значений в диапазоне от 1.797693134862316Е+308 до -4.94965Е-324 для отрицательных значений и от 4.94965Е-324 до 1.797693134862316Е+308 для положительных значений. Обычно применяются для точных математических вычислений, не допускающих потерю значности.

К символьным типам данных относятся:

строка переменной длины (STRING) - это последовательность длиной до 32567 символов из таблицы ASCII (American Standart Coding for Information Interchange - Американский Стандартный Код для Обмена Информацией). В памяти она занимает столько байт, какова ее длина +4 байта на описатель;

строка фиксированной длины (STRING * num) – символьная строка длиною num байт. В памяти такая строка занимает num байт.

 

1.2.2. Константы

 

Константа - это величина, которая в ходе выполнения программы принимает одно значение. В языке QuickBASIC имеются два типа констант - неименованные и именованные.

Неименованные константы бывают символьными или числовыми:

символьные константы - это последовательность до 32767 алфавитно-числовых символов (за исключением кавычек и символов перевода каретки и пропуска строки). Они обязательно должны заключаться в кавычки, например:

PRINT "Средняя заработная плата";

числовые константы представляют собой положительные или  отрицательные числа. Они могут быть целые или длинные целые, обычной или двойной точности.

Именованные константы также бывают символьные и числовые, тех же типов, что и неименованные. Чтобы использовать именованную константу, ее необходимо объявить при помощи ключевого слова CONST, например:

CONST MaxArray% = 512

В этом примере объявляется целочисленная константа MaxArray и ей присваивается значение 512. В дальнейшем к этой константе можно обращаться по имени.

Символьная константа объявляется и используется аналогично:

CONST BAD$ = "mbt120eee12c"

знак $ означает, что это строка символов ( для различия числа «123» и строки «123».

 

1.2.3. Переменные

 

Переменная - это величина, которая может меняться при выполнении программы.

Переменные бывают простые (символьного типа, числового типа и пользовательского типа) и переменные-массивы, представляющие собой группу объектов одного типа.

Имена переменных могут содержать до 40 символов. В имени переменных могут содержаться латинские буквы, числа, десятичная точка и символы определения типа (%, &, !, #, $). Первый символ должен быть латинской буквой. Если переменная начинается с FN, то подразумевается вызов функции DEF FN. Имя переменной не может быть зарезервированным словом QuickBASIC, хотя допускается комбинация зарезервированного слова и других символов.

Переменные числового типа представляют собой числа. Они бывают целые (INTEGER), длинные целые (LONG INTEGER), обычной точности (SINGLE), двойной точности (DOUBLE):

Целые (INTEGER) - занимают в памяти 2 байта и используются для значений в диапазоне от -32768 до +32768. Присвоить переменной целый тип можно следующим образом:

а) поставить в начало программы оператор объявления целого типа данных DEFINT (DEFINED INTEGER)

DEFINT A-Z

Flag = 1

б) явно задать переменную с помощью суффикса "%"

       Flag% = 1

в) использовать оператор описания переменной

       DIM Flag AS INTEGER

Длинные целые (LONG) - 4 байта. Используются для значений в диапазоне от -2,147,483,648 до +2,147,483,647. Они используются в тех случаях, когда необходимы операции с целочисленными переменными, выходящими за рамки диапазона целых чисел в представлении QuickBASIC. Присвоить переменной длинный целый тип можно следующим образом:

а) поставить в начало программы оператор объявления длинного целого типа данных DEFLNG (DEFINED LONG)

        DEFLNG B-C

        BisunessTotal = 999999999

б) явно задать переменную с помощью суффикса "&":

        BisunessTotal& = 999999999

в) использовать оператор описания переменной:

        DIM BisunessTotal AS LONG

Обычной точности (SINGLE) - 4 байта. Используется для значений в диапазоне от -3.402823+38 до -1.40129-45 для отрицательных значений и от +1.40129Е-45 до -3.402823Е+38 для положительных значений. Если тип числовой переменной не задан (оператором DEF, суффиксом или оператором описания типа), то она автоматически становится обычной точности.

Присвоить переменной тип обычной точности можно следующим образом:

а) поставить в начало программы оператор объявления данных обычной точности DEFSNG (DEFINED SINGLE)

        DEFSNG S

        SingleValue = 123.321

б) явно задать переменную с помощью суффикса "!". Следует учесть, что поскольку переменная в QuickBASIC имеет тип обычной точности по умолчанию, то числовая переменная, у которой указан суффикс "!" и та, у которой этот суффикс отсутствует, считаются одинаковыми и не различаются языком QuickBASIC

        SingleValue! = 123.321

в) использовать оператор описания переменной

        DIM SingleValue AS SINGLE

Двойной точности (DOUBLE) - 8 байт. Используется для значений в диапазоне от 1.797693134862316Е+308 до -4.94965Е-324 для отрицательных значений и от 4.94965Е-324 до 1.797693134862316Е+308 для положительных значений. Обычно применяется для точных математических вычислений, не допускающих потерю значности. Присвоить переменной тип двойной точности можно следующим образом:

а) поставить в начало программы оператор объявления длинного типа данных DEFLNG (DEFINED LONG)

        DEFLNG D, M-P

        Determinant = 53.49852432

б) явно задать переменную с помощью суффикса "#"

        Determinant# = 53.49852432

в) использовать оператор описания переменной

        DIM Determinant AS DOUBLE

Переменные символьного типа (строки) - могут включать в себя любые символы из таблицы ASCII. Для присваивания значения символьной переменной, значение берется в кавычки. При этом следует заметить, что только символьным переменным можно присваивать значения, содержащие русские буквы.

Символьные переменные бывают переменной длины и фиксированной длины.

Строка переменной длины (STRING) - это  последовательность длиной до 32567 символов из таблицы ASCII. В памяти она занимает столько байт, какова ее длина + 4 байта на описатель. Присвоить символьной переменной тип строки переменной длины можно следующим образом:

а) поставить в начало программы оператор объявления типа строки переменной длины DEFSTR (DEFINE STRING)

        DEFSTR L

        Language = "Изучаем язык QuickBASIC"

б) явно задать переменную с помощью суффикса "$"

        Language$ = "Изучаем язык QuickBASIC"

в) использовать оператор описания переменной

        DIM Language AS STRING

Строка фиксированной длины (STRING * num) – символьная строка длиною num байт. В памяти такая строка занимает num байт.

Присвоить символьной переменной тип строки переменной длины можно, используя оператор описания переменной

        DIM Language AS STRING * 23

        Language = "Изучаем язык QuickBASIC"

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

Описания всех типов данных сведены в таблицу 1:

Таблица 1

 

Суффикс

Описание

AS_тип

Объявление

DEF_тип

Тип переменной

Занимаемый объем

%

INTEGER

DEFINT

Целая

2 байта

&

LONG

DEFLNG

Длинная целая

4 байта

!

SINGLE

DEFSNG

Обычной точности

4 байта

#

DOUBLE

DEFDBL

Двойной точности

8 байт

$

STRING

DEFSTR

Строка переменной длины

Длина строки

+ 4 байта

$

STRING * num

 

Строка фиксированной длины

num байт

 

Пользователь-ский тип

 

 

Сколько занимают в сумме отдельные элементы

 

Если в программе используется группа однотипных переменных (например, оценки каждого студента в группе, дневная температура в течение месяца и т.д.), то такую группу однородных объектов удобно представить в виде массива переменных. Отдельные переменные в массиве называются элементами. Каждый элемент в массиве имеет номер (индекс), по которому можно обратиться к значению элемента. Индекс - числовое выражение целого типа. Размерностью называется число индексов, определяющих элемент массива. Например, V(10) - значение в одномерном массиве (векторе), T$(1,$) - двумерный массив (матрица). Количество элементов в массиве называется размером массива. По умолчанию размер любого массива принимается равным 10 элементам.

Каждый массив, используемый в программе, должен быть заранее объявлен оператором DIM (если размер массива не предполагается менять) или REDIM (если размер массива будет меняться).

При объявлении массива можно указывать границы его размерностей (верхнюю и нижнюю), например:

         A%(10), A%(11), A%(12), A%(13), A%(14)

         DIM A%(10 TO 14)

 

2. Операции и выражения

 

Последовательность операций, которые необходимо произвести над данными, чтобы получить требуемое значение называется выражением. Результатом выражения может быть символьная или числовая константа, переменная или значение.

В языке QuickBASIC определены следующие операции: арифметические, отношений, логические, функциональные, строковые.

 

2.1. Арифметические операции

 

В QuickBASIC существуют следующие арифметические операции, которые перечислены в порядке убывания приоритета выполнения:

 

^

возведение в степень

+, -

присвоение знака числу

*, /

умножение, деление

MOD

остаток после целочисленного деления

+, -

сложение, вычитание

 

2.2. Операции отношения

 

Эти операции используются для сравнения арифметических выражений. В QuickBASIC существуют шесть операций отношения:

 

=

равно

>

больше

<

меньше

<>

не равно

<=

меньше или равно

>=

больше или равно

 

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

 

Логические операции осуществляют манипуляции над битами. По другому они называются "булевы операции". Они возвращают значение "TRUE" (ИСТИНА - не нулевое значение, внутреннее представление QuickBASIC = 1) и "FALSE" (ЛОЖЬ - нулевое значение, внутреннее представление QuickBASIC = 0).

В QuickBASIC существуют шесть логических операторов, название и объяснение которых приведены в таблице 2.

Таблица 2

 

Оператор

Название

Объяснение

NOT

Отрицание

NOT A истинно тогда и только тогда, когда А ложно

AND

Логическое умножение

A AND B истинно тогда и только тогда, когда истинно А и истинно B

OR

Логическое сложение

A OR B истинно тогда и только тогда, когда хотя бы одно из А и B истинно

XOR

Исключающее ИЛИ

A XOR B истинно тогда и только тогда, когда значения A и B не совпадают

EQV

Эквивалентность

A EQV B истинно тогда и только тогда, когда А и В одновременно истинны или одновременно ложны

IMP

Импликация

A IMP B принимает значение “ложь” если А истинно, а В ложно, и значение “истина” в других случаях

 

2.4. Функциональные операции

 

Функциональные операции определяют правила работы с функциями. Функции используются в выражениях для осуществления заранее определенных операций.

В QuickBASIC существуют два вида функций: встроенные и определенные пользователем.

 

2.5. Строковые операции

 

Над строками можно осуществлять следующие действия - конкатенация (сложение) и сравнение строк.

Конкатенация - это сложение двух символьных строк. Для сложения используется символ (+). В примере результатом сложения переменных A$ и B$ является значение FILENAME:

     A$ = "FILE"

     B$ = "NAME"

     A$ + B$ = "FILENAME"

Сравнение строк производится при помощи операторов сравнения: <>,  =, <, >, <=, >=. Сравнение строк производится в соответствии с ASCII кодами каждого символа в сравниваемых строках. Если ASCII коды равны, то строки считаются равными. Строка, символы которой имеют большие ASCII коды, считается большей. Если одна из сравниваемых строк короче другой, то она считается меньшей (если до этого места строки были равными). При сравнении учитываются начальные и конечные пробелы. В примере приведены правильные операции сравнения:

     "AA" < "BB"

     "кг" > "КГ"

     "СТОЛБ" < "СТОЛБЫ"

 

2.6. Стандартные функции

 

Для вычисления наиболее распространенных математических функций и функций обработки данных в QuickBASIC предусмотрены следующие стандартные функции:

ABS - математическая функция, возвращающая абсолютное значение числового выражения.

ABS (числовое выражение)

EXP - математическая функция, вычисляющая основание натурального логарифма (число е) в степени заданного аргумента.

EXP (числовое выражение)

LOG - математическая функция, возвращающая натуральный логарифм числового выражения.

LOG (числовое выражение)

MOD - арифметическая операция нахождения остатка от целочисленного деления.

19 MOD 7 = 5

SQR - математическая функция, которая возвращает квадратный корень числового выражения.

SQR (числовое выражение)

ATN - математическая функция, возвращающая арктангенс числового выражения.

ATN (числовое выражение)

COS - математическая функция, возвращающая значение косинуса от угла в радианах.

COS (числовое выражение)

SIN - математическая функция, возвращающая значение синуса от угла в радианах.

SIN (числовое выражение)

TAN - математическая функция, возвращающая значение тангенса от угла в радианах.

TAN (числовое выражение)

RANDOMIZE - математический оператор, запускающий генератор случайных чисел.

RANDOMIZE (выражение любого типа)

FIX - математическая функция, возвращающая целую часть числового выражения.

FIX (числовое выражение)

INT - математическая функция, возвращающая первое целое, меньшее или равное данному числовому выражению.

INT (числовое выражение)

CINT - функция, преобразующая числовое выражение в целое число путем округления дробной части выражения.

CINT (числовое выражение)

CLNG - функция преобразования, приводящая числовое выражение к длинному целому (4 байта) путем округления дробной части.

CLNG (числовое выражение)

CSNG - функция, преобразующая числовое выражение в значение обычной точности.

CSNG (числовое выражение)

CDBL - функция, преобразующая числовое выражение в значение двойной точности.

CDBL (числовое выражение)

STRING$ - символьная функция, возвращает строку, заполненную символами данного ASCII-кода или данным символом.

STRING$ (длина строки, АSCII-код символа - заполнителя строки)

 

Контрольные вопросы

 

1.      Что включает в себя алфавит языка QuickBASIC?

2.      Что представляют собой числовые данные и какие типы числовых данных используются в языке QuickBASIC?

3.      Какие данные относятся к символьным?

4.      Что такое константа и какие типы констант используются в языке QuickBASIC?

5.      Что такое переменная? Типы переменных.

6.      Дайте характеристику переменным числового (символьного) типа.

7.      Опишите массив переменных.

8.      Какие операции определены в языке QuickBASIC?

9.      Какие стандартные функции используются в языке QuickBASIC?


Тема № 2

ОПЕРАТОРЫ ЯЗЫКА QuickBASIC 4.5

 

Вопросы: 1. Операторы описания.

                 2. Операторы ввода-вывода.

                 3. Операторы передачи управления.

 

1. Операторы описания

 

К основным операторам описания языка QuickBASIC относятся следующие:

CONST - оператор, описывающий константы, которые используются вместо числовых или символьных значений.

CONST константа = выражение [,константа = выражение] ...

Здесь

константа - имя константы, допускаемое в языке QuickBASIC;

выражение - выражение, допускаемое в языке QuickBASIC.

Тип констант определяется по суффиксу в конце имени:

 

%

целочисленная константа

&

константа длинного целого

!

константа обычной точности

#

константа двойной точности

$

символьная константа

 

DEFтип - оператор описания типов переменных.

     DEFINT интервал [,интервал] ... - целый;

     DEFLNG интервал [,интервал] ... - длинный целый;

     DEFSNG интервал [,интервал] ... - обычной точности;

     DEFDBL интервал [,интервал] ... - двойной точности;

     DEFSTR интервал [,интервал] ... - символьный.

Здесь интервал имеет форму буква1[-буква2],

где буква1 и буква2 - любая из букв латинского алфавита.

Переменные и функции, чьи имена начинаются с букв, входящих в данный интервал имеют по умолчанию тип, определенный тремя последними буквами оператора (INT, SNG, DBL, LNG или STR).

DIM - оператор, объявляющий одну или несколько переменных и выделяющий для них необходимый объем памяти.

DIM [SHARED] переменная [(границы)] [AS тип]

[,переменная [(границы)] [AS тип] ...

Здесь

переменная - имя переменной или массива;

SHARED - атрибут SHARED предписывает всем процедурам в данном модуле совместно использовать массивы и переменные указанные в операторе DIM;

границы - границы размерности массива - верхняя и нижняя граница индексов; AS тип - определяет тип переменной - обычный или пользовательский. К обычным типам QuickBASIC относятся: INTEGER, LONG, SINGLE, DOUBLE, STRING. Границы массивов в операторе DIM имеют следующую форму: [меньшая TO] большая [,[меньшая TO] большая] ... Ключевое слово TO предоставляет возможность указать и нижнюю и верхнюю границы массива.

REDIM - оператор объявления массивов. Изменяет объем памяти, выделенной массивам $DYNAMIC (динамическим).

REDIM [SHARED] массив (границы ) [AS тип]

[, массив (границы) [AS тип]] ...

Здесь

SHARED - позволяет использовать элементы массива во всей программе;

массив - имя массива;

границы - границы размерности массива - верхняя и нижняя граница индексов; AS тип - описывает переменные обычного или пользовательского типа. Границы задаются следующим образом:

[нижняя TO] верхняя [,[нижняя TO] верхняя] ...

Ключ TO указывает на то, что определяются и верхняя и нижняя границы данной размерности массива.

TYPE - оператор описания QuickBASIC, определяющий тип данных, состоящих из нескольких типов - пользовательский тип.

     TYPE имя_типа

          элемент AS тип

          [элемент AS тип]

           . . .

     END TYPE

Здесь

имя_типа - имя пользовательского типа данных;

элемент - имя элемента пользовательского типа;

тип - типы данных языка QuickBASIC: INTEGER, LONG, SINGLE, DOUBLE, STRING * num или другой пользовательский тип.

REM - оператор, указывающий на комментарий.

REM комментарий ' комментарий,

где

комментарий - любой текст, который Вы вставляете в программу как пояснение. В комментарий можно включать и символы кириллицы. REM не компилируется, но сохраняется в исходном тексте программы. Комментарии нужны для программиста. Если программа хорошо документирована, т.е. дано объяснение ее работы, то с такой программой легко и удобно работать даже по истечении большого промежутка времени. Кроме того, при наличии комментариев Вы без труда разберетесь с программой, составленной другим программистом.

Вместо ключевого слова REM можно использовать апостроф ('). При записи комментария с использованием REM в конце строки операторов, комментарий необходимо отделять двоеточием, а при записи с использованием апострофа, двоеточие можно опускать.

 

2. Операторы ввода-вывода

 

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

Если значений немного, можно использовать операцию присваивания:

     Message$ = "Внимание!"

     Total = 555

Можно также использовать константы:

     CONST Message$ = "Внимание!", Total = 555

Однако для большого количества переменных необходимо использовать операторы ввода.

Основными операторами ввода в QuickBASIC являются следующие:

DATA - оператор, хранящий числовые и символьные данные для их последующего чтения оператором READ.

DATA константа [,константа]...

где

константа - любая числовая или символьная константа.

Если символьная константа содержит запятые, двоеточия, начальные или конечные пробелы, то она должна быть заключена в кавычки.

READ - оператор ввода, читающий данные из списка оператора DATA и присваивающий их значения переменным.

READ переменные

где

переменные - список переменных, разделенных запятыми. Эти переменные получают данные. Данные могут быть символьными или числовыми. Операторы READ всегда используются совместно с операторами DATA. READ присваивает значения из списка DATA своему списку переменных один к одному. Типы данных и переменных должны соответствовать: чтение числового значения в символьную переменную не приведет к ошибке, напротив, попытка считать символьную строку в числовую переменную вызовет ошибку "Type mismatch" (Ошибка в типе данных). Чтение числового значения, слишком большого для переменной также приведет к ошибке "Overflow" (Переполнение).

Если символьные строки длиннее, чем соответствующие переменные, то они усекаются. Если они короче, то дополняются справа пробелами и выравниваются по левой границе.

Оператором READ могут считываться только отдельные элементы переменных пользовательского типа.

Один оператор READ может читать несколько операторов DATA (данные должны идти в соответствующем порядке), и наоборот, несколько операторов READ могут читать один оператор DATA. Если список переменных больше, чем список данных, выдается сообщение об ошибке "Out of DATA" (Конец данных в операторе DATA). Если список переменных короче, чем список данных, следующий оператор READ начинает читать первый непрочитанный элемент; если данные не прочитаны никакими операторами READ, то они игнорируются.

INPUT - оператор ввода, считывающий данные с клавиатуры во время выполнения программы и размещающий их в списке переменных.

INPUT[;]["вопрос"{;|,}]переменные

где

; - точка с запятой сразу после INPUT оставляет курсор на той же линии экрана после нажатия клавиши ENTER; "вопрос" - символьная константа. Приглашение к вводу данных;

; - печатает знак вопроса после символьной строки;

, - печатает строку без знака вопроса;

переменные - список переменных, разделенных запятыми, принимающий введенные значения. Оператор INPUT останавливает программу и ждет ввода данных. Количество вводимых данных должно соответствовать количеству переменных в списке. Типы данных в списке и вводимых с клавиатуры должны совпадать.

LINE INPUT - оператор ввода, присваивающий вводимую строку (до 255 символов) символьной переменной без влияния знаков-разделителей.

LINE INPUT [;] ["вопрос";] символьная_переменная

где

"вопрос" - символьная константа, приглашение на ввод данных. Можно включить в нее знак вопроса "?"; символьная_переменная - принимает все символы до нажатия клавиши Enter. В отличие от оператора INPUT знак "?" после вопроса не выводится. Знак ";" перед вопросом сохраняет курсор на той же строке после нажатия клавиши Enter.

INPUT$ - функция ввода, читающая символьные строки с клавиатуры.

INPUT$(n)

где

n - количество символов, читаемых с клавиатуры.

Пример. Задержка исполнения программы до нажатия клавиши.

     CLS

     PRINT "Для продолжения нажмите любую клавишу"

     INPUT$(1)

     .  .  .

INKEY$ - функция ввода, читающая символы с клавиатуры.

INKEY$

Пример. Задержка до нажатия клавиши. PRINT "Нажмите любую клавишу..." DO LOOP WHILE INKEY$ = "" .  .  .

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

 

PRINT - оператор вывода, выдающий данные на экран.

PRINT [список_выражений][{,|;}]

где

список_выражений - выражения любого типа, кроме пользовательского. Символьные константы в списке выражений должны заключаться в кавычки.

Если все аргументы опущены, выводится пустая строка. Если список_выражений указан, то значения выражений выводятся на экран по порядку.

PRINT USING - оператор вывода, осуществляющий вывод на экран по указанному формату.

PRINT USING формат; список_выражений [{,|;}]

где

формат - символьное выражение, содержит специальные символы, управляющие представлением выводимых данных; список_выражений - выражения любого типа, кроме пользовательского. Символьные константы в списке выражений должны заключаться в кавычки. Форматы для вывода символьных значений представлены в таблице 3:

Таблица 3

 

Символ

Описание

!

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

\\

Вывод 2 + n символов из строки, где n - число пробелов между двумя слэшами. Если слэши набраны без пробелов, то выводятся два начальных символа строки. Если поле вывода больше, чем длина строки, то строка выравнивается влево, а справа печатаются пробелы

&

Вывод строки любой длины. Строка выводится без модификаций

 

Пример. Вывод символьных данных.

Конструкция:                                                       Результат:

PRINT USING "!"; Москва                                 М

PRINT USING "\ \"; Москва                               Мос

PRINT USING ">\       \<"; Москва                    >Москва  <

PRINT USING "&"; Москва                              Москва

 

Форматы для вывода числовых значений представлены в таблице 4.

Таблица 4

Символ

Описание

#

Представляет одну цифровую позицию. Если выводимое число имеет меньше цифр, чем указано позиций, то оно выравнивается вправо, дополняясь слева пробелами

.

Выводит десятичную точку. Может быть вставлена в любое место числового поля. Если символ указан, точка всегда печатается, независимо от точности значения. Лишние дробные знаки отсекаются

+

Вывод знака числа (плюс или минус), либо перед числовым полем, либо после - как указано

-

Вывод минуса перед отрицательным числом, либо перед числовым полем, либо после - как указано

**

Заменить левые пробелы перед числом звездочками. Две звездочки указывают, что выводить следует два или более знака

$$

Поставить перед числом в указанном поле знак доллара. Два доллара указывают, что выводить следует два знака, один из которых - доллар

**$

Комбинирует эффект двух звездочек и двух долларов. Пустые места поля слева замещаются звездочками, а впереди числа ставится знак доллара. **$ указывают три или более позиций, одна из которых - знак доллара. Если выводится отрицательное число, то минус ставится перед долларом

,

Если перед числовым полем поставлена запятая, то каждые три знака до десятичной точки отделяются запятыми (выделяются сотни, тысячи и т.д. по американскому формату представления чисел. Запятая не влияет на вывод чисел в экспоненциальной форме

_

Знак подчеркивания означает, что следующий символ выводится не как управляющий, а как литерал. Для вывода одного символа подчеркивания поставьте два (__) в строке формата

 

Если выводимое число не помещается в поле формата, то перед ним выводится знак процента (%).

Типы выводимых значений в списке_выражений должны соответствовать типам полей данных в строке формата.

Пример. Вывод числовых данных.

     Конструкция:                                                   Результат:

     PRINT USING "##.##"; .785                            0.78

     PRINT USING "##.##"; 987.785                      87.78

     PRINT USING "##.##"; 98.7, 7.8                     98.70 7.80

WRITE - оператор вывода, посылающий данные на экран.

WRITE [список_выражений]

где

список_выражений - содержит одно или несколько выражений, разделенных запятыми. Если список выражений опущен, печатается пустая строка. Выводимые значения разделяются запятыми. Символьные значения заключаются в кавычки. После печати последнего выражения в списке вставляются символы возврата каретки и перевода строки. WRITE записывает числовые значения без начальных и конечных пробелов.

LPRINT, LPRINT USING - операторы вывода, печатающие данные на принтер.

LPRINT [список_выражений][;|,]

LPRINT USING [формат; список_выражений][;|,]

где

список_выражений - одно или более выражений, разделенных ";" или ",";

формат - в операторе LPRINT USING - символьная переменная или константа, содержащая специальные форматирующие символы и другие знаки. Если все аргументы опущены, то на принтер выводится пустая строка. Эти операторы работают аналогично операторам PRINT и PRINT USING, но вывод идет не на экран, а на принтер.

LOCATE - оператор вывода, позволяющий вывести символы в любом месте экрана.

LOCATE [строка][,[столбец][,курсор][,[начало, конец]]]]

где

строка - номер строки на экране. Если параметр не указан, то номер строки не меняется; столбец - номер столбца на экране. Если параметр не указан, то номер столбца не меняется; курсор - логический параметр, указывающий видимость курсора. Если он равен 0, то курсор не виден, если 1 - то виден; начало - начальная скан-линия курсора; конец - конечная скан-линия курсора.

 

3. Операторы передачи управления

 

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

 

3.1. Операторы цикла

 

Циклы используют в том случае, когда Вам необходимо несколько раз выполнить один и тот же фрагмент исходного текста. При этом циклы повторяют блок операторов либо определенное количество раз, либо пока условие цикла не станет истинным или ложным.

В QuickBASIC существуют три вида циклов:

1. FOR ... NEXT;

2. WHILE ... WEND;

3. DO ... LOOP.

 

3.1.1. Оператор FOR ... NEXT

 

FOR ... NEXT - управляющий оператор, повторяющий блок операторов указанное число раз.

 

Синтаксис

Пример

FOR счетчик = начало TO конец [STEP шаг]

         [операторы_цикла]

         [EXIT FOR]

NEXT [счетчик [,счетчик...]]

FOR I% = 1 TO 10

Array%(I%) = I%

 

NEXT

 

Здесь

счетчик - числовая переменная, используемая как счетчик цикла; начало - начальное значение счетчика; конец - конечное значение счетчика; шаг - шаг изменения значения счетчика, по умолчанию равен 1. Цикл FOR...NEXT выполняется только в том случае, если начало плюс шаг меньше или равно конечному значению счетчика. Если конец меньше начала, то шаг должен быть отрицательным.

Цикл выполняется до тех пор, пока текущее значение счетчика не выйдет за рамки его конечного значения. При завершении текущего цикла к значению счетчика прибавляется значение шага.

Если начало и конец имеют одно и то же значение, цикл выполняется один раз, вне зависимости от значения шага. Если шаг равен нулю, цикл продолжается неопределенное время.

Допускается вкладывать циклы FOR...NEXT, то есть помещать цикл FOR...NEXT внутри другого цикла FOR...NEXT. Счетчикам вложенных циклов необходимо давать разные имена.

Оператор NEXT для внутреннего цикла должен предшествовать оператору NEXT для внешнего цикла.

 

     FOR I = 1 TO 10        ' Это внешний цикл

        FOR J = 1 TO 10     ' Это вложенный цикл

           FOR K = 1 TO 10  ' Это еще один вложенный цикл

              . . .

           NEXT K

        NEXT J

     NEXT I

 

3.1.2. Оператор WHILE ... WEND

 

WHILE ... WEND - управляющий оператор, выполняющий блок операторов до тех пор, пока указанное условие истинно.

 

Синтаксис

Пример

WHILE  условие

        [операторы]

WEND

INPUT R$

   WHILE R$ <> "Д" AND R$ <> "Н"

             PRINT "Ответ должен быть Д или Н"

             INPUT R$

   WEND

 

Здесь

условие - логическое выражение, возвращающее не ноль ("истина") или ноль ("ложь");

операторы - любое количество операторов.

Пока условие истинно (его значение не равно нулю), операторы будут циклически выполняться. Если условие ложно (его значение равно нулю), выполняется оператор, следующий за WEND.

Циклы WHILE...WEND могут вкладываться друг в друга любое число раз, но каждому оператору WHILE должен соответствовать свой WEND.

 

3.1.3. Оператор DO...LOOP

 

DO...LOOP - управляющий оператор, который повторяет блок операторов, пока условие истинно, или до тех пор, когда оно станет ложным. Существует два варианта цикла DO...LOOP:

1) цикл DO...LOOP с проверкой выражения в начале:

        DO WHILE...LOOP;

        DO UNTIL...LOOP;

2) цикл DO...LOOP с проверкой выражения в конце:

        DO...LOOP WHILE;

        DO...LOOP UNTIL;

Проверка выражения в начале цикла:

 

Синтаксис

Пример

DO [{WHILE | UNTIL}

       логическое_выражение]

       [операторы_цикла]

       [EXIT DO]

LOOP

DO UNTIL INKEY$ <> " "

       'Пустой цикл,

       'в котором ожидается

       'нажатие любой клавиши

LOOP

 

Здесь

логическое_выражение - выражение, имеющее ненулевое значение (истина) или нулевое (ложь);

операторы_цикла - любое количество операторов, которые выполняются, пока выражение истинно.

Проверка выражения в конце цикла:

 

Синтаксис

Пример

DO

      [операторы_цикла]

      [EXIT DO]

LOOP [WHILE | UNTIL

      логическое_выражение]

DO

      INPUT "Число: "; Ch

      Total = Total +Ch

LOOP WHILE Ch <> 0

 

Здесь

логическое_выражение - выражение, имеющее ненулевое значение (истина) или нулевое (ложь);

операторы_цикла - любое количество операторов, которые выполняются, пока выражение истинно.

Если опустить проверку условия в начале или в конце цикла DO...LOOP, то Вы получите бесконечный цикл. Чтобы выйти из бесконечного цикла DO...LOOP используйте оператор EXIT DO.

 

3.2. Условные операторы

 

Условные операторы QuickBASIC помогают Вам осуществить "ветвление" программы, т.е. передать управление по условию. В QuickBASIC существуют два вида условных операторов:

1. IF...THEN...ELSE;

2. SELECT...END SELEKT.

 

3.2.1. Оператор IF...THEN...ELSE

 

IF...THEN...ELSE - управляющий оператор, осуществляющий условное ветвление операций, основанное на оценке логического выражения. Выражение может быть истинным или ложным.

IF...THEN...ELSE можно записать в блочной или линейной форме.

Блочная форма:

 

Синтаксис

Пример

IF логическое_выражение_1 THEN

     [операторы_1]

[ELSEIF логическое_выражение_2 THEN

     [операторы_2]]

     .

     .

     .

[ELSE

      [операторы_n]]

END IF

IF X > 0 THEN

     PRINT "Х - положительно"

ELSEIF X < ) THEN

     PRINT "Х - отрицательно"

ELSE

     PRINT "Х - ноль"

END IF

 

Здесь

логическое_выражение_1 - выражение, возвращающее ненулевое значение (истина) или ноль (ложь);

операторы_1 -  любое количество операторов, выполняющихся при условии: логическое_выражение_1 - "истина";

логическое_выражение_2 - выражение, возвращающее ненулевое значение (истина) или ноль (ложь);

операторы_2 - любое количество операторов, выполняющихся при условии:  логическое_выражение_2 - "истина";

операторы_n - операторы, выполняющиеся при прочих условиях.

 

Линейная форма:

IF логическое_выражение THEN операторы_1 [ELSE операторы_2]

где

операторы_1 - операторы, выполняющиеся при значении логического выражения "истина";

операторы_2 - операторы, выполняющиеся при значении логического выражения "ложь".

Если проверяется одно или два условия, то имеет смысл использовать линейную форму IF...THEN...ELSE. Если предполагается проверять больше, чем два условия, то используйте блочную форму IF...THEN...ELSE.

 

3.2.2. Оператор SELECT...END SELECT

 

SELECT...END SELECT - управляющий оператор, выполняющий один из нескольких блоков операторов в зависимости от значений выражения.

 

Синтаксис

Пример

SELECT CASE выражение_выбора

     [CASE список выражений_1]

                 [операторы_цикла_1]

[CASE список выражений_2]

                 [операторы_цикла_2]

      .

      .

      .

[CASE ELSE

                [операторы_цикла_n]

END SELECT

INPUT TestValue

SELECT CASE TestValue

      CASE 1, 3, 5, 7, 9

             PRINT "Нечетное"

       CASE 2, 4, 6, 8

             PRINT "Четное"

       CASE IS < 1

             PRINT "Очень маленькое"

       CASE IS > 9

             PRINT "Очень большое"

       CASE ELSE

             PRINT "Не целое значение"

END SELECT

 

Здесь

выражение_выбора - любое числовое или символьное выражение;

список_выражений - одно или более выражений такого же типа, как и выражение_выбора. Ключевое слово CASE должно предшествовать блоку операторов;

операторы_цикла - содержат любое количество операторов.

Элементы списка_выражений должны иметь одну из следующих трех форм:

выражение [,выражение...];

выражение TO выражение;

IS выражение с операцией,

где

выражение - любое числовое или символьное выражение того же типа, что и выражение_выбора;

операция - любая из операций отношения.

 

Контрольные вопросы

 

1.      Назовите основные операторы описания языка QuickBASIC.

2.      Синтаксис оператора, описывающего константы (переменные, типы переменных).

3.      Синтаксис оператора объявления массивов (комментариев).

4.      Назовите основные операторы ввода-вывода.

5.      Синтаксис основных операторов ввода (вывода).

6.      Какие форматы используются для вывода символьных (числовых) значений?

7.      Назовите операторы передачи управления, используемые в языке QuickBASIC.

8.      Какие циклы используются в языке QuickBASIC?

9.      Синтаксис операторов цикла.

10. Какие условные операторы используются в языке QuickBASIC?

11. Синтаксис условных операторов.


Тема № 3

СРЕДА QuickBASIC 4.5

 

Вопросы: 1. Знакомство со средой QuickBASIC 4.5. Система меню.

                  2. Редактор.

                  3. Программирование в среде QuickBASIC 4.5

 

 

1. Знакомство со средой QuickBASIC 4.5. Система меню

 

Для запуска среды программирования QuickBASIC необходимо запустить файл qb.exe.

В среду программирования QuickBASIC (рис. 1) входят следующие пункты меню:

ФАЙЛ - используется для создания новой программы, загрузки и сохранения программ, печати файлов или частей файлов, выхода из среды QuickBASIC;

РЕДАКТИРОВАНИЕ - используется для стирания, копирования или перемещения текста программы, создания новой процедуры (SUB) или функции (FUNCTION);

ПРОСМОТР - используется для просмотра процедур (SUBs), экрана программы, разбиения экрана на две части;

ПОИСК - предназначен для поиска или замены названий переменных, меток или фрагментов исходного текста в активном окне, в текущем модуле или во всех загруженных модулях;

ЗАПУСК - используется для исполнения загруженной программы, продолжения выполнения прерванной программы, создания исполняемого (.exe) файла и перезапуска программы;

ОТЛАДКА - используется для отладки программы путем открытия окон наблюдения, которые показывают, как переменные изменяются при работе программы, установки контрольных точек, которые прерывают выполнение программы для того, чтобы Вы смогли просмотреть значения переменных;

ПАРАМЕТРЫ - используется для настройки цветов экрана, установки путей поиска служебных файлов и проверки синтаксиса;

СПРАВКА - используется для получения справки по ключевым словам языка QuickBASIC, информации по языку программирования QuickBASIC, контекстно-зависимой помощи, основанной на местоположении курсора, дополнительных инструкций по получению помощи.

Вход в меню осуществляется нажатием клавиши Alt.

 

2. Редактор

 

Редактор среды QuickBASIC осуществляет синтаксический контроль вводимого текста. Если строка написана правильно, то после того, как Вы перевели курсор на следующую строку, все ключевые слова QuickBASIC будут написаны заглавными буквами, операторы отделены друг от друга. Если же допущена ошибка с точки зрения синтаксиса языка QuickBASIC, то будет высвечено диалоговое окно с описанием возникшей ошибки, а курсор установится на место предполагаемой ошибки. Если ошибка понятна без разъяснений, можно нажать клавишу Enter. При необходимости уточнений нажмите клавишу Alt и выберите пункт меню СПРАВКА.

Кроме синтаксической поддержки редактор QuickBASIC поддерживает работу с блоками текста. Это бывает полезно, например, при копировании участков программы между различными модулями или процедурами.

Для выделения блоков текста используются клавиши:

 

Shift + - (-)

Будет выделен строчный фрагмент. Для этого нажмите клавишу Shift, и, не отпуская её, клавишу-стрелку

Shift + PgUp (PgDn)

Для выделения прямоугольного фрагмента. При этом строки могут входить в фрагмент только целиком

Del

Стереть выделенный фрагмент

Shift + Del

Стереть выделенный фрагмент, но при этом запомнить его в буфере (Clipboard)

Ctrl + Ins

Запомнить выделенный фрагмент в буфере, не стирая

Shift + Ins

Вставить фрагмент как текст из буфера

 

3. Программирование в среде QuickBASIC 4.5

 

Рассмотрим несколько программ на языке QuickBASIC для решения некоторых математических задач.

1. Программа поиска наибольшего общего делителя двух чисел по алгоритму Евклида.

 

              DEFINT A-B

              INPUT "A, B"; A, B

              DO             IF A > B THEN A = A – B

             IF B > A THEN B = B - A             LOOP WHILE A <> B

             PRINT "НОД="; A

 

2. Программа для решения квадратного уравнения:

y = ax2 + bx + c = 0

 

DEFSNG A-Z

REM Вычисление корней уравнения

INPUT A, B, C

REM Вывод для проверки ввода

PRINT A, B, C

     IF A = 0 AND B = 0 THEN PRINT 'A=0, B=0'

     IF A = 0 AND B <> 0 THEN X = -C / B

     PRINT 'A=0,X=', X

     D = B ^ 2 - 4 * A * C

     IF D = 0 THEN X = -B / (2 * A)

     PRINT 'Два равных корня'; X

     IF D < 0 THEN PRINT "Корней нет"

     IF D <> 0 THEN

     X1! = (-B + SQR(D)) / (2 * A)

     X2! = (-B - SQR(D)) / (2 * A)

     PRINT "X1="; X1!, "X2="; X2!

     END IF

     REM Конец программы

     END

 

3. Программа для расчета площади пяти фигур S (квадрата со стороной A, прямоугольника со сторонами A и B, ромба с диагоналями D1 и D2, параллелограмма с основанием A и высотой H1, трапеции со сторонами A и B и высотой H2), при условии, что исходные данные задаются для одного из вариантов.

 

     DEFSNG A-B, D, H, S

     DEFINT N

     INPUT N, A, B, D1, D2, H1, H2

     SELECT CASE N%

     CASE IS = 1: S = A * A

     CASE IS = 2: S = A * B

     CASE IS = 3: S = D1 * D2

     CASE IS = 4: S = A * H1

     CASE IS = 5: S = ((A + B) * H2) / 2

     END SELECT

     PRINT "Площадь фигуры="; S

     END

 

4. Программа вычисления приблизительного значения кубического корня из числа методом итераций.

 

    DEFDBL A-Z

    Precision = .0000001#

    CLS

    INPUT "Введите число: ", Value

    'Начальные установки

    X1 = 0#: X2 = Value

    'Выполнять итерации, пока разница между двумя

    'приближениями не достигнет требуемой точности

    DO UNTIL ABS(X1 - X2) < Precision

    X = (X1 + X2) / 2#

    IF X * X * X - Value < 0# THEN

    X1 = X

    ELSE

    X2 = X

    END IF

    LOOP

    PRINT "Кубический корень равен"; X

 

Контрольные вопросы

 

1.      Как осуществляется вход в меню QuickBASIC?

2.      Назовите пункты меню среды QuickBASIC. Для чего они используются?

3.      Что является признаком синтаксически правильного написания строки программы в среде QuickBASIC?

4.      Что необходимо сделать для того, чтобы уточнить описание возникшей ошибки при наборе текста программы?

5.      Какие клавиши (комбинации клавиш) используются для работы с блоками текста в среде QuickBASIC?


Тема № 4

МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ

 

Вопросы: 1. Структура модульной программы.

                  2. Функции.

                  3. Процедуры.

                  4. Область действия переменных и констант.

 

1. Структура модульной программы

 

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

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

Каждый модуль имеет главную часть. В главной части модуля описываются процедуры и функции модуля (операторами DECLARE), функции DEF FN, константы (оператор CONST).

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

К главному модулю можно подключить один или несколько вспомогательных (дополнительных) модулей.

Преимущества модульного программирования заключаются в следующем:

1. Так как вспомогательные модули - это отдельные файлы программ, в них обычно выносятся процедуры и функции, которые используются одновременно в нескольких программах. Таким образом, Вы как бы собираете программу из готовых блоков (модулей).

2. Если Вы дополняете или исправляете какую-либо процедуру или функцию из вспомогательного модуля, то все исправления автоматически становятся доступны всем Вашим программам, которые эти модули используют.

3. Сосредоточие вспомогательных модулей в одном месте облегчает поиск нужного фрагмента исходного текста, и позволяет избежать ситуации, когда одна и та же процедура существует в нескольких вариантах в каждой программе.

Структура модульной программы

Главный модуль содержит               Дополнительные модули, которых

точку   входа,  с   которой                 может  быть  несколько,  содержат

 начинается    исполнение                 процедуры и функции для главного

              программы                                                     модуля

            MAIN.BAS                                            OTHER.BAS

 


                               процедура                                        процедура

                               процедура                                         процедура

                                                                .                                                                                                   .

                                                                .                                                                                                   .

                                                                .                                                                                                   .

                               функция                                             функция

                               функция                                             функция

 

 

 

В составе модуля можно выделить следующие самостоятельные блоки: функции DEF FN, процедуры SUB и FUNCTION.

 

 

 

2. Функции

 

Функция DEF FN входит в главную часть модуля. Она возвращает одно значение и используется аналогично встроенной функции QuickBASIC.

Имя функции всегда должно начинаться с букв FN. DEF FN не может быть рекурсивной (не может вызывать сама себя), и должна быть определена перед использованием. Использовать функцию DEF FN можно только в том модуле, в котором она определена.

Функция DEF FN может быть записана в блочной или в линейной форме.

В линейной форме функция DEF FN записывается в следующем виде:

DEF FNимя [(параметры)] = выражение

В блочной форме функция DEF FN записывается в следующем виде:

        DEF FNимя [(параметры)]

                [операторы]

        DEF FNимя = выражение

                [операторы]

                [EXIT DEF]

                [операторы]

        END DEF

Здесь:

имя - имя переменной, до 40 знаков. Имя, комбинируемое с FN, является именем функции. Имя может иметь знак определения типа, который указывает на тип возвращаемого значения;

параметры - список переменных, разделенных запятыми. При вызове функции, значения каждого аргумента присваиваются соответствующему параметру. Аргументы передаются по значению. DEF FN не поддерживает массивы, записи или символьные строки фиксированной длины в качестве аргументов;

выражение - выражение, вычисляющее результат функции. В линейном синтаксисе выражение является телом функции. Если нет выражений, присвоенных имени функции, по умолчанию возвращается 0 для числовой функции и пустая строка для символьной функции.

 

3. Процедуры

 

Процедура FUNCTION является более мощной альтернативой DEF FN. Так же как и DEF FN, FUNCTION возвращает одиночное значение и может использоваться в выражениях. Однако существуют и отличия.

Процедура FUNCTION может быть рекурсивной (вызывать сама себя).

В отличие от функции DEF FN процедура FUNCTION может использоваться вне того модуля, где она определена. Это значит, что процедура FUNCTION, которая находится во вспомогательном модуле становится доступной любому модулю Вашей программы. Не забудьте, однако добавить оператор DECLARE в те модули, где она используется.

Текст процедуры FUNCTION не входит в главную часть модуля.

        FUNCTION имя [(параметры)] [STATIC]

                             [операторы]

                             имя = выражение

                             [операторы]

        END FUNCTION

Здесь:

имя - задается как обычная переменная. Определяет тип возвращаемых данных;

параметры - список переменных, значения которых передаются функции при ее вызове. Изменение значения параметра внутри функции изменит его значение в вызывающем модуле;

выражение - возвращаемое значение функции. Если имени функции ничего не присваивается, возвращается значение по умолчанию: для числовых функций - ноль, для символьных – пустая строка;

STATIC - указывает, что локальные переменные функции сохраняются между вызовами. Иначе локальные переменные считаются динамическими и их значения теряются при выходе из функции. Атрибут STATIC не влияет на переменные, описанные вне функции операторами DIM или COMMON с атрибутом SHARED.

В качестве примера использования процедуры FUNCTION рассмотрим программу вычисления факториала:

 

 DECLARE FUNCTION Factorial# (n%)

 Format$ = "##_! = ####################"

 DO

 INPUT "Введите число от 1  00 до 20 (или -1 для  выхода): "; Num%

 IF Num% >= 0 AND Num <= 20 THEN

 PRINT USING Format$; Num%; Factorial#(Num%)

 END IF

 LOOP WHILE Num% >= 0

 END

 FUNCTION Factorial# (n%) STATIC

 IF n% > 0 THEN 'Factorial вызывается снова, если N больше нуля

 Factorial# = n% * Factorial#(n% - 1)

 Else

 Factorial# = 1

 END IF

 END FUNCTION

 

В отличие от функции DEF FN и процедуры FUNCTION, процедура SUB вызывается как отдельный оператор.

Процедура SUB может возвращать несколько значений в вызывающую программу. SUB не может быть использована как часть выражения, а только как оператор.

Процедура SUB возвращает значения, производя вычисления над переменными из списка аргументов. Это единственная возможность для SUB переслать значения.

Вы можете писать процедуры, которые могут вызывать сами себя - то есть процедуры SUB могут быть рекурсивными.

Также как и FUNCTION, процедура SUB может использоваться вне того модуля, где она определена. Таким образом, процедура SUB, которая находится во вспомогательном модуле, становится доступна любому модулю Вашей программы. Не забудьте, однако добавить оператор DECLARE в те модули, где она используется. Текст процедуры SUB не входит в главную часть модуля.

     SUB имя [список_параметров] [STATIC]

              [операторы]

              [EXIT SUB]

              [операторы]

     END SUB

Здесь:

имя - переменная до 40 знаков, имя процедуры. Это имя не должно использоваться другими операторами FUNCTION или SUB или в подключаемой библиотеке;

список_параметров - содержит имена простых переменных и массивов, передаваемых в процедуру. Имена в списке разделяют запятыми. Любое изменение аргумента в процедуре приведет к изменению его значения в вызывающем модуле.

SUB и END SUB отмечают начало и конец процедуры. Вы можете использовать оператор EXIT SUB для выхода из процедуры.

Процедуры вызываются оператором CALL или путем указания ее имени со списком аргументов.

 

4. Область действия переменных и констант

 

В языке QuickBASIC Вы можете контролировать область действия переменных и констант. Это позволит Вам писать компактные процедуры, которые не влияют на работу друг друга. В тоже время Вы можете объявить, что часть переменных доступна всем процедурам в модуле (совместное использование).

Область действия переменных и констант может быть:

глобальной;

локальной;

совместно используемой.

Глобальными могут быть как переменные, так и символьные константы. Переменная (константа) считается глобальной, если она определена на уровне модуля. Для того чтобы сделать переменную глобальной необходимо добавить атрибут SHARED при описании переменной оператором DIM, REDIM или COMMON. Для констант достаточно оператора CONST в главном модуле.

Локальные переменные и константы существуют только в модуле или процедуре, где они используются. Таким образом, если не объявлено иное, то все переменные в каждом модуле (процедуре) считаются локальными. В случае если в другом модуле (процедуре) используется переменная с этим же именем, то QuickBASIC считает ее новой переменной.

При входе в процедуру или функцию значения переменных обнуляются.

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

Вместо того чтобы объявлять переменные глобальными при помощи оператора SHARED, Вы можете совместно использовать переменные между определенными процедурами.

 

Контрольные вопросы

 

1.       Что такое модуль? Из чего он состоит?

2.       В чем преимущества модульного программирования?

3.       Как записывается функция DEF FN в линейной (блочной) форме?

4.       В чем отличие процедуры от функции?

5.       Синтаксис процедуры FUNCTION (SUB).

6.       В чем отличие вызова процедуры SUB от вызова процедуры FUNCTION и функции DEF FN?

7.       Как вызываются процедуры в программе?

8.       Перечислите возможные области действия переменных и констант.

9.       Какие переменные (константы) называют глобальными? Как сделать переменную (константу) глобальной?

10.   Какие переменные (константы) являются локальными?

11.   Что нужно сделать для того, чтобы значения переменных не обнулялись между вызовами процедур?


Тема № 5

ПРОСТЕЙШИЕ ГРАФИЧЕСКИЕ ВОЗМОЖНОСТИ ЯЗЫКА

QuickBASIC 4.5

 

Вопросы: 1. Основные графические операторы языка.

                  2. Примеры использования графических операторов.

 

1. Основные графические операторы языка

 

К основным графическим операторам языка QuickBASIC относятся следующие:

VIEW - графический оператор, определяющий границы виртуального экрана графического вывода.

VIEW [[SCREEN] (x1,y1) - (x2,y2) [,[цвет] [,рамка]]]

где

SCREEN - опция SCREEN определяет, что координаты x и y любой выводимой точки имеют абсолютные значения, а не относительные по отношению к границам виртуального окна. Графика выводится только внутри окна. Если SCREEN опущен, все точки выводятся с координатами, относительными границ окна (х1 и у1 добавляются к значениям координат перед выводом);

(х1,у1) - (х2,у2) - определяет прямоугольную область на экране - виртуальное окно. Координаты х1,у1,х2,у2 являются числовыми значениями верхнего левого и нижнего правого углов прямоугольника;

цвет - атрибут цвета указывает, каким цветом будет закрашено окно. Если цвет опущен, окно не закрашивается;

рамка - любое числовое выражение рисует рамку вокруг окна, если есть место на экране. Если аргумент опущен, рамка не рисуется.

Оператор VIEW определяет окно “вывода”, или прямоугольную площадь на экране, куда будет выводиться графика. Все координаты - аргументы этого оператора должны находиться в пределах экрана.

WINDOW - графический оператор, определяющий размеры текущего окна вывода.

WINDOW [[SCREEN] (x1,y1) - (x2,y2)]

при этом:

если все аргументы опущены, окно вывода займет весь экран;

(х1,у1) - (х2,у2) - числа обычной точности, определяющие координаты прямоугольного окна вывода.

Оператор WINDOW позволяет создать координатную систему для рисования линий, графиков или других объектов без задания абсолютных координат на экране. Таким образом, координаты всех точек определяются как относительные к данному окну вывода.

CIRCLE - графический оператор, рисующий эллипс или окружность с определенным центром и радиусом.

CIRCLE [STEP] (x,y), радиус[,[цвет][,начало][,конец][,коэффициент]]]]

где

(х,у) - экранные координаты центра окружности или эллипса;

радиус - радиус круга или эллипса в текущей координатной системе;

STEP - указывает, что х,у - относительный центр от текущей позиции курсора;

начало, конец - используются для рисования дуг. Их значения находятся в пределах от -2 * PI до 2 * PI радиан, где PI = 3.141593. По умолчанию начало = 0, конец = 2 * PI. Если начало и конец < 0, CIRCLE рисует радиус до этой точки дуги и считает начало и конец > 0. Начальный угол должен быть меньше конечного. Если Вы указали начало без конца, дуга рисуется от начала до нуля;

цвет - атрибут цвета. По умолчанию - основной цвет;

коэффициент - коэффициент сжатия - отношение радиуса “у” к радиусу “х”. По умолчанию этот коэффициент принимается для рисования окружности. Отношение вычисляется следующим образом:

4 * (у-координаты точки / х-координаты точки) / 3

Здесь х-координаты точки и у-координаты точки определяются разрешением экрана.

Например, если режим экрана 1 (320 * 200), то коэффициент сжатия будет равен:

4 * (200/320)/3 или 5/6

Если коэффициент сжатия < 1, радиус будет - “х”, если коэффициент > 1, радиус будет - “у”.

LINE - графический оператор, рисующий линию или прямоугольник.

LINE [[STEP] (x1,y1)] - [STEP] (x2,y2)[,[цвет][,[B[F]][,стиль]]]

где

(х1,у1) - координаты начала линии;

(х2,у2) - координаты конца линии;

STEP - указывает на относительные координаты, то есть координаты вычисляются как смещения относительно последней точки;

цвет - номер цвета линии. Если заданы опции B или BF, прямоугольник рисуется этим цветом;

B - опция, рисующая прямоугольник с координатами верхнего левого угла (х1,у1) и нижнего правого угла (х2,у2);

BF - опция, рисующая закрашенный указанным цветом прямоугольник;

стиль - 16-битовая маска, задающая тип линии. Оператор LINE читает биты маски слева направо. Если бит = 0, точка не рисуется, если бит = 1, рисуется точка данного цвета.

PAINT - графический оператор, закрашивающий ограниченную площадь указанным цветом или образом.

PAINT [STEP] (x,y) [,[краска] [,[цвет рамки] [,фон]]]

где

STEP - определяет координаты как относительные к последней нарисованной точке. Например, если последняя точка была (10,10), то координаты с шагом STEP (4,5) будут равны (4+10,5+10) или (14,15);

(х,у) - координаты, где начинается закраска. Точка может быть указана внутри фигуры или вне, но не на границе. Если точка внутри, то закрашивается внутренняя часть фигуры. Если точка вне фигуры, то закрашивается фон;

краска - числовое или символьное выражение. Если это числовое выражение, оно представляет атрибут цвета. Если аргумент не указан, используется атрибут фона. Если аргумент является символьным выражением, то PAINT закрашивает фигуру образом (указанной в этом выражении битовой маской);

цвет рамки - числовое выражение, определяющее атрибут цвета границы фигуры. Если цвет границы указан, то площадь ограничивается линиями данного цвета. Если аргумент опущен, используется аргумент “краска”;

фон - символьное значение “вырезка стиля фона” для пропуска проверки завершения окраски на границах области. Окраска завершается, когда встречаются точки цвета краски. Указание фона позволяет окрашивать поверх закрашенной площади. Если фон опущен, то его значение равно CHR$(0).

 

2. Примеры использования графических операторов

 

В качестве примеров используем программу для рисования круга с эллипсом внутри него, программу для рисования розовой рыбки с бирюзовым хвостом, а также программу для построения графика функции, приведенные в учебном пособии Г. Зельдера «Программируем на языке QuickBASIC 4.5».

 

Пример 1: рисунок круга с эллипсом внутри него.

CONST PI = 3.141593

SCREEN 2 'Устанавливаем режим экрана

'Рисуем круг

CIRCLE STEP(-100, -42), 100

'Рисуем эллипс внутри круга

CIRCLE STEP(0, 0), 100, , , , 5 / 25

LOCATE 25, 1: PRINT "Нажмите любую клавишу";

DO: LOOP WHILE INKEY$ = ""

Вид экрана в результате работы программы показан на рис. 2.

 

Пример 2: рисунок розовой рыбки с бирюзовым хвостом.

CONST PI = 3.141593

CLS 'Очищаем экран

SCREEN 1

CIRCLE (190, 100), 100, 1, , , .3'Тело

CIRCLE (265, 92), 5, 1, , , .7'Глаз

PAINT (190, 100), 2, 1'Окраска тела

LINE (40, 120)-STEP(0, -40), 2'Хвост

LINE -STEP(60, 20), 2

LINE -STEP(-60, 20), 2

PAINT (50, 100), 1, 2'Окраска хвоста

CIRCLE (250, 100), 30, 0, PI - 3 / 4, PI - 5 / 4, 1.5'Жабры

FOR Y = 90 TO 110 STEP 4

LINE (40, Y)-(52, Y), 0'Оперение хвоста

NEXT

Вид экрана в результате работы программы показан на рис. 3.

 

Пример 3: рисунок графика функций у =  для -9  x < 0 и

                   у =  для 0  x  9

SCREEN 1: COLOR 1

WINDOW (-9, -.25)-(9, 3.25)

LINE (-9, 0)-(9, 0)'Ось Х

LINE (0, -.25)-(0, 3.25)'Ось Y

FOR X = -9 TO 9

LINE (X, .04)-(X, -.04)'Шкала по оси Х

NEXT

FOR Y = .25 TO 3.25 STEP .25

LINE (-.08, Y)-(.12, Y)'Шкала по оси Y

NEXT

'Первая точка функции

PSET (-9, 3)

FOR X = -9 TO 9 STEP .25

Y = SQR(ABS(X))'Аргумент SQR не может быть отрицательным

LINE -(X, Y), 2'Рисунок линии

NEXT

Вид экрана в результате работы программы показан на рис. 4.

 

Контрольные вопросы

 

1.      Какие основные графические операторы языка QuickBASIC Вы знаете? Для чего они используются?

2.      Синтаксис основных графических операторов языка QuickBASIC.

3.      В чем отличие оператора VIEW от оператора WINDOW?

4.      Какие опции оператора CIRCLE используются для рисования дуги?

5.      Какие опции оператора LINE используются для рисования закрашенного прямоугольника?

Hosted by uCoz