На второй картинке изображен вид экрана после выполнения команды circle (150, 100), 40, 1, 4, 8*atn(l), где начало дуги лежит пониже, чем p, примерно 4 радиан, а конец дуги соответствует 2*p, этот угол в операторе вычислен с помощью функции arctg.
Используя эту команду с отрицательными параметрами a, bвы получите изображение кругового сектора:
Также с помощью оператора circle можно рисовать эллипсы, или дуги эллипсов, для этого добавляется еще один параметр.
где R - радиус длинной оси.
Причем, если вы хотите изобразить полный эллипс, то параметры a, bр надо опустить, а запятые оставить.
На рис.2 изображение получено с помощью команды
circle(40,20), 30. 8, 6*atn(l), 8*atn(l), 2.3
Среди рассмотренных нами операторов сразу получить закрашенную область можно только при помощи команды line с параметром bf, но существует оператор, позволяющий закрашивать замкнутые области любой формы. Это команда
PAINT (X,Y), С, ВС
где С -цвет заливки области, ВС - цвет границы.
К параметрам этой команды предъявляются следующие требования:
точка с координатами (х,у) должна лежать внутри этой области;
цвет, определяемый кодом ВС должен совпадать с цветом границы области.
Если не соблюсти эти требования, то получится эффект «разлитой краски», т.е. краска или закрасит не то, что вам нужно, или «выльется» за границы вашей области.
Например:Надо раскрасить треугольник черного цвета в зеленый цвет.
screen 9
color 15, 7
line (100,100)-(150, 150), 0
line -(50,150),0
line -(100,100),0
paint (100,125),1,0
Рассмотрим еще один пример: снеговик (состоит из трех белых кругов разного диаметра)
screen 7
color 15, О
circle( 120,120),30,15
circle(120,70),20,15
circle(120,40),10,15
paint(120,120),15
paint( 120,70), 15
paint(120,40), 15
Этот оператор позволяет в компактной форме кодировать любые фигуры и быстро выводить их на экран.
Формат записи этого оператора
DRAW b
где b - символьная константа, которая содержит набор элементарных графических команд. Длина b не должна превосходить 256 символов.
Основные параметры обозначаются латинскими буквами, после которых указывается количество точек, на которое должно произойти смещение в данном направлении.
Например:Чтобы нарисовать домик надо выполнить следующие команды:
screen 9
color 15,1
pset(140,112)
draw "E15R30F15L60R5D40R5U30R15”
draw"D30L15R45U40"
pset step(-25,10)
draw"R20D20L20U20D10R20L10U10D20"
pset step(0,-45)
draw "L5U5R5D4"
Все эти элементарные команды называются командами движения, они могут быть модифицированы так:
1. Перед командой ставится параметр В, тогда положение курсора изменяется, но линия не рисуется.
2. Перед командой ставится параметр N, тогда курсор возвращается на место, которое он занимал до выполнения данной команды.
Например:Вот такую стрелку > можно нарисовать командой draw"NH3NG3"
Приведем другие параметры, которые можно включать в оператор draw.
Команда
|
Название и выполняемые действия
|
MX,Y
|
Перемещение курсора из текущего положения в точку с координатами X,Y.
|
М±Х, ±Y
|
Смещение курсора по отношению к текущей позиции на ±Y единиц по ординате и на ±Х единиц по абсциссе.
|
Ср
|
Определение цвета вычерчиваемых фигур, где р-код цвета,
действует во всех командах draw до нового назначения
|
Pn,m
|
Выбор цвета закраски фигуры и цвета границы фигуры (замкнутой!) n- цвет закраски фигуры; m - цвет границы.
|
An
|
Установка угла поворота, кратного 90° * n, где n=0, 1 ,2,3
|
Tan
|
Поворот на угол n, где n изменяется от -360° до 360°. Если знак n положительный, то поворот производится против часовой стрелки, если знак отрицательный - по часовой стрелке.
|
Sn
|
Установка масштабного коэффициента n . Он может находиться в диапазоне от 1 до 255. При этом количество точек на экране в масштабной единице равно n/4 . По умолчанию n=4.
|
Используя различные возможности команды DRAW (повороты, масштабирование и т.д.) можно создавать различные динамические изображения, в которых фигуры меняют размеры, вращаются, меняют цвет.
Например: 1. Нарисовать кораблик и заставить его двигаться по горизонтали слева направо.
SCREEN 9 COLOR 2, 14
'здесь формируется строка для рисования кораблика
а$ = "clr40el0160fl0bm+20,-10u50f25g25"
'В цикле изменяется координата точки рисования кораблика
FOR i= 10 ТО 200
LINE(i- 11,40)-(i + 50, 100), 0, BF
PRESET (i, 100)
DRAW a$
'Этот цикл нужен для задержки времени,
'чтобы рисунок перемещался медленнее
FOR j = 1 ТО 2000: NEXT
NEXT
2. Следующая программа описывает вращающийся вокруг своей вершины прямоугольник, пока не нажата любая клавиша.
SCREEN 9
а$ = "c15u30r30d30130"
с$ = ""
g = 0
WHILE с$ = ""
PRESET (100, 100)
с$ = INKEY$
DRAW "ТА" + STR$(g) + a$
g = (g + 10) MOD 360
FOR j = 1 TO 40000: NEXT
LINE (40, 40)-(160, 160), 0, BF
WEND
Построения с помощью графических операторов происходят недостаточно быстро, поэтому при необходимости можно хранить изображения на так называемых экранных страницах и в нужный момент целиком выводить их на экран.
В каждом графическом экране существуют активная и видимая страницы. Активной является страница, на которой производится построение изображения, вывод текста. Видимой является страница, отображаемая на мониторе компьютера. По умолчанию номера активной и видимой страниц совпадают, поэтому, вы сразу наблюдаете процесс построения изображения. Но если вы укажете различные номера активной и видимой страниц, то можно достичь эффекта мультипликации. Например, в то время, пока на видимой странице существует графическое изображение, на активной подготавливается новое изображение, которое при переключении страниц "мгновенно" выводится на экран.
Номера страниц устанавливаются оператором SCREEN:
SCREEN n, , a, v
где n - уже известный вам номер режима,
а - номер активной страницы,
v - номер видимой страницы.
Обратите внимание, между номером режима и номером активной страницы стоят две запятые!
Путем изменения номера отображаемой видеостраницы можно достичь эффекта перемещения образов на экране (мультипликация). Задачей мультипликации является отображение видимой страницы с полностью сформированным графическим образом, в то время как на одной или более активных страницах происходит процесс формирования графических образов. Описанный процесс иллюстрируется следующим фрагментом программы:
screen 9, ,1,2
……………….
‘здесь осуществляется построение графических образов в активной ‘(1) странице, в то время, как отображается содержимое второй ‘страницы.
screen 9, ,2,1
‘страницы меняются местами
Можно использовать и более чем две страницы, добиваясь таким образом, более сложных эффектов движения. Однако, не увлекайтесь количеством страниц, т.к. могут возникнуть проблемы с памятью компьютера.
5. КОПИРОВАНИЕ БЛОКОВ ИЗОБРАЖЕНИЯ
Если вы используете одинаковые рисунки, или текст на разных страницах, в разных программах, то можно нужный кусочек изображения (прямоугольной формы) скопировать, а затем поместить в другое место.
Таким способом можно заставить двигаться рисунок или скопировать часть изображения с одной страницы на другую и т.д.
Для этих целей существует команда, которая считывает графические образы с экрана в массив оперативной памяти компьютера
GET(Xl,Yl)-(X2,Y2), имя_массива
где (Xl,Yl) - (X2,Y2) - прямоугольная область, определяющая координату левого верхнего и правого нижнего углов копируемой области
имя_массива - это имя переменной типа числовой массив, в котором будет сохраняться изображение. Массив должен быть предварительно объявлен в программе и его размер должен быть достаточным для хранения графического образа.
Остановимся на этих требованиях подробнее
Для того чтобы объявить числовой массив воспользуйтесь командой
DIM имя(N)
по этой команде в оперативной памяти компьютера отведется место для хранения массива имя размерностью N. Если в процессе выполнения программы будет попытка записать в описанный массив данных больше, чем размерность N , то появится ошибка SUBSCRIPT OUT OF RANGE (выход за пределы массива). Тогда следует увеличить число N.
При использовании команды GET размер, необходимый для хранения изображения можно примерно рассчитать. Для этого вначале рассчитайте ширину X и высоту Y вашего изображения, дальше определите по таблице параметры а и b для вашего графического изображения и воспользуйтесь
Screen
|
a
|
b
|
1
|
2
|
1
|
2
|
1
|
1
|
7
|
1
|
4
|
8
|
1
|
4
|
9
|
1
|
4
|
10
|
1
|
2
|
11
|
1
|
1
|
12
|
1
|
4
|
13
|
8
|
1
|
формулой:
где INT -целая часть числового выражения.
Например:Необходимо скопировать часть экрана с координатами (10,10)-(35,76) в числовой массив.
Вначале определим размеры копируемой области: Х=35-10=25 у=76-10=66
Теперь рассчитаем размер числового массива (для screen 9):
Теперь надо описать графические построения на этом участке, определить числовой массив размером 530 и скопировать изображение с помощью оператора
GET
Приведем примерный фрагмент программы.
screen 9
color 2,15
‘здесь описываются построения
dim mas(530)
get(10,10)-(35,76),mas
………..
Теперь изображение содержится в переменной mas и его можно будет поместить в другое место экрана, на другую страницу, заставить перемещаться по экрану и т.д. Следует отметить, что при этой операции содержимое самого изображения с экрана не исчезает. Если необходимо убрать этот кусочек с экрана, то рекомендуем или очистить экран целиком оператором CLS (если на экране нет каких-либо других нужных изображений) или нарисовать на этом же месте закрашенный прямоугольник цветом 0.
В нашем примере: line (10, 10)-(35,76),0,bf
Когда уже существует образ в массиве, его можно в любой момент вызвать обратно на экран, поместив его левый верхний угол в любую точку экрана. Для этого служит команда:
PUT (Х, Y), имя_массива, операция
где (X.Y) - координаты вывода образа на экран,
имя_массива - имя переменной, в которой хранится образ,
операция - определяет функцию, используемую для объединения пересылаемого образа с уже существующим изображением на экране монитора. Может принимать значения PSET, PRESET, AND, OR, XOR. В задачах мультипликации в основном используются операции PSET и XOR .
Операция XOR установлена по умолчанию, т.е. ее можно вовсе не указывать. Если операции GET и PUT производятся над образом в одной и той же области экрана, то текущее изображение на экране исчезает. Значит таким способом также можно уничтожить созданное изображение.
Например:
dim mas(530)
get(10,10)-(35,76), mas
put (10,10), mas, xor
Эффекта движения можно достичь, используя операцию PSET, изменяя циклично координаты выводимого образа.
Например:Следующий фрагмент программы создает образ круга на экране, круг двигается по диагонали сверху вниз
SCREEN 9
COLOR 2, 14
CIRCLE (100, 100), 45, 5
PAINT (100, 100), 3, 5
DIM KRUG (10000)
GET (53, 53)-(147, 147), KRUG
PUT (53, 53), KRUG
FOR I = 1 TO 300
PUT (I, I / 2), KRUG, PSET
NEXT
Таким способом можно заставить двигаться по экрану любую сложную фигуру по любой траектории, изменив закон движения.
Для того чтобы старое изображение не "пачкало" экран, помните о том, что желательно прямоугольную область под образ отводить на 2-3 точки больше, чем реальный размер рисунка (по всем сторонам: сверху, снизу, справа, слева).
Для вывода текста на экран также, как и в текстовом режиме, используется команда
PRINT список
где список - перечисление элементов, выводимых на экран (переменных и констант числового или строкового типа). Они могут быть разделены запятыми, пробелами или точками с запятой. Строковые константы в списке должны быть заключены в двойные кавычки.
Позиция каждого выводимого на экран элемента определяется символом разделителя в списке выражений.
Если разделителем является запятая, то очередной элемент выводится в начале следующей зоны (по 14 символов), на которые разделен экран, таким образом можно выводить на экран ровные таблицы.
Элемент, отделенный точкой с запятой выводится непосредственно в следующую символьную позицию экрана.
Разделители в виде одного или нескольких пробелов или символов табуляции действуют на позицию вывода так же, как и запятая.
Если в конце списка выражений стоит запятая или точка с запятой, то выполнение следующего оператора PRINT начинается в той же самой строке через один пробел. В противном случае вывод будет производиться в начале следующей строки.
Вообще говоря, вывод текста начинается с того места, где последний раз стоял графический курсор. Но процессом вывода текста на экран можно управлять, указав непосредственно перед оператором PRINT координаты вывода текста. В этом случае надо помнить, что координаты текста существенно отличаются от графических координат (см. таблицу в п. 1.1). Каждый символ текста имеет свой размер, также описанный в указанной таблице, поэтому, зная характеристики экрана всегда можно расположить текст вместе с рисунками там, где это необходимо.
Указать позицию вывода текста на активной странице можно при помощи оператора
LOCATE строка, колонка, курсор
где строка, колонка - координаты курсора, лежащие в диапазоне, определенном типом используемого SCREENa
курсор - величина, задающая характер отображения курсора на экране: 0 - курсор невидим, 1- курсор видимый.
|
результат ее выполнения
|
print "это проба","запятой"
|
эго проба запятой
|
print "это проба" ;"точки с запятой"
|
это пробаточки с запятой
|
Если в ходе выполнения программы необходимо запросить у пользователя какую либо информацию (числа, строковые выражения и т.д.), то для этого вы можете использовать команду ввода данных с клавиатуры.
INPUT "приглашение" {;/,}переменные
где "приглашение"- строковая константа, заключенная в двойные кавычки, где может содержаться подсказка для пользователя, что требуется вводить
после приглашения через запятую (после приглашения не выводится знак вопроса), или точку с запятой (выводится знак вопроса) следует список переменных, разделенных запятыми, которым будут присвоены соответствующие данные в порядке их ввода с клавиатуры.
Оператор INPUT переводит программу в режим ожидания ввода данных. Тип вводимых данных обязательно должен соответствовать типу соответствующих переменных, иначе произойдет ошибка в выполнении программы (т.е. не следует в числовые переменные пытаться ввести строку произвольных символов!). При вводе строковых выражений их не обязательно помещать в кавычки.
Пока все требуемые данные не введены и не нажата клавиша ENTER, вводимые данные можно редактировать обычным способом.
Часто оператор INPUT используется совместно с оператором PRINT, в результате чего организуется диалог с пользователем.
Например:
LOCATE 10,12
INPUT "Привет! Как тебя зовут"; name$
LOCATE 11,12
PRINT "Здравствуй, дорогой друг ";name$
Результат на экране монитора при вводе имени ВАСЯ:
Привет! Как тебя зовут? ВАСЯ
Здравствуй, дорогой друг ВАСЯ
Однако бывают ситуации, когда не требуется отображения вводимой информации на экране монитора (например, при вводе пароля). Тогда можно воспользоваться другим способом ввода данных, используя функцию INKEY$, которая возвращает символ, нажатый на клавиатуре. Приведем фрагмент программы, который позволит считывать информацию с клавиатуры, пока не нажата клавиша ввода. При этом ничего, кроме приглашения на экране не отображается. По окончании ввода использован оператор условного перехода для анализа введенной строки символов.
Например:
SCREEN 9
COLOR 2, 14
parol$="anna"
a$ = ""
stroke$ = ""
DO
a$ = INKEY$
IF a$<>""THEN
IF ASC(a$)<> 13 THEN
stroke$ = stroke$ + a$ ELSE
EXIT DO
END IF
END IF
LOOP
IF stroke$ = parol$ THEN
PRINT "Привет! "; stroke$
ELSE
PRINT "Пароль неверен!"
END
END IF
Система программирования QBASIC фирмы Microsoft является интегрированной системой компилирующего типа, включающей мощный экранный текстовый редактор, позволяющий выполнять стандартные операции над текстом (копирование, удаление блоков текста), управляющую среду с многооконными меню, подсистему помощи HELP, отладчик и встроенный компилятор. QBASIC, по существу стал стандартом системы программирования на языке BASIC, поставляемой в комплекте с операционными системами MS-DOS.
Целью данного пособия не является подробное описание всех возможностей языка и среды программирования QBASIC, поэтому остановимся лишь на основных операциях работы с вашей программой.
Загрузка QBASIC - надо найти на вашем диске файл с именем qbasic.exe и запустить его любым известным вам способом (или в командной строке DOS написать qbasic и нажать ENTER, или на панели NORTON COMMANDER подсветить курсором файл qbasic.exe и нажать ENTER).
Выход в меню осуществляется нажатием клавиши ALT . При этом наблюдается подсветка пунктов меню. Навигационными клавишами можно перемещаться по меню, нажатием клавиши ENTER вы можете либо войти в подменю, либо выполнить действие, соответствующее пункту меню.
Запуск программы - войти в меню (ALT) выбрать пункт RUN, нажать клавишу ENTER, выбрать пункт START, нажать клавишу ENTER
Того же эффекта можно добиться нажав одновременно клавиши SHIFT и F5
Продолжение программы - войти в меню (ALT), выбрать пункт RUN, нажать клавишу ENTER, выбрать пункт CONTINUE, нажать клавишу ENTER.
Того же эффекта можно добиться нажав F5. Программа будет продолжена с места последней остановки.
Загрузить программу с диска - войти в меню (ALT), выбрать пункт FILE, нажать клавишу ENTER, выбрать пункт OPEN PROGRAM, нажать клавишу ENTER.
На экране появится интерактивное окно, позволяющее выбрать нужный вам файл.
Записать программу на диск - войти в меню (ALT), выбрать пункт FILE нажать клавишу ENTER, выбрать пункт SAVE, нажать клавишу ENTER.
При этом, если у вашей программы уже существовало имя, она запишется на диск под старым именем, иначе система выдаст интерактивное окно и попросит указать имя и путь нового файла
Выйти из QBASIC - войти в меню (ALT), выбрать пункт FILE нажать клавишу ENTER выбрать пункт EXIT, нажать клавишу ENTER
Использование системы помощи - любую информацию, касающуюся среды программирования вы можете почерпнуть (правда на английском языке) вызвав встроенный HELP. Для этого необходимо нажать клавишу F1.