Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и языки программирования. Учебно-методический комплекс.pdf
X
- •1. СИЛЛАБУС ДИСЦИПЛИНЫ ДЛЯ СТУДЕНТОВ
- •Тема 1. Понятие алгоритма, свойства, типы, исполнители
- •Структура программы.
- •Имена, ключевые слова и знаки операций
- •Тема 7. Символьные типы данных.
- •Обработка символьных данных.
- •Тема 9. Строки. Строковые процедуры.
- •Функции
- •Тема 11. Множества (Set)
- •Работа с текстовыми файлами
- •Тема 13. Записи
- •Тема 14. Построение изображений на экране
- •Отображение точки на экране
- •Отображение линий на экране
- •Построение прямоугольников на экране
- •Построение многоугольников
- •Построение дуг, эллипсов и окружностей
- •Основная литература
- •Дополнительная литература
- •ГЛОССАРИЙ

записей - двумерная таблица, каждый столбец которой имеет свой
тип. Такую структуру описывают, например, следующим образом:
var tabl: array[1..100] of zap1;
Задание записей константой
Как и массивы, записи не могут быть заданы неименованной
или нетипизированной константой.
Для того чтобы задать запись типизированной константой,
следует вначале описать соответствующий тип в разделе type, а затем
воспользоваться им в разделе const:
type <имя_типа> = record <имя_поля1>: <тип_поля1>;
[<имя_поля2>: <тип_поля2>;]
[...]
end;
const <имя_константы>:<имя_типа>=<начальное_значение>;
Начальное значение для переменной типа запись задается перечислением в круглых скобках начальных значений для всех полей
(соответствующих типов!) с обязательным указанием имени задаваемого поля. Имя поля от его начального значения отделяется
двоеточием, значения соседних полей разделяются точкой с запятой:
(<имя_поля1>:<значение_поля1>;_;<имя_поляN>:<значение_поляN>);
Например:
type data = record day: 1..31;
month: 1..12;
year: 1900..2100;
end;
const my_birthday: data = (day:17; month:3; year:2004);
Можно, конечно, не описывать тип константы отдельно, а объединить оба определения:
const my_birthday: record day: 1..31;
month: 1..12;
year: 1900..2100;
end;
= (day:17; month:3; year:2004 );
Если описана двумерная таблица, то ее начальные значения задаются как вектор, каждый компонент которого является записью.
71

Таким образом, правила задания типизированной константы-таблицы
сочетают в себе правила задания массива и записи:
type family = (mother, father, child);
const birthdays : array[family] of data
= ((day: 8; month: 3; year: 1975),
(day: 23; month: 2; year: 1970),
(day: 1; month: 9; year: 2000));
Доступ к полям
Обратиться к полю записи можно следующим способом:
<имя_записи>.<имя_поля>
Например:
Как уже было упомянуто, коллизий между переменной с именем
month и полем записи my_birthday.month не возникает. Доступ к
полю двумерной таблицы осуществляется аналогичным образом
(жирные скобки являются обязательным элементом синтаксиса):
<имя_таблицы>[<индекс>].<имя_поля>
month:= my_birthday.month +1;
Эту запись можно трактовать так:
(<имя_таблицы>[<индекс>]).<имя_поля>
Например:
birthdays[mother].day := 9;
Оперирование несколькими полями
Если программе предстоит несколько раз подряд обращаться к
полям одной и той же записи, может оказаться неудобным записывать это обращение полностью:
my_birthday.day:= 17;
my_birthday.month:= 3;
my_birthday.year:= 2004;
Для сокращения таких участков служит оператор with, позво-
ляющий обращаться к полям, не указывая каждый раз имя всей
записи:
with <имя_записи> do
begin <операторы>
72

{имена полей здесь используются как <имя_поля>,
type
var ivanov: student;
а не как <имя_записи>.<имя_поля>}
end;
Например:
with my_birthday do
begin day:= 17;
month:= 3;
year:= 2004;
end;
Замечание. Для того чтобы внутри оператора with можно было
обратиться не к полю записи, а к глобальной переменной с таким же
именем, перед этой переменной нужно указать (через точку) имя
программы: <имя_программы>.<имя_переменной>.
Например:
with my_birthday do
begin day:= 17;
month:= 3; {поле записи birthday.month}
year:= 2004;
programma.month:= 5; {глобальная переменная month}
end;
Вложенные операторы with
Если возникает необходимость расположить один оператор with
внутри другого, то любую переменную (если перед ней явно не
указано имя записи), находящуюся под внутренним оператором with,
компилятор пытается интерпретировать в такой последовательности:
• если во внутренней записи есть поле с искомым именем, то
поиск заканчивается;
• если во внутренней записи поля с таким именем нет, то поиск
производится среди полей внешней записи (если вложенных операторов with больше, чем два, то поиск ведется последовательно во
всех задействованных записях в направлении "изнутри наружу");
• если среди полей всех вложенных записей нет искомого
идентификатора, компилятор считает его глобальной переменной.
Например:
73

date = record day: 1..31;
month: 1..12;
begin
end;
...
year: 1900..2005;
end;
student = record name: string[100];
{год поступления}
year: 1950..2005;
gruppa: string[5];
birth: date;
end;
with ivanov do
begin
...
with birth do
begin
...
year:= 2001;
gruppa:= 'IT01';
...
end;
...
end;
Запись с вариантной частью
Если заранее известно, что в массиве записей (таблице) некоторые поля могут оставаться пустыми (наборы пустых полей могут
быть разными для разных записей), то вполне понятно желание както сократить неиспользуемый, но занимаемый объем памяти.
Специально для таких случаев существуют записи с вариантной
частью.
Описание записи с вариантной частью
В разделе var запись с вариантной частью описывают так:
var <имя_записи>: record <поле1>: <тип1>;
[<поле2>: <тип2>;]
[...]
case <поле_переключатель>: <тип> of
<варианты1>: (<поле3>: <тип3>;<поле4>: <тип4>;...);
<варианты2>: (<поле5>: <тип5>; <поле6>: <тип6>;...);
[...]
end;
end;
Невариантная часть записи (до ключевого слова case) под-
чиняется тем же правилам, что и обычная запись. Вообще говоря,
невариантная часть может и вовсе отсутствовать.
74

Вариантная часть начинается зарезервированным словом case,
Автор
Издательство
Название
Название
Издательство
после которого указывается то поле записи, которое в дальнейшем
будет служить переключателем. Как и в случае обычного оператора
case, переключатель обязан принадлежать к одному из перечислимых
типов данных. Список вариантов может быть константой, диапазоном
или объединением нескольких констант или диапазонов. Набор полей,
которые должны быть включены в структуру записи, если выполнился
соответствующий вариант, заключается в круглые скобки.
Пример. Для того чтобы описать содержимое библиотеки, необходима следующая информация:
Для книг Для газет Для журналов
Название
Год издания
Дата выхода (день, месяц, год)
Издательство
Год и месяц издания
Номер
Графы "Название" и "Издательство" являются общими для всех
трех вариантов, а остальные поля зависят от типа печатного издания.
Для реализации этой структуры воспользуемся записью с вариантной
частью:
type biblio = record
name,publisher: string[20];
case item: char of
'b': (author: string[20]; year: 0..2004);
'n': (data: date);
'm': (year: 1700..2004;
month: 1..12;
number: integer);
end;
жаться либо 4, либо 5, либо 6 полей.
вариантной частью, определяется самым "длинным" ее вариантом.
Более "короткие" наборы полей из других вариантов занимают лишь
некоторую часть выделяемой памяти.
В зависимости от значения поля item, в записи будет содер-
Механизм использования записи с вариантной частью
Количество байтов, выделяемых компилятором под запись с
75

В приведенном выше примере самым "длинным" является ва-
’: для него требуется 23 байта (21 байт для строки и 2 байта
X
Y
(0,0)
риант ‘b
для целого числа). Для вариантов ‘n’ и ‘m’ требуется 4 и 5 байт
соответственно (см. таблицу).
name, publisher Item
... ‘b’ author year
... ‘n’ data
... ‘m’ year month number
... ‘b’ author year
Вариантная часть
Тема 14. Построение изображений на экране
Система координат
Для построения изображения на экране
в графическом режиме применяется система
координат несколько отличная от используемой в текстовом режиме.
Отчет начинается от верхнего левого
угла экрана, который имеет координаты
(0,0). Значение Х(столбец) увеличивается в
направлении слева на право, значение Y(строка) – в направлении
сверху вниз. При этом экран представляется в виде прямоугольного
массива адресуемых точек, а не символов, как в текстовом режиме.
Для различных типов адаптеров и режимов значения количества
точек по вертикали и горизонтали могут существенно различаться.
Определение значений максимальных координат экрана в модуле
Graph реализовано с помощью функций:
GetMaxX : integer;
GetMaxY : integer;
76

Если при адресации точек указываются значения координат,
превышающие максимальные, операция игнорируется.
Управление текущим указателем
Чтобы построить изображение, необходимо обязательно указать
начальную позицию. В текстовых режимах эту позицию определяет
положение курсора, который размещается каждый раз за последним
отображенным символом и указывает на местоположение сле-
дующего. В графических режимах видимого курсора нет, но есть
невидимый текущий указатель CP (current pointer), выполняющий те
же функции, что и курсор в текстовом режиме.
В графическом режиме для перемещения СР используются
процедуры MoveTo и MoveRel.
Процедура
MoveTo (x,y:integer);
перемещает текущий (курсор) указатель в точку с координатами
(x,y).
Процедура
MoveRel(dx,dy:integer);
перемещает СР на dx точек по горизонтали и на dy по вертикали
относительно последнего положения текущего указателя. При задании положительных значений dx или dy значения будут увеличиваться, при задании отрицательных – уменьшаться.
Для определения текущего положения графического курсора
используются функции
GetX : integer;
GetY : integer;
возвращающие значения текущих координат указателя (абсциссы
и ординаты соответственно). Функции позицирования текущего указа-
теля и определения его местонахождения работают корректно даже в
случае задания значений координат, превышающих допустимые.
Отображение точки на экране
Какие бы изображения ни выводились на экран, все они
построены из точек. Вообще говоря, для того, чтобы создать изо-
бражение любой степени сложности, достаточно иметь только
средство построения точки определенного цвета в нужном месте
77

экрана. В модуле Graph для отображения точки на экране исполь-
( )
11
, yx
( )
22
, yx
зуется процедура
PutPixel (x,y : integer; Color : wor d )
где х и у – экранные координаты точки, Color – ее цвет.
Паскаль позволяет организовать прямой доступ к каждому
пикселу экрана. Делается это функцией
GetPixel(x,y : integer) : word
которая определяет номер цвета пиксела с координатами (х,у).
Отображение линий на экране
Процедура вывода отрезка прямой на экран определена следующим образом:
Line(x1,y1,x2,y2: integer)
В ней задаются координаты начальной
(х1,у1) и конечной точек (х2,у2) линии.
Для построения отрезков применяются
еще две процедуры LineTo и LineRel.
Процедура
LineTo(x,y: integer)
строит отрезок из точки текущего положения указателя до точки
с координатами (х,у).
Процедура
LineRel(dx,dy: integer)
проводит отрезок от точки текущего положения указателя до
точки (CPX+dx, CPY+dy), где CPX и CPY – текущие координаты СР.
Паскаль позволяет вычерчивать линии самых различных стилей,
тонкие, широкие, штриховые, пунктирные и т.д. Установка стиля
производится процедурой
SetLineStyle(LineStyle:word;Pattern:word;Thickness:word)
Параметром LineStyle задается тип строки, Pattern – шаблон,
Thickness – толщина линии. Их значения приведены в таблице:
Построение прямоугольников на экране
Для построения прямоугольников и параллелепипедов используется несколько процедур. Первая из них – процедура построения
прямоугольника на плоскости:
Rectangle(x1,y1,x2,y2 : integer)
78

( )
22
, yx
( )
11
, yx
где х1, у1 – координаты левого верхнего
угла, х2, у2 – координаты правого нижнего угла
прямоугольника.
Это очень полезная процедура, с ее
помощью, в частности, можно легко построить диаграмму для
визуального анализа данных. Область внутри прямоугольника не
закрашена и совпадает по цвету с фоном экрана.
Процедура
SetFillStyle(Pattern,Color: Word);
устанавливает способ закраски.
Более эффективные прямоугольники можно строить с помощью
процедуры
Bar (x1,y1,x2,y2: integer)
Она рисует прямоугольник, внутренняя область которого залита по текущему шаблону. Данная процедура обычно исполь-
зуется в деловой графике для построения столбиковых диаграмм.
Параметры (
)
и
,
1
1
(
)
- координаты левого и правого
,
2
2
нижнего углов прямоугольника. Еще более наглядное представ-
ление информации при рисовании диаграмм позволяет получить
процедура
Bar3D(x1,y1,x2,y2: integer, D3:word, Top:Boolean)
С ее помощью можно отобразить параллелепипед, лицевая
сторона которого заливается по текущему шаблону, а глубина
задается в пикселах параметром D3. Параметр Top задает режим
отображения верхней плоскости: true – отображать, false –не
отображать. Этот параметр необходим для рисования столбцов,
расположенных «один на другом».
Построение многоугольников
Многоугольники можно рисовать самыми разными способами,
например, с помощью процедур Line или LineTo. В паскале имеется
процедура DrawPoly, которая позволяет строить любые много-
угольники с помощью линий текущего цвета, стиля и толщины. Она
имеет следующий синтаксис:
DrawPoly(NumPoints: word, var Polypoints)
79

DrawPoly позволяет отображать на экране любую ломаную,
(х,у)
R
EndAngle
StAngle
(x,y) R (x,y)
xR
yR
заданную совокупностью координат некоторого множества точек.
Это может быть как сложная геометрическая фигура, так и график
математической функции, заданной в табличном виде. Параметр
NumPoly это количество точек ломаной. В качестве параметра
PolyPoints задается переменная, тип ее может быть произвольным.
Обычно множество вершин многоугольника представляется как
массив записей типа PointType. Именно к такой структуре произ-
водится значение параметра PolyPoint при работе процедуры
DrawPoly.
Построение дуг, эллипсов и окружностей
Для изображения окружностей используется процедура
Circle(x,y : integer; R: word)
Здесь (х,у) – координаты центра окружности, а R –
ее радиус.
В ряде случаев, в частности для имитации объемных фигур,
используются дуги. Их можно вычертить с помощью процедуры
Arc(x,y : integer, StAngle, EndAngle R: word)
где (х,у) – центр окружности дуги, StAngle и
EndAngle – начальный и конечные углы, отсчи-
тываемые от горизонтальной оси против часовой стрелки, R –радиус. Очевидно, что если
StAngle=0 и EndAngke=359, то вычерчивается
полная окружность.
Для построения эллиптических дуг предназначена процедура
Ellipse(x,y : integer, StAngle, EndAngle xR, yR : w ord)
где (х,у) – центр эллипса, xR и yR –
горизонтальная и вертикальная оси. Дуга
эллипса вычерчивается текущим цветом от
начального угла StAngle до конечного угла
EndAngle, как и в процедуре Arc. Значения StAngle=0 и EndAngke=359
приведут к вычерчиванию полного эллипса.
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
