- •Министерство образования и науки российской федерации
- •Содержание
- •Введение
- •Лабораторная работа № 1 Разработка и отладка линейной программы Задание:
- •Выполнение задания:
- •Лабораторная работа № 2 Разработка и отладка программы с разветвлениями Задание на лабораторное занятие
- •Выполнение задания
- •Лабораторная работа № 3 Разработка и отладка циклической программы Задание на лабораторное занятие
- •Выполнение задания
- •Лабораторная работа № 4
- •Разработка и отладка
- •Сложной циклической программы
- •Задание на лабораторное занятие
- •Выполнение задания
- •Лабораторная работа № 5 Разработка и отладка программы для работы с файлами Задание на лабораторное занятие
- •Выполнение задания
- •Лабораторная работа № 6 Разработка и отладка программы для работы с графикой Задание на лабораторное занятие
- •Выполнение задания
- •Лабораторная работа № 7 Разработка и отладка программы для работы с графикой в статике Задание на лабораторное занятие
- •Выполнение задания
- •Лабораторная работа № 8 Разработка и отладка программы для работы с графикой в динамике Задание на лабораторное занятие
- •Выполнение задания
- •Методические рекомендации По разработке программы
- •5. Трансляция и отладка программы.
- •К лабораторной работе №1
- •К лабораторной работе № 2
- •К лабораторной работе № 3
- •К лабораторной работе № 4
- •Исходная последовательность
- •Отсортированная по возрастанию
- •Программа разложения числа на простые сомножители
- •Делителями числа 28 являются 1, 2, 4, 7, 14.
- •Программа вычисления таблицы значений функции 2-х переменных
- •Программа построения таблицы сложных процентов
- •Программа сложения столбцов определителя
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Варианты 25-27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Варианты 28-30
- •Вариант 31
- •Вариант 36
- •Варианты 34-36
- •Логика цикла
- •Логика цикла
- •К лабораторной работе № 5
- •К лабораторной работе № 6
- •К лабораторной работе № 7
- •К лабораторной работе № 8
- •Косинусоида. Вариант 1
- •Основы программирования на языке basic
- •192171, Г. Санкт-Петербург, ул. Седова, 55/1
К лабораторной работе № 8
Цель работы: приобретение практических навыков в разработке и отладке программ для работы с динамической графикой.
Структура создаваемой программы: установка экранного режима; выполнение статичного изображения, блок движения изображения.
Установка экранного режима осуществляется операторами SCREEN и COLOR. В данной работе используется SCREEN 9.
Для осуществления динамики иногда требуется нарисовать не одно статичное изображение. Приемы создания статичных рисунков рассмотрены в работе № 7. Контур страны проще рисовать оператором DRAW в масштабе, задаваемом координатной сеткой. Потом размер рисунка можно увеличить до необходимого соответствующей масштабирующей командой Sn оператора DRAW. Блок ввода и распечатки городов можно организовать с помощью цикла FOR… NEXT, в тело которого войдет оператор READ m1$(i), m2(i), m3(i), x(i), y(i) и соответствующие ему DATA, например, DATA "Рим", 10, 57, 443, 135, где m1$(i) вводит название города, m2(i) и m3(i) – параметры оператора LOCATE, предваряющего оператор PRINT, который выводит на экран название города, x(i), y(i) – координаты изображающей город точки (рисовать либо парой операторов CIRCLE – PAINT, либо LINE).
Принцип создания движения - вывод на экран изображения, которое после определенной временной задержки стирается и немедленно рисуется в другом положении, смещенном относительно предыдущего в соответствии с заданной траекторией движения. Траектория движения определяется программой. В зависимости от того, как выводится и стирается изображение, различаются следующие способы:
Выводить изображение различными цветами переднего плана, а стирать, выводя то же самое изображение цветом фона.
Выводить, как в предыдущем, а стирать - оператором CLS.
Выводить, как в предыдущем, а стирать – прямоугольником, цвет контура и заливки которого совпадает с цветом фона.
Выводить как в предыдущем, а стирать задние фронты изображения.
Записать изображение в буфер, размещаемый в динамической памяти, а затем выводить его в нужных местах экрана. Стирать повторным наложением изображения из буфера, либо одним из способов п.п.2,3.
Существуют и другие способы, здесь не приводимые. Наиболее качественное изображение получается 4-м способом, но он достаточно легко реализуется лишь в случае прямолинейного движения.
При выполнении "туристских" заданий предлагается воспользоваться 5-м способом, стирая изображение прямоугольником.
Структура программы: 1) Блок рисования карты страны посредством оператора DRAW, 2) Блок ввода и распечатки городов, 3) Блок рисования и снятия в буфер изображения парохода (яхты) или автобуса (машины), 4) Блок движения транспортного средства, 5) Подпрограмма вывода сообщений.
При рисовании карты лучше использовать команды с относительными координатами, чтобы можно было рисовать по сетке, а затем использовать команду масштаба Sn.
В блоке снятия изображения в буфер сначала рисуется изображение парохода (яхты, автобуса или машины, в зависимости от варианта), которое затем копируется оператором GET. Рассмотрим этот блок:
'==3== Блок снятия изображения парохода =================
120 'Рисует пароход
130 b = 4 + INT((55+7) / 8418) 'Расчет объема памяти
140 REDIM bug1(b) 'Задает буфер для запоминания
150 GET (460, 23)-STEP(54, 17), bug1 'Снимает картинку
160 SLEEP 2 'Начальная выдержка времени
170 LINE (460, 23)-STEP(54, 17), 9, BF 'Стирает картинку
'=================================================
Оператор LINE из строки 170 используется сначала с параметром В для определения параметров оператора GET в строке 150 и значений для формулы в строке 130. Изображение должно полностью помещаться в рамке оператора LINE, тогда координаты из него переносятся в GET, а разности координат дают значения для формулы. После чего параметр B оператора LINE переделывается в BF, а цвет изменяется на цвет фона. Размер массива в байтах вычисляется по формуле:
4 + INT(((x2 – x1 +1) k1 + 7) / 8) k2 ((y2 – y1) + 1)
Таблица 0.8.1.
|
Режим экрана |
Битов на точку в одном слое (k1) |
Число слоев (k2) |
Режим экрана |
Битов на точку в одном слое (k1) |
Число слоев (k2) |
|
SCREEN 1 |
2 |
1 |
SCREEN 10 |
1 |
2 |
|
SCREEN 2 |
1 |
1 |
SCREEN 11 |
1 |
1 |
|
SCREEN 7 |
1 |
4 |
SCREEN 12 |
1 |
4 |
|
SCREEN 8 |
1 |
4 |
SCREEN 13 |
8 |
1 |
|
SCREEN 9 |
1 |
4 |
|
|
|
Значит для SCREEN 9 формула будет следующего вида:
4 + INT(((x2 – x1 + 1) 1 + 7) / 8) 4 ((y2 – y1) + 1)
В блоке движения теплохода организуется цикл WHILE…WEND либо DO…LOOP, в котором сначала оператором PUT изображение парохода выводится на экран, а затем после выдержки времени, задаваемой пустым циклом FOR i = 1 TO n: NEXT i, стирается оператором LINE (x1, y1)-(x2, y2), k, BF. Приращение координат задается в циклах следующим образом:
x = x + dx и y = y + dy
Следует заметить, что эти циклы позволяют осуществлять движение одновременно нескольких изображений, задавая каждому свои переменные для координат (x1, y1; x2, y2; x3, y3 и т.д.).
Траектория движения формируется путем изменения значений dx и dy в точках перелома. Осуществляется это посредством условного оператора IF…THEN, например:
IF x => 220 AND dy = 1 THEN dy = -1: dx = .1: SLEEP 2
Задавать условие надежнее знаком =>, так как при некоторых dx (например, dx = 0.3) можно проскочить значение x = 220.
Значение dy (или dx) в условии необходимо для того, чтобы зафиксировать срабатывание условия на нужном участке траектории, исключив срабатывание на ненужном (например, чтобы срабатывало при движении парохода "вниз" и не было бы ненужного срабатывания при движении "вверх").
В процессе формирования траектории может возникнуть необходимость прерывания выполнения программы, что можно сделать, нажав комбинацию клавиш Ctrl+Break. Посмотреть результат на экране вывода можно с помощью клавиши F4 (возврат – повторным нажатием). После использования комбинации Ctrl+Break запуск программы производится комбинацией клавиш Shift+F5, а не просто F5.
Условие выхода из цикла может быть, например, c< >1, оформляемое с помощью условного оператора IF…THEN:
WHILE c< >1 DO
… …
IF x = 200 AND dy = -1 THEN c = 1 IF x = 200 AND dy = -1 THEN EXIT DO
… …
WEND LOOP
Н
аправление
движения транспортного средства зависит
от значенийdx
и dy.
Его удобно определять с помощью следующей
диаграммы. Отметим, что dx
и dy
не обязательно равны 1, как на диаграмме.
Очевидно, что при dx
= 1.4 и dy
= 1.4 направление движения будет таким
же, как и при dx
= 1 и dy
= 1. Только увеличится скорость движения.
При формировании траектории рекомендуется начинать с IF THEN EXIT DO, поставив в качестве условия координату 1-й остановки, например, Анконы. Затем в IF THEN EXIT DO ставится координата следующего города Бари, а координата Анконы переносится в качестве условия в новый IF THEN, поставленный раньше, в котором задаются новые dx и dy. Так, добавляя другие IF THEN, формируем всю траекторию движения.
Пояснительный текст выводится на экран посредством подпрограмм, например, для Анконы Итальянского круиза. Пусть обращение к подпрограмме производится оператором GOSUB 200
190 GOTO 600
'===5======== Подпрограмма Анкона ============
200 LINE (0, 40)-(260, 350), 0, BF
210 LOCATE 5, 2
220 PRINT "Анкона, стоянка 1 день"
230 PRINT "Автобусная экскурсия по городу."
240 PRINT "Дегустация ''Кьянти'' в местных погребках"
250 RETURN
'=================================================
Используя оператор SELECT CASE, можно организовать подпрограмму вывода сообщений следующим образом:
'==5===== Подпрограмма вывода сообщений ===============
500 ng = ng +1: m12 = 19: m22 = 3
510 LINE (5, 240)-STEP(190, 80), 0, BF: LINE (5, 240)-STEP(190, 80), 8, B
SELECT CASE ng
CASE 1: m33$ = "Венеция": m34$ = "Стоянка 1 день"
M35$ = "Осмотр города": m36$ = "Посадка на яхту"
CASE 2: m33$ = "Анкона": m34$ = "Стоянка 1 день"
M35$ = "Осмотр города": m36$ = "Дегустация "Кьянти" в погребках"
END SELECT
560 LOCATE m12, m22: PRINT m33$: LOCATE m12 + 1, m22: PRINT m34$
570 LOCATE m12 +2, m22: PRINT m35$: LOCATE m12 + 3, m22: PRINT m36$
SLEEP 2
RETURN
'=================================================
В строке 500 задаются параметры для операторов LOCATE в строках 560-570. Операторы LINE в строке 510 стирают предыдущее сообщение и рисуют рамку вокруг сообщения. Сообщения распечатываются операторами PRINT в строках 560-570. Оператор SLEEP дает время для прочтения сообщения.
Таблица 0.8.2.
|
Оператор и его описание |
|
PALETTE 1, 2 Оператор установки цвета, изменяющий в палитре цвет 1 (синий) на цвет 2 (зеленый). |
|
PALETTE Оператор без параметров восстанавливает цвета палитры, установленные системой по умолчанию (возврат в первоначальное состояние). |
|
PALETTE USING PAL%(2) Оператор изменяет цвета палитры в соответствии со значениями массива PAL%, начиная со 2-го элемента массива. Можно с его помощью переустановить цвета всей палитры. |
|
Оператор и его описание |
|
PUT (100, 200), bug1, PSET Графический оператор, рисующий на экране изображение, взятое в массив bug1 оператором GET, начиная с точки с координатами x = 100, y = 200 (левый верхний угол прямоугольника). Переводит данные точка за точкой на экран. Каждая точка имеет тот же цветовой атрибут, что и при считывании. |
|
PUT STEP(100, 10), bug1, PRESET Графический оператор, рисующий изображение из массива bug1, начиная с точки (пусть последняя точка x = 10, y = 20) c координатами x = 110, y = 30, выдавая инверсное изображение ("негатив"). |
|
PUT (20, 10), bug2, AND Графический оператор, рисующий изображение из массива bug2, начиная с точки x = 20, y = 10. Изображение накладывается на существующую картинку. Точки, имеющие одинаковый цвет сохраняются, остальные меняют цвет. |
|
PUT (20, 10), bug2, OR Графический оператор, рисующий изображение из массива bug2, начиная с точки x = 20, y = 10. Изображение накладывается на существующую картинку. Новое изображение не стирает предыдущего. |
Окончание табл. 0.8.2.
|
PUT (20, 10), bug2, XOR Графический оператор, рисующий изображение из массива bug2, начиная с точки x = 20, y = 10. Изображение накладывается на существующую картинку. Действует так, что точки на экране, имеющие тот же цвет, что и образ, инвертируются. При повторном наложении образа предыдущая картинка восстанавливается. XOR устанавливается по умолчанию. |
|
POINT(0) Оператор возвращает координату x последней (текущей) точки |
|
POINT(1) Оператор возвращает координату y последней (текущей) точки |
|
POINT (10, 20) Оператор возвращает цвет точки (число) с координатами x = 10, y = 20 |
|
GET (10, 10)-(120, 110), bug1 Графический оператор, считывающий изображение с прямоугольного участка экрана, с координатами верхней левой точки x = 10, y = 10, и нижней правой – x = 120, y = 110, в массив bug1. |
|
GET STEP(10, 10)-STEP(20, 10), bug1 Графический оператор, считывающий изображение с прямоугольного участка экрана (пусть последняя точка x = 20, y = 10) с координатами верхней левой точки x = 30, y = 20 и нижней правой – x = 50, y = 30 в массив bug1. |
|
Примечание: 1. Если в программе использовался оператор PALETTE с параметрами, необходимо перед END поставить просто PALETTE. |
ЛИТЕРАТУРА
Алиев В.К. Язык Бейсик. – М.: СОЛОН-Р, 2000.
Бобровский С. Программирование на языке QBasic для школьников и студентов. – М.: ДЕСС КОМ, Инфорком-Пресс, 2000.
Зельднер Г.А. QuickBasic. – М.: ABF, 1994.
Колесов Н.В., Ганитулин А.Х. Программирование на алгоритмических языках для ПЭВМ: Учебное пособие. – СПб.: Изд-во СПбТИС, 1997.
Мельникова О.И., Бонюшкина А.Ю. Начала Программирования на языке QBasic. – М.: ЭКОМ, 2000.
Очков В.Ф., Рахаев М.А. Этюды на языках QBasic, QuickBasic, Basic Compiler. – М.: "Финансы и статистика", 1995.
Сафронов И.К. Бейсик в задачах и примерах. – СПб.: "БХВ-Петербург", 2000.
Федоренко Ю. Алгоритмы и программы на Qbasic: Учебный курс. – СПб.: Питер, 2002.
Приложение 1
