- •Томский государственный университет систем управления и радиоэлектроники (тусур)
- •Часть 1. Сведения о компьютере и программе 6
- •Глава 1. Первое представление о компьютере и программе 7
- •Глава 2. Программа и программирование 11
- •Глава 3. Устройство и работа компьютера 22
- •Часть 2. Программирование на Паскале первый уровень 34
- •Глава 4. Простые программы. Операторы ввода-вывода. Переменные величины 35
- •Часть 3. Программирование на Паскале - второй уровень 120
- •Глава 11. Алфавит и ключевые слова Паскаля 121
- •Глава 12. Работа с разными типами данных Паскаля 123
- •Глава 13. Процедуры и функции с параметрами 146
- •Глава 14. Строгости Паскаля 158
- •Глава 15. Другие возможности Паскаля 175
- •Часть 4. Работа в Паскале на компьютере 188
- •Часть 1. Сведения о компьютере и программе
- •Глава 1. Первое представление о компьютере и программе
- •1.1. Что умеет делать компьютер
- •1.2. Что такое компьютер. Первое представление о программе
- •1.3. Как человек общается с компьютером
- •Глава 2. Программа и программирование
- •2.1. Список команд. Командный и программный режимы
- •2.2. Что важно знать о программе
- •2.3. Понятие о процедуре. Может ли робот быть более интеллектуальным?
- •2.4. Программа для компьютера на машинном языке
- •2.5. Языки программирования
- •2 .6. Пример настоящей программы для компьютера на языке Лого
- •2.7. Последовательность работы программиста на компьютере
- •2.8. Основные приемы программирования
- •Глава 3. Устройство и работа компьютера
- •3.1. Как устроен и работает компьютер
- •3.2. Устройство и размеры оперативной памяти
- •3.3. Взаимодействие программ в памяти
- •3.4. Внешние устройства компьютера
- •3.5. Кодирование информации в компьютере
- •Часть 2. Программирование на Паскале первый уровень
- •Глава 4. Простые программы. Операторы ввода-вывода. Переменные величины
- •4.1. Процедура вывода Write
- •8 'Котят' 3*3 'щенят'
- •4.2. Первая программа на Паскале
- •4.3. Выполняем первую программу на компьютере
- •4.4. Процедура вывода WriteLn. Курсор
- •4.5. Переменные величины. Оператор присваивания
- •4.6. Описание переменных (var)
- •4.7. Что делает оператор присваивания с памятью
- •4.8. Имена переменных
- •4.9. Запись арифметических выражений
- •4.10. Вещественные числа в Паскале
- •4.11. Порядок составления простой программы
- •4.12. Операторы ввода данных ReadLn и Read
- •4.13. Интерфейс пользователя
- •4.14. Строковые переменные
- •4.15. Диалог с компьютером
- •4.16. Константы
- •Глава 5. Разветвляющиеся программы
- •5.1. Условный оператор if
- •5.2. Правила записи оператора if
- •5.3. Составной оператор
- •5.4. Ступенчатая запись программы
- •5.5. Вложенные операторы if. Сложное условие в операторе. Логические операции
- •5.6. Символьный тип данных Char
- •5.7. Оператор варианта case
- •1,2 WriteLn('Кошмар!');
- •3 WriteLn('Неважно');
- •5 WriteLn('Молодец!');
- •Глава 6. Циклические программы
- •6.1. Оператор перехода goto. Цикл. Метки
- •6.2. Выход из цикла с помощью if
- •6.3. Оператор цикла repeat
- •6.4. Оператор цикла while
- •6.5. Отличия операторов repeat и while
- •6.6. Оператор цикла for
- •10 Футбол 11 футбол 12 футбол ..... 150 футбол
- •100 Футбол 99 футбол 98 футбол ... 40 футбол
- •Глава 7. Короткие программы
- •7.1. Циклическая программа
- •7.2. Роль ошибок
- •7.3. Счетчики
- •3Адание 46
- •7.4. Сумматоры
- •7.5. Вложение циклов в разветвления и наоборот
- •7.6. Вложенные циклы
- •7.7. Поиск максимального из чисел
- •Глава 8. Процедуры
- •8.1. Компьютер звучит
- •8.2. Простейшие процедуры
- •8.3. Процедуры и операторы
- •8.4. Стандартные процедуры Halt и Exit
- •Глава 9. Графика
- •9.1. Стандартные модули
- •9.2. Стандартный модуль Graph, текстовый и графический режимы
- •9.3. Рисуем простейшие фигуры
- •9.4. Работа с цветом. Заливка. Стиль линий и заливки
- •9.5. Используем в рисовании переменные величины
- •9.6. Использование случайных величин при рисовании
- •9.7. Движение картинок по экрану
- •Глава 10. Создадим первую большую программу
- •10.1. Постановка задачи
- •10.2. Программирование по методу "сверху вниз"
- •10.3. Сначала - работа над структурой программы
- •10.4. Переменные вместо чисел
- •10.5. Записываем программу целиком
- •10.6. Порядок описания переменных, процедур и других конструкций Паскаля
- •10.7. Управление компьютером с клавиатуры. Функции ReadKey и KeyPressed
- •If KeyPressed then WriteLn('Хозяин нажал клавишу!')
- •10.8. Буфер клавиатуры
- •10.9. Гетерархия. Задание на игру "Торпедная атака"
- •Часть 3. Программирование на Паскале - второй уровень
- •Глава 11. Алфавит и ключевые слова Паскаля
- •11.1. Алфавит
- •11.2. Ключевые слова
- •11.3. Использование пробела
- •Глава 12. Работа с разными типами данных Паскаля
- •12.1. Список типов
- •12.2. Числовые типы
- •12.3. Массивы
- •12.4. Определения констант
- •12.5. Типизированные константы
- •12.6. Собственные типы данных
- •12.7. Логический тип Boolean
- •12.8. Перечислимые типы
- •12.9. Ограниченный тип (диапазон)
- •12.10. Действия над порядковыми типами
- •12.11. Символьный тип Char. Работа с символами
- •12.12. Строковый тип String. Работа со строками
- •12.13. Записи
- •Vr.Prot :podlodka; {Записи для двух вражеских лодок}
- •12.14. Множества
- •12.15. Расположение информации в оперативной памяти. Адреса
- •Глава 13. Процедуры и функции с параметрами
- •13.1. Процедуры с параметрами
- •13.2. Функции
- •13.3. Подпрограммы. Локальные и глобальные переменные
- •13.4. Массивы как параметры
- •13.5. Параметры-значения и параметры-переменные
- •13.6. Индукция. Рекурсия. Стек
- •13.7. Сортировка
- •Глава 14. Строгости Паскаля
- •14.1. Структура программы
- •14.2. Структура процедур и функций
- •14.3. Выражения
- •14.4. Совместимость типов
- •14.5. Форматы вывода данных
- •14.6. Переполнение ячеек памяти
- •14.7. Дерево типов
- •14.8. Синтаксические диаграммы Паскаля
- •Глава 15. Другие возможности Паскаля
- •15.1. Работа с файлами данных
- •15.2. Вставка в программу фрагментов из других программных файлов
- •15.3. Модули программиста
- •15.4. Дополнительные процедуры и функции модуля Graph
- •15.5 Копирование и движение областей экрана
- •15.6. Вывод текста в графическом режиме
- •15.7. Управление цветом в текстовом режиме (модуль crt)
- •15.8. Работа с датами и временем (модуль dos)
- •15.9. Нерассмотренные возможности Паскаля
- •Часть 4. Работа в Паскале на компьютере
- •Что нужно знать и уметь к моменту выполнения первой программы?
- •Запуск Паскаля
- •Начало работы. Ввод программы. Выход из Паскаля
- •Сохранение программы на диске. Загрузка программы с диска
- •Выполнение программы
- •Исправление ошибок. Отладка программы Сообщения об ошибках
- •Пошаговый режим
- •Работа с окнами пользователя и отладчика
- •Отладка больших программ
- •Работа с несколькими окнами
- •Копирование и перемещение фрагментов текста
- •Обзор популярных команд меню
- •Создание исполняемых файлов (ехе)
- •Логические диски. Путь к файлу
- •Список некоторых операций, процедур и функций Паскаля
- •Решения заданий
- •3Аданиe 51
- •3Адание 5 2
- •3Адание 72
- •3Адание 80
15.4. Дополнительные процедуры и функции модуля Graph
Кроме процедур, которые заставляют Паскаль что-либо сделать, в модуле Graph имеются функции, которые могут сообщать программисту ту или иную информацию. Вот некоторые из них:
Функция |
Смысл |
GetMaxX integer |
Выдает максимально возможную горизонтальную координату экрана |
GetMaxY :Integer |
Выдает максимально возможную вертикальную координату экрана |
GetPixel(x,y :Integer) :Word |
Выдает номер цвета пиксела с координатами х и у |
А вот еще процедуры рисования:
Процедура |
Смысл |
Arc (x,y :Integer; fi1 ,fi2,r Word) |
Рисует дугу окружности с центром в точке (х,у) и радиусом r. Дуга начинается от угла fi1 градусов и кончается углом fi2 градусов |
PieSlice (x,y :Integer; fi1,fi2.r :Word) |
Закрашенный сектор круга. Дуга сектора определяется так же, как в процедуре Arc. Цвет и стиль заливки определяются процедурой SetFillStyle |
FillEllipse (x,y :Integer; rx,ry :Word) |
Закрашенный эллипс с центром в точке (х,у) и радиусами rx, ry. Цвет и стиль заливки определяются процедурой SetFillStyle |
Sector (x,y :Integer; fi1,fi2,rx,ry :Word) |
Закрашенный сектор эллипса. Опирается на дугу эллипса с центром в точке (х,у) и радиусами rx, ry. Дуга начинается от угла fi1 градусов и кончается углом fi2 градусов |
Bar(x1,y1.x2,y2 :Integer) |
Закрашенный прямоугольник с противоположными углами в точках (x1, y1) и (х2, у2) |
Bar3D (x1,y1, x2,y2 :Integer; tol Word; top.Boolean) |
Трехмерный параллелепипед, обращенный к нам прямоугольной гранью с противоположными углами в точках (x1,y1) и (х2,у2). Толщина параллелепипеда - tol. Если top равно TopOff, то параллелепипед без верха, если top равно ТорOn, то - с верхом |
15.5 Копирование и движение областей экрана
До сих пор мы заставляли двигаться лишь простые объекты: окружности, квадраты, линии. Если же мы хотим заставить двигаться что-нибудь посложнее, например снеговика из раздела 9.3, то нам придется изрядно потрудиться. Чтобы не рисовать и не стирать поочередно все элементы, из которых состоит снеговик, мы можем использовать процедуры Getlmage и Putlrnage, которые позволяют копировать любую прямоугольную область экрана целиком в другое место экрана.
Пример 1. Изобразим в левом верхнем углу экрана 4 окружности, а затем скопируем их в правый нижний угол.
USES Graph;
VAR Gd,Gm :Integer;
P :pointer;
Size : Word;
BEGIN
Gd:=0; InitGraph(Gd, Gm, 'c:\tp\bgi');
SetLineStyle(0,0,ThickWidth);
{Рисуем очки.}
Circle(50,100,20); Circle(50,100,15);
Circle(90,100,20); Circle(90,100,15);
{B целях наглядности нарисуем также диагональ экрана:}
Line(0,0,640,480);
Size:=ImageSize(10,60,120,140);
GetMem(P, Size);
GetImage(10,60,120,140,Р^);
ReadLn;
PutImage(500,400, Р^,0);
ReadLn;
CloseGraph
END.
Пояснения. Чтобы скопировать область экрана, Паскаль должен сначала ее запомнить в оперативной памяти. Выберем мысленно прямоугольник, охватывающий объект, предназначенный для копирования. В нашем случае подойдет прямоугольник между точками (10, 60) и (120, 140). Чтобы знать, сколько памяти отвести под запоминание области, компьютер должен знать размер изображения в байтах. Этот размер сообщает функция ImageSize. Поскольку размер этот может оказаться большим, запоминать изображение лучше всего в куче. Отводит место в куче процедура GetMem. Вот ее вызов: GetMem(P, Size), где Р - так называемый указатель на место в памяти, предназначенное для запоминания. Указатели - это новый для нас тип данных. Останавливаться на них не будем, скажем только, что они очень похожи на ссылки. Запоминает область процедура Getlmage, параметр которой Р^ имеет значением изображение этой области. Процедура Putlmage помещает это изображение в точно такой же прямоугольник экрана с верхним левым углом в точке (500, 400).
Если вы уже запустили эту программу, то могли видеть, что Getlmage прихватил в выделенном прямоугольнике и кусок диагонали, a PutImage добросовестно поместил на экран все, что прихватил GetImage, удалив все, что там было раньше. Ответственность за это несет последний параметр PutImage, равный у нас нулю. Для того, чтобы новое изображение не затирало старое, нужно использовать вместо нуля двойку.
Задание 130
Нарисуйте шеренгу из десятка снеговиков.
Пример 2. Попробуем двигать наши очки слева направо.
USES Graph,CRT;
VAR x,Gd,Gm :Integer;
P :pointer;
Size :Word;
BEGIN
Gd:=0; InitGraph(Gd, Gm, 'c:\tp\bgi');
SetLineStyle(0,0,ThickWidth);
{Рисуем очки:}
Circle(50,100,20); Circle(50,100,15);
Circle(90,100,20); Circle(90,100,15);
{Рисуем диагональ:}
Line(0,0,640,480);
Size := ImageSize(10,60,120,140);
GetMem(P, Size);
GetImage(10,60,120,140,P^);
{Начинаем движение:}
x:=20;
while x<300 do begin
PutImage(x, 150, Р^,1);
Delay(40);
PutImage(x,150,P^,1);
x:=x+1;
end{while};
CloseGraph
END.
Пояснение. Чтобы нарисовать очки в каком-то месте, а потом их стереть, достаточно два раза подряд употребить оператор PutImage(x, 150, Р^,1). Обратите внимание, что изображение прямой, по которому прошлись очки, не затерлось. Все это результат действия константы 1. Чтобы понять механизм ее действия, нужно знать азы алгебры логики.
Задание 131
Пусть два снеговика идут друг другу навстречу.