- •Долинер л.И., Данилина и.И., Пашкова р.Р., Емельянов д.А. Языки и системы программирования
- •Содержание
- •Теоретическая работа а. Что такое «программирование»
- •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
- •Список рекомендуемой литературы
Лабораторная работа 15. Как делается движущееся изображение
Задание 1
Скопируйте в Ваш каталог файлы images_1.pas, images_2.pas. Запустите среду Turbo Pascal.
Задание 2
Загрузите программу, хранящуюся в файле images_1.pas. Разберитесь внимательно в тексте программы. Затем:
а) измените программу таким образом, чтобы нарисованный светофор выводился еще в точки с координатами (400,300), (350,100) и (600,10);
б) модифицируйте программу так, чтобы она выводила 10 картинок в ряд.
Задание 3
Загрузите программу, хранящуюся в файле images_2.pas .
Программа демонстрирует организацию движения светофора по экрану. Разберитесь, как она работает. Модифицируйте программу таким образом, чтобы:
а) картинка двигалась по окружности;
б) картинка передвигалась по периметру.
Задание 4
И наконец, обратите внимание на последний параметр функции putimage. Этот параметр используется для различных способов вывода картинки. Как было отмечено ранее, он может принимать следующие значения:
-
Normalput
=
0
замена существующего изображения на копию;
XORput
=
1
исключающее “ИЛИ”. Повторный вывод изображения на то же место сотрет эту часть экрана. Если операцию применить дважды к одному и тому же месту экрана, то вид изображения на экране не изменится;
OrPut
=
2
режим вывода картинки “ИЛИ”;
AndPut
=
3
режим вывода “И”;
NotPut
=
4
меняет цвета выводимой картинки на “противоположные” (инверсное изображение).
Нарисуйте на экране закрашенный прямоугольник (закраска должна быть не сплошная). Попробуйте вывести какую-нибудь картинку (можно и светофор), используя все параметры. Определите ситуации, когда какой параметр следует использовать.
Задание 5
Составьте мультфильм из серии “Космос” (движущиеся планеты солнечной системы; летающая тарелка и т.п. - по Вашему усмотрению).
Теоретическая работа д. Использование страниц памяти для организации движения объектов по экрану
Научившись работать со сложной картинкой как с любым единичным объектом (точкой, линией, прямоугольником и т.п.), Вы можете уже в принципе писать программы с движущимся (динамическими) изображениями. К сожалению, тут есть один нюанс: если изображения достаточно велики (больше, чем 10x10 точек), при движении они “мигают”. Как сделать, чтобы мигание убрать? Для этого используют экраны.
При создании мультфильмов поступают следующим образом: рисуют отдельные картинки, которые потом по очереди снимают на пленку. Затем показывают эту пленку с частотой 24 кадра в секунду и получают движение.
По такой же технологии можно создавать мультфильмы на экране дисплея. В зависимости от типа дисплея и режима его работы имеется различное количество видеостраниц для создания мультипликации. Понятно, что чем больше таких страниц, тем естественнее можно сделать движение.
Для включения графического режима Вы пользовались специально написанной для Вас учебной процедурой Init. Для этих же целей (т.е. для включения графического режима работы дисплея) в библиотеке Graph содержится более гибкая процедура
InitGraph(Driver : integer; var Mode : integer; St : string);
где Driver - тип дисплея,
Mode - режим его работы,
St - путь к специальным подпрограммам, обеспечивающим работу с дисплеем. Такие подпрограммы имеют расширение .bgi и хранятся, как правило, в каталоге BGI.
В библиотеке Graph имеется набор констант, которые используются для указания типа дисплея (параметр Driver):
-
Detect
=
0
- автоматическое определение типа дисплея;
CGA
=
1
- цветной, 320х200 точек;
MCGA
=
2
- монохромный, 640х200 точек;
EGA
=
3
- EGA, 256kb, цветной, 640х350 точек;
EGA64
=
4
- EGA, 64kb, цветной, 640х350 точек;
EGAMono
=
5
- EGA, 256kb, монохромный, 640х350
IBM8514
=
6
- SVGA, цветной, 1024x768
HercMono
=
7
- Herculess 720x348 точек, монохромный;
ATT400
=
8
- монитор ATT400
VGA
=
9
- VGA, 640x480 точек, 16 цветов или 320х200 точек и 256 цветов;
PC3270
=
10
- монитор PC3270
Кроме того, в библиотеке Graph содержатся константы, используемые для указания графического режима работы дисплея (параметр Mode). В частности:
Для EGA:
EGALo = 0; - 640x200 точек, 16 цветов, 4 страницы;
EGAHi = 1; - 640x350 точек, 16 цветов, 2 страницы;
Для VGA:
VGALo = 0; - 640x200 точек, 16 цветов, 4 страницы;
VGAMed = 1; - 640x350 точек, 16 цветов, 2 страницы;
VGAHi = 2; - 640x480 точек, 16 цветов, 1 страница.
Процедура InitGraph запускает программу-драйвер, обеспечивающую работу с указанным типом монитора. Такая программа хранится в файле с именем EGAVGA.BGI (обычно этот файл находится в каталоге BGI). Для проверки того, запущен ли драйвер и может ли он работать с данным монитором, используется следующий фрагмент программы:
...
InitGraph(Drive,Mode,’e:\tp70\bgi’);
If GraphResult<>GrOk then
{если программа управления монитором не найдена}
begin
WriteLn(‘у Вас проблемы с подключением графики’);
Halt(1) {стандартная процедура аварийного выхода из программы}
end;
...
Здесь GraphResult - функция, значение которой равно 0, если драйвер запущен и отличен от 0 в ином случае. GrOk - константа, значение которой равно 0.
Понятно, что мультипликацию можно реализовать только в режимах, при которых имеется не менее двух страниц. К сожалению, на компьютерах стандартной конфигурации две экранные страницы доступны только при работе дисплея в режиме EGA. VGA и SVGA - дисплеи обычно позволяют работать только с одной страницей. Именно поэтому, если Вы захотите использовать страницы, Вам нужно будет включать графический режим EGA.
Страницы нумеруются от 0. Если в режиме можно использовать две страницы, то их номера - 0 и 1. Если Вы нарисуете на нулевой странице одну картинку, на первой - другую, то имеется возможность практически мгновенно сменить изображения на экране. Как это сделать практически? Используются следующие процедуры:
SetVisualPage(Page : word); - устанавливает видимой страницу с номером Page;
SetActivePage(Page : word); - устанавливает активной страницу с номером Page. Все действия по вводу/выводу изображения будут происходить на этой странице;
ClearDevice; - очищает экран.
Задача
Составить программу, демонстрирующую на экране движение кружка справа налево.
Решение:
PROGRAM Pulsar;
Uses Crt,Graph;
var screen : byte;
Drive,Mode:integer;
x,y,x_old,y_old:word;
begin
Drive:=EGA; Mode:=EGAhi;
{режим EGAhi обеспечивает работу с двумя страницами. Можно использовать режим VGA и VGAMed для получения того же самого}
InitGraph(Drive,Mode,’e:\tp70\bgi’);
If GraphResult<>GrOk then
{ если программа управления монитором не найдена}
begin
WriteLn(‘у Вас проблемы с подключением графики’);
Halt(1) {аварийный выход из программы}
end;
x:=40; y:=120;
SetTextStyle(1,0,3);
SetActivePage(0); {активной (рабочей) объявляется страница 0}
SetColor(Cyan);
OutTextXY(100,300,’Нажмите на любую клавишу’);
SetActivePage(1); {активной (рабочей) объявляется страница 1}
SetColor(Cyan);
OutTextXY(100,300,’Нажмите на любую клавишу’);
Repeat
{рисуем первый шарик на странице 1}
SetActivePage(1); {активной (рабочей) объявляется страница 1}
SetFillStyle(1,Black);
bar(0,60,640,160); { черным прямоугольником стираем рисунок в активной графической странице}
SetColor(red);
SetFillStyle(1,LightRed);
Circle(x,y,30);
FloodFill(x,y,Red); {нарисовали круг на первом экране}
OutTextXY(x-38,y-55,’Экран 1’);
delay(200);
SetVisualPage(1); {видимой стала первая страница}
SetActivePage(0); {активной является страница 1}
SetFillStyle(1,Black);
bar(0,60,640,160); { черным прямоугольником стираем рисунок в активной графической странице}
x:=x+10;
SetColor(LightMagenta);
SetFillStyle(1,Magenta);
Circle(x,y,35);
FloodFill(x,y,LightMagenta); {нарисовали круг }
OutTextXY(x-38,y-55,’Экран 0’);
delay(200);
SetVisualPage(0);
if x<600 then x:=x+10 else {если достигли конца экрана }
begin x:=40; y:=y+10 end {возвращаемся в начало}
until (keypressed) or (y>310); {пока не нажата клавиша...}
CloseGraph
end.