- •ОРГАНИЗАЦИОННО–МЕТОДИЧЕСКИЙ РАЗДЕЛ
- •Цель и задачи дисциплины
- •Место дисциплины в профессиональной подготовке выпускников
- •Требования к уровню освоения курса
- •ТЕМАТИЧЕСКИЕ ПЛАНЫ
- •очная форма обучения
- •заочная форма обучения
- •СОДЕРЖАНИЕ ДИСЦИПЛИНЫ
- •КУРС ЛЕКЦИЙ
- •Описание языка Turbo Pascal
- •Основные команды и горячие клавиши
- •Алфавит языка Pascal – совокупность допустимых символов
- •Базовые элементы языка
- •Общая структура pascal-программы: Заголовок; Раздел объявления (описания) данных; Раздел описания действий с данными.
- •Понятие типа данных в Турбо Паскаль
- •Основные математические функции
- •Организация ветвлений в программе
- •Оператор условного перехода
- •Оператор выбора
- •Оператор безусловного перехода
- •Циклы
- •Арифметические циклы
- •Итерационные циклы с предусловием
- •Итерационные циклы с постусловием
- •Операторы завершения цикла
- •Процедуры и функции
- •Описание и вызов процедур и функций
- •Передача параметров
- •Локальные и глобальные идентификаторы
- •Рекурсивные функции и процедуры
- •Структурированные типы данных
- •Перечисляемый тип данных
- •Интервальный тип данных
- •Массивы
- •Строковый тип данных
- •Процедуры и функции для работы со строками
- •Тип запись
- •Файловые типы
- •Типы файлов Турбо Паскаль
- •Стандартные процедуры и функции
- •Работа с типизированными файлами
- •Работа с текстовыми файлами
- •Работа с нетипизированными файлами
- •Разработка модулей
- •Модуль Graph Инициализация графического режима
- •Простейшие графические процедуры и функции
- •Рисование геометрических фигур. Построение заполненных фигур
- •Работа с линиями
- •ЗАДАНИЯ ДЛЯ ПРАКТИЧЕСКИХ ЗАНЯТИЙ
- •Линейные алгоритмы
- •Целочисленная арифметика
- •Линейные программы
- •Логические выражения
- •Условные операторы
- •Оператор выбора
- •Операторы цикла
- •Обработка последовательностей
- •Минимумы и максимумы
- •Обработка числовых данных
- •Простейшие рекурсивные алгоритмы
- •Одномерные массивы
- •Двумерные массивы (матрицы)
- •Символы и строки
- •Массивы
- •Строки
- •Разбор выражений
- •Записи
- •Файлы
- •Двоичные файлы
- •Текстовые файлы
- •Создание модулей
- •Задания для самостоятельной работы студентов
- •Линейные программы
- •Ветвления
- •Циклы
- •Массивы линейные
- •Прямоугольные таблицы
- •Процедуры и функции
- •Символьные переменные
- •Графика
- •Задания для экзаменационных билетов
- •ТЕСТОВЫЕ ЗАДАНИЯ
- •Темы теоретическх вопросов для курсовой работы
- •Задания по практической части
- •Приложение
- •Образец оформления титульного листа
- •САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ
- •Графики СРС
yc:= yc+dy; {приращение координат} SetColor(14);
Circle(xc, yc, r) {рисование мяча} Until Keypressed;
Операторами Rectangle рисуется лабиринт, образованный прямоугольником, содержащим 2 вложенных в него прямоугольника. Внутри лабиринта начинается перемещение окружности (мячика) с центром (XC, YC) и радиусом "r". Принцип движения мяча: рисование, задержка, рисование цветом фона (стирание), приращение координат в цикле. По цвету пиксела анализируется положение края мяча относительно границ лабиринта (вертикальной и горизонтальной), а также внешний угол. Если мячик "достигает" границы, то соответствующее приращение координат изменяет знак. Момент смены направления движения озвучен.
Рисование геометрических фигур. Построение заполненных фигур
Ряд графических процедур выполняет построение заполненных фигур - фигур с замкнутым контуром, автоматически заполняемых сразу после построения. По умолчанию заполнение производится сплошным белым цветом. Цвет и стиль (орнамент) заполнения можно устанавливать из стандартного набора BGI или определять самим.
SetFillStyle(P, N); - процедура установки орнамента P=0, 1,..., 12 и цвета с номером "N" для заполняемых фигур.
P = 0 - сплошное заполнение цветом фона, при этом значение "N" игнорируется,
P = 1 - сплошное заполнение цветом с номером "N",
P = 2...11 - стандартный набор орнаментов BGI,
P = 12 - орнамент и цвет определяет пользователь.
SetFillPattern(PP, N); - процедура установки орнамента пользователя PP и цвета с номером "N" для заполняемых фигур.
Параметр PP имеет тип FillPatternType или array [1..8] of byte. Байт со-
стоит из восьми битов и соответствует ряду из 8 пикселов, т. е. параметр РР определяет элемент орнамента размером 8*8 пикселов (восемь рядов по восемь пикселов). Если бит равен 1, то пиксел высвечивается заданным цветом, если бит равен 0 - текущим цветом фона.
Орнамент удобно задавать, используя переменные с начальным значением (типизированные константы), например:
{оператор описания:}
Const Bukva_Y: FillPatternType=($81,$C3,$66,$3C,$18,$18,$18,$18 );
{оператор выполнения:}
73
SetFillPattern(Bukva_Y, 4);
Можно добавлять один орнамент к другому используя логические операции,
например, A и B - исходные орнаменты, Z - результирующий орнамент. Тогда:
Z:= A and B; - орнамент из совпадающих единичных частей исходных орнаментов,
Z:= A or B; - орнамент с добавлением единичных частей исходных орнаментов,
Z:= A xor B; - орнамент из несовпадающих единичных частей исходных орнаментов,
Z:= not A; - орнамент инверсный (обратный) к исходному орнаменту. Z:= A xor A; - обнуление, Z:= A xor (not A); - сплошное заполнение ор-
намента.
Приведем процедуры построения заполненных установленным орнаментом фигур. Граница заполняемых фигур рисуется текущим цветом для линий.
Bar(X1, Y1, X2, Y2); - построить заполненный прямоугольник с заданными координатами левого верхнего (X1, Y1) и правого нижнего (X2, Y2) уг-
лов. Аналог процедуры: Rectangle(X1, Y1, X2, Y2);.
Bar3d(X1, Y1, X2, Y2, d, t); - построить параллелепипед с заполненной передней гранью. Координаты углов: (X1, Y1), (X2, Y2), глубина "d". Переменная "t" типа boolean задает вывод верхней грани. При t=TopOn (true) верхняя грань показывается, при t=TopOff (false) - нет.
FillEllipse(X, Y, RX, RY); - построить заполненный эллипс с центром в точке (X, Y) и радиусами (полуосями) : RX - по горизонтали, RY - по вертикали.
Sector(X, Y, A1, A2, RX, RY); - построить заполненный сектор эллипса. A1 и A2 - начальный и конечный углы (в градусах), отсчитываемые против часовой стрелки относительно направления оси Х. Аналог процедуры: Ellipse(X, Y, A1, A2, RX, RY); строит сектор эллипса без автоматического заполнения.
PieSlice(X, Y, A1, A2, R); - построить заполненный сектор круга с центром в точке (X, Y) и радиусом R. Аналог процедуры: Arc(X, Y, A1, A2, R); строит дугу окружности.
FillPoly(N, M); - заполнить произвольную плоскую фигуру с границей, описанной массивом точек. N - число точек границы, М - параметр - переменная типа PointType, определяемая в модуле Graph в виде:
74
TYPE PointType = Record x, y: Integer End;
В программе массив можно описать операторами: Const N=100; Var M: array[1..N] of PointType;
Присвоение значений можно провести в цикле:
For i:=1 to 3 do begin M[i].x:=random(95); M[i].y:=random(95) end;
Приведем пример программы, выводящей 2 прямоугольника с орнаментами пользователя (bukva_Y и Red_50), а затем демонстрирующей набор стандартных орнаментов на передней грани параллелепипедов:
uses Graph; Сonst
bukva_Y: FillPatternType=($81, $C3, $66, $3C, $18, $18, $18, $18); Red_50: FillPatternType=($AA, $55, $AA, $55, $AA, $55, $AA, $55);
var i, x1, y1, x2, y2, Gd, Gm : integer; Begin
Gd:= Detect; InitGraph(Gd, Gm, '_');
SetFillPattern(Red_50, Red); {орнамент - 50% красных пикселов} Bar(250, 10, 350, 110);
SetFillPattern(bukva_Y, Blue); {орнамент - синяя буква "Y"} Bar(340, 30, 440, 130);
{стандартный набор из 12 орнаментов BGI выводим цветом с номером "11"} for i:=0 to 11 do
begin SetFillStyle(i, 11); if i<6 then
begin x1:=90*i; y1:=150 end
else
begin x1:=90*(i-6); y1:=270 end;
x2:=x1+70;
y2:=y1+80;
Bar3d(x1, y1, x2, y2, 10, TopOn) end;
ReadLn; CloseGraph
End.
75
Заполняя не черный экран орнаментом Red_50, можно получить новые цвета фона.
Выбранным из стандартных или определенным орнаментом можно заполнить любую замкнутую область с границей цвета "N" оператором
FloodFill(X, Y, N);
Заполнение начинает производиться из точки X, Y и ограничивается при достижении границы цвета с номером "N". Например: Rectangle(x1, y1, x2, y2); FloodFill((x1+x2) div 2, (y1+y2) div 2, Red); Если область не замкнута или цвет границы не равен "N", то заполнение "разольется" по экрану.
Работа с линиями
В графическом режиме курсор невидим, его положение можно определить функциями, возвращающими значения координат:
GetX; - по оси "Х", |
GetY; - по оси "Y". |
Следующие процедуры перемещают курсор без рисования:
MoveTo(x, y); - переместить курсор в точку с координатами (x, y), MoveRel(dx,dy); - сместить курсор на расстояние dx, dy от текущего по-
ложения.
Для построения многоугольников и ломаных линий удобно использовать процедуры:
LineTo(x, y); - провести отрезок прямой линии от текущего положения курсора до точки с координатами X, Y.
LineRel(dX, dY); - провести отрезок прямой линии от текущего положения курсора до точки, смещенной на расстояние dX, dY по соответствующим осям.
В отличие от процедуры Line(x1, y1, x2, y2); процедуры LineTo(x, y); и LineRel(dX, dY); при своем исполнении перемещают текущий указатель.
Пример операторов для построения восьмиугольника:
R:=100; {расстояние от вершин до центра xc, yc} xc:= GetMaxX div 2;
yc:= GetMaxY div 2; for i:= 1 to 8 do
begin
alfa:= i * pi/4; {значение угла в рад.}
x[i]:= xc + round(R * cos(alfa)); {координаты вершин}
76
y[i]:= yc + round(R * sin(alfa)) end;
MoveTo(x[8], y[8]); { исходная позиция для рисования } for i:= 1 to 8 do LineTo(x[i], y[i]); { рисование линий }
Для отрезков прямых линий и процедур с их использованием можно задать режимы построения прямых линий оператором:
SetWriteMode(N);
N=0 - замещение линией изображения на экране (режим CopyPut) используется по умолчанию,
N=1 - изображение комбинируется (режим XorPut). Работа функции состоит в изменении согласно логической операции "исключающее ИЛИ" исходного значения цвета пиксела (числа "1" или "0"). Логическая функция Xor, примененная к одной переменной дважды, восстанавливает ее исходное значение: (J xor I) xor I = J. Следовательно, при повторном проведении линии в режиме XorPut изображение этой линии уничтожается, а цвет пикселов экрана становится исходным. На этом правиле основаны некоторые программы построения движущихся изображений.
Пример операторов для рисования движущегося прямоугольника: SetWriteMode(1);
a:= 100;
b:= 50; {стороны прямоугольника} x1:= 0;
y1:= GetMaxY div 2;
N:= GetMaxX - x1 - a; {N - число перемещений} for i:= 0 to N do
begin
Rectangle(x1+i, y1, x1+a+i, y1+b); {рисование прямоугольника} delay(10);
Rectangle(x1+i,y1,x1+a+i,y1+b); {стирание прямоугольника} end;
Толщину и форму (стиль) линий отрезков прямых, прямоугольников, окружностей, эллипсов можно задать оператором
SetLineStyle(F, P, T);
Здесь F - форма линии из стандартного набора BGI: F=0 - сплошная,
F=1 - пунктирная,
F=2 - штрих-пунктирная,
77