- •Долинер л.И., Данилина и.И., Пашкова р.Р., Емельянов д.А. Языки и системы программирования
- •Содержание
- •Теоретическая работа а. Что такое «программирование»
- •1. Что такое «программа» и как ее исполняет компьютер
- •2. Что такое “Среда программирования Turbo Pascal”
- •Вопросы для контроля
- •Лабораторная работа 1. Знакомство со средой turbo pascal
- •1. Как начать работу со средой Turbo Pascal
- •1.1. Структура каталогов среды Turbo Pascal
- •1.2. Запуск среды программирования Turbo Pascal
- •1.3. Структура экрана после запуска среды
- •1.4. Вход в меню
- •1.5. Среда Turbo Pascal как рабочий стол программиста
- •1.6. Работа со страницами
- •1.7. Компиляция и исполнение программ
- •2. Резюме
- •Вопросы для контроля
- •Лабораторная работа 2. Простейшие программы на языке pascal, или как это делается...
- •1. Структура программы на языке Pascal
- •2. Простейшие операторы
- •2.1. Резервирование памяти для работы
- •2.2. Запись данных в память, или оператор присваивания
- •2.3. Вывод данных на экран дисплея
- •2.4. Форматированный вывод информации
- •Теоретическая работа б. Введеhие в язык пpогpаммиpоваhия pascal
- •1. Алфавит языка
- •1.1. Символы, используемые в идентификаторах
- •1.2. Разделители
- •1.3. Специальные символы
- •1.4. Неиспользуемые символы
- •2. Структура программы
- •3. Типы данных
- •3.1. Целый тип
- •3.2. Вещественный тип
- •3.3. Символьный тип
- •3.4. Логический тип
- •3.5. Строковый тип данных
- •3.5. Пример описания данных
- •4. Команда присваивания
- •4.1. Операции
- •4.2. Стандартные функции
- •4.3. Запись выражений
- •5. Простейшие команды ввода и вывода информации
- •5.1. Вывод информации
- •5.2. Ввод информации
- •Вопросы для контроля
- •Лабораторная работа 3. Как организовать диалог
- •1. Команда ввода данных
- •2. Библиотека Crt
- •2.1. Определение цвета символов
- •2.2. Определение цвета фона
- •2.3. Очистка экрана
- •Вопросы для контроля
- •Лабораторная работа 4. Графика в языке pascal (первое знакомство)
- •1. Включение графического режима
- •2. Библиотека Graph
- •Задачи для самостоятельной работы. Линейные алгоритмы
- •Лабораторная работа 5. Операции с целыми и вещественными числами
- •Теоретическая работа в. Алгоритмические конструкции: условный оператор
- •4.1. Составной оператор
- •4.2. Условные операторы
- •4.2.1. Команда ветвления
- •5. Сложные условия
- •5.1. Что такое True и False
- •5.2. Логический тип данных
- •5.3. Сложные условия
- •6. Оператор выбора case
- •Лабораторная работа 6. Операторы ветвления и выбора
- •1. Что такое ветвление и как оно организуется в языке Pascal?
- •2. Условный оператор if
- •2.1. Теория
- •2.2. Практика
- •Контрольное задание
- •3. Оператор выбора case
- •3.1. Теория
- •3.2. Практика
- •Теоретическая работа г. Введение в систему типов языка pascal
- •1. Стандартные типы данных
- •2. Перечислимый тип
- •3. Ограниченный тип данных
- •4. Множества
- •5. Вопросы для самоконтроля
- •Теоретическая работа д. Циклы с параметром: быстрое начало
- •1. Когда используется цикл с параметром
- •2. Форма записи цикла с параметром
- •3. Вычисление сумм
- •4. Выборки
- •5. Максимумы и минимумы
- •Лабораторная работа 7. Циклы с параметром
- •Лабораторная работа 8. Как нарисовать забор
- •Лабораторная работа 9. Звездное небо и прочие странности
- •1. Получение случайного числа
- •2. Рисование точек в графическом режиме
- •Лабораторная работа 10. Проектирование программ и процедуры
- •1. Зачем нужна технология программирования
- •2. Знакомство с технологией проектирования “сверху вниз”
- •Решение Часть 1. Уточнение постановки задачи (эскиз)
- •Часть 2. Первый вариант решения
- •Часть 3. Уточнение решения
- •Часть 4. Уточнение решения
- •Часть 5. Уточнение решения
- •Часть 6. Уточнение решения
- •Это вам пригодится
- •Теоретическая работа е. Конструкции цикла в языке pascal
- •Оператор цикла с параметром
- •2. Цикл с предусловием while
- •3. Цикл с постусловием repeat
- •4. Вопросы для самоконтроля
- •Лабораторная работа 11. Разные конструкции цикла
- •1. Теория
- •1.1. Цикл со счетчиком (for)
- •1.2. Цикл с предусловием (while)
- •1.3. Цикл с постусловием (repeat)
- •2. Практика
- •Вопросы для контроля
- •Лабораторная работа 12. Как управлять движением на экране дисплея, или след слона
- •Теоретическая работа ж. Построение графиков функций
- •Лабораторная работа 13. Построение графиков функций
- •Лабораторная работа 14. Дополнительные возможности при работе с графикой
- •Теоретическая работа г. Динамические объекты: считывание картинок в память и вывод их на экран
- •Лабораторная работа 15. Как делается движущееся изображение
- •Теоретическая работа д. Использование страниц памяти для организации движения объектов по экрану
- •Как рисовать сложные картинки
- •Лабораторная работа 16. Мультипликация с использованием страниц видеопамяти
- •Лабораторная работа 17. Технология представления картинок в виде числового массива
- •Лабораторная работа 18. Движение объектов по многоцветному фону
- •1. Как вывести на экран картинку формата pcx
- •2. Технология движения объектов по многоцветному фону
- •Лабораторная работа 19. Мыши и модули
- •I. Как работать с мышью
- •1.1. Как работает манипулятор "мышь"
- •1.2. Начинаем программировать управление мышью
- •2. Модули
- •Implementation {начало раздела реализации}
- •Лабораторная работа 20. Работа со строковыми переменными
- •1. Теория
- •1.1. Описание строковых переменных
- •1.2. Сравнение строк
- •1.3. Операции со строками
- •2. Практика
- •Вопросы для контроля
- •Лабораторная работа 21. Работа с символьными переменными -1
- •Лабораторная работа 22. Работа с символьными переменными - 2
- •Лабораторная работа 23. Процедуры - 1
- •1. Теория
- •2. Практика
- •Лабораторная работа 24. Процедуры - 2
- •Лабораторная работа 25. Строковый редактор
- •1. Что такое «строковый редактор»
- •2. Зачем писать строковый редактор
- •3. Несколько вспомогательных задач
- •4. Постановка задачи на разработку
- •5. Необходимая информация для написания процедуры
- •6. Подсказка: алгоритм работы строкового редактора
- •Лабораторная работа 26. Поиск среднего и другие неожиданности
- •Лабораторная работа 27. Как работать с массивами: первые шаги
- •1. Теория
- •2. Практика
- •Вопросы для контроля
- •Лабораторная работа 28. Массивы и деловая графика
- •Теоретическая работа е. Строковые массивы. Алгоритмы поиска
- •Лабораторная работа 29. Строковые массивы. Алгоритмы поиска
- •Лабораторная работа 30. Нечисловые индексы в массиве
- •Теоретическая работа ж. Сортировка массивов
- •Лабораторная работа 31. Сортировка массивов
- •Лабораторная работа 32. Программа обслуживания конькобежных соревнований
- •Теоретическая работа з. Двумерные и многомерные массивы
- •Вопросы для контроля
- •Лабораторная работа 33. Шахматный турнир
- •Лабораторная работа 34. Подпрограммы - функции
- •1. Теория
- •2. Практика
- •Лабораторная работа 35. Работа с текстовыми файлами -1
- •1. Теория
- •1.1. Что такое текстовый файл
- •1.2. Принцип работы с текстовыми файлами
- •2. Практика
- •Лабораторная работа 36. Работа с текстовыми файлами - 2
- •Вопросы для контроля
- •Лабораторная работа 37. Работа с типизированными файлами - 1
- •1. Теория
- •2. Практика
- •Лабораторная работа 38. Работа с типизированными файлами - 2
- •1. Теория : тип данных «запись»
- •2. Практика
- •Лабораторная работа 39. Работа с типизированными файлами как с файлами прямого доступа
- •1. Теория
- •2. Практика
- •Лабораторная работа 40. Дополнительные возможности, или что можно еще натворить...
- •1. Что можно делать с файлами и каталогами
- •2. Процедуры и функции библиотеки dos
- •2.1. Работа с часами и календарем
- •2.2. Работа с каталогами и файлами
- •2.3. Типы и константы модуля dos для работы с файлами
- •3. Практика
- •Приложение 1 Зарезервированные слова Turbo Pascal
- •Приложение 2 Знаки пунктуации в языке Pascal
- •Приложение 3 Операции в языке Pascal
- •3.1. Арифметические операции
- •3.2. Логические операции
- •3.3. Операции отношения
- •Приложение 4 Стандартные функции языка Pascal
- •4.1. Арифметические функции
- •4.2.Функции преобразования типов
- •4.3. Функции для величин порядкового типа
- •Приложение 5 Команды pедактоpа сpеды Turbo Pascal 7.0
- •5.1. Команды перемещения курсора
- •5.2. Команды поиска фрагментов
- •5.3. Команды вставки и удаления информации
- •5.4. Команды работы с блоками информации
- •5.5. Клавиши быстрого управления средой Turbo Pascal 7.0
- •Список рекомендуемой литературы
Лабораторная работа 14. Дополнительные возможности при работе с графикой
Для дальнейшей работы желательно, чтобы Вы познакомились еще с некоторыми процедурами, предоставляющими Вам ряд дополнительных возможностей.
Задание 1
Скопируйте в Ваш каталог файлы arcs.pas, arc_fill.pas, userln.pas и palette1.pas.
Задание 2
Запустите среду Turbo Pascal. Загрузите файл arcs.pas. Прочитайте комментарии к программе. Разберитесь в тексте программы. Выполните программу. Поэкспериментируйте с ней.
Задание 3
Загрузите файл arc_fill.pas. Прочитайте комментарии. Разберитесь в тексте программы. Проверьте, как она работает. Поэкспериментируйте.
Задание 4
Загрузите файл userln.pas. Прочитайте комментарии. Выполните предложенные там задания.
Задание 5
Загрузите файл palette1.pas. Выполните задание, приведенное в комментариях.
Задание 6
Завершите работу в среде Turbo Pascal. Запустите программу - справочник по процедурам библиотеки GRAPH (папка SPRAV, исполняемая программа graphpas.exe). Повторите известные Вам процедуры и ознакомьтесь с новыми.
Теоретическая работа г. Динамические объекты: считывание картинок в память и вывод их на экран
Вы уже использовали прием создания движущихся изображений: вывод картинки на экран, ее удаление и рисование в новом месте. К сожалению, такой прием практической ценности не имеет. Давайте познакомимся с методами, которые используются реально.
Вы уже знаете, что в качестве “объектов”, с которыми может работать программа, могут выступать числа (целые и вещественные) и текст. В качестве объекта может выступать и небольшая (не больше 1/4 размера экрана) картинка. Эту картинку одной командой можно выводить на экран в произвольном месте, передвигать по экрану, стирать, перекрашивать и т.п. Для работы с таким “объектом” необходимо мысленно заключить эту картинку в прямоугольную рамку (рис. 6).
Рис. 6. Прямоугольная рамка с картинкой
В языке Pascal имеется возможность “считать” прямоугольную область экрана в память и затем вывести ее в любое место экрана. Для этого используются следующие процедуры и функции:
а) функция
ImageSize(x1, y1, x2, y2 : integer) : word;
возвращает размер необходимой памяти для сохранения прямоугольного участка экрана с координатами (x1,y1,x2,y2);
б) процедура
GetMem(var block: pointer; Size: Word);
предназначена для выделения места в памяти для картинки заданного размера Size;
в) процедура
GetImage(x1, y1, x2, y2 : integer; var BitMap);
позволяет запомнить прямоугольный участок экрана с координатами (x1,y1,x2,y2) в участке памяти, на который указывает BitMap. Эта переменная должна быть типа pointer (подробнее об этом типе данных см. ниже);
г) процедура
PutImage(X, Y : integer; var BitMap; BitBlt word);
обеспечивает вывод на экран прямоугольную картинку, на которую указывает переменная BitMap, так, чтобы координаты левого верхнего угла этой картинки были (x,y). Параметр BitBlt может принимать значения, описанные в подразделе констант, для различного вида выводимого изображения и наложения его на существующее.
В программе следует придерживаться следующего порядка действий:
1) в блоке var описать переменную для хранения АДРЕСА ОБЛАСТИ ПАМЯТИ12, в которой будет размещаться картинка:
var block : pointer;
2) в программе определить размер памяти, необходимый для хранения картинки:
Size:=ImageSize(x,y,x1,y1);
В качестве параметров выступают координаты диагонали прямоугольной области, в которую входит картинка.
Здесь Size - переменная типа Word. Т.к. значение переменной не может превышать 65535, память для хранения картинки также ограничена этим значением 64Кб;
3) затем выделяется память для размещения картинки:
GetMem(block,Size);
Эта процедура обеспечивает выделение в памяти места размером Size и в переменную block записывается адрес выделенной области;
4) последний подготовительный шаг: с помощью процедуры GetImage считать картинку с экрана в выделенную с помощью GetMem память:
GetImage(x,y,x1,y1,block^);
Здесь (x,y), (x1,y1) - координаты диагонали прямоугольной области, в которой расположена считываемая картинка, block - это адрес области памяти, block^ - собственно картинка;
5) теперь хранящуюся картинку можно вывести в любое место экрана с помощью процедуры PutImage:
PutImage(x2,y2,block^,XorPut);
Так осуществляется вывод картинки, хранящейся в переменной block^, в прямоугольную область с координатой верхнего левого угла (x2,y2).
Простейшая программа чтения с экрана картинки и вывода ее в другое место экрана выглядит следующим образом:
program Images_0;
{ Данная программа демонстрирует работу функций getimage и putimage.}
uses Graph,Graph0; { - подключение библиотеки подпрограмм, используемой в ДАННОЙ программе }
Const { - блок описания констант }
path=’d:\tp70\bgi’; { - путь к библиотеке Graph}
var block:pointer; { - переменная данного типа позволяет хранить АДРЕС блока памяти}
Size: Word;
begin
Init(path); { - перевод дисплея в графический режим }
{ ШАГ 1. Рисование двух кружков }
SetFillStyle(1,LightBlue); { задание цвета и закраски }
SetColor(White); { цвет рисуемых линий }
Circle(30,36,10); { голубой кружок }
FloodFill(30,36,White); { закрасили его красным цветом }
SetFillStyle(1,LightRed); { задание цвета и закраски }
SetColor(LightMagenta);
Circle(37,43,10); { верхний кружок }
FloodFill(37,43,LightMagenta); { закрасили его желтым цветом }
{ ШАГ 2. Выделяем место для хранения картинки }
Size:=ImageSize(20,20,50,60);
{ данная функция определяет место в памяти компьютера, необходимое для хранения картинки. В качестве параметров выступают координаты диагонали прямоугольной области, в которую входит картинка}
GetMem(block,Size);
{ процедура GetMem обеспечивает выделение в памяти места размером size, и в переменную block записывается АДРЕС выделенной области }
{ ШАГ 3. Считываем картинку в память }
GetImage(20,20,50,60,block^);
{ данная процедура обеспечивает копирование картинки, размещенной в прямоугольной области c координатами диагонали (20,30), (40,60) в область памяти, адрес которой хранится в переменной block. block^ - СОДЕРЖИМОЕ области, адрес которой хранится в block }
{ ШАГ 4. Выводим картинку на экран }
putimage(200,100,block^,XorPut);
{ вывод картинки, хранящейся в памяти, в прямоугольную область экрана с координатами верхнего левого угла (200,100) }
Readln;
CloseGraph; { команда закрытия графики }
end.
Давайте рассмотрим последний параметр функции putimage. Этот параметр используется для различных способов вывода картинки. Он может принимать следующие значения:
NormalPut |
= |
0 |
замена существующего изображения на копию. В этом случае изображение на новом месте стирается и на это место помещается копия из памяти; |
XorPut |
= |
1 |
исключающее “ИЛИ”. Повторный вывод изображения на то же место сотрет эту часть экрана. Если операцию применить дважды к одному и тому же месту экрана, то вид изображения на экране не изменится; |
OrPut |
= |
2 |
режим вывода картинки “ИЛИ”; |
AndPut |
= |
3 |
режим вывода “И”; |
NotPut |
= |
4 |
меняет цвета выводимой картинки на “противоположные” (инверсное изображение). |
На практике используются чаще всего режимы вывода NormalPut, XorPut и NotPut. Как конкретно компьютер выводит изображения? Здесь используются логические операции, указанные в именах режимов, которые в данном случае применяются к числам, кодирующим цвет изображения. Для компьютера число 0 - это False, 1 - True. Так, например, если в режиме OrPut на точку малинового цвета (Magenta) (номер 5, двоичная запись 0101) вывести точку бирюзового цвета (номер 3, двоичная запись 0011), то результирующий цвет можно определить следующим образом:
-
0101
- малиновый
or
0011
- бирюзовый
0111
- номер 7 , т.е. светло-серый.
Задание
В рассмотренном примере в переменной Block хранится картинка. Составьте фрагмент программы, который позволит нарисовать на экране:
а) ряд из 15 таких картинок;
б) картинки по периметру экрана.