
- •Федеральное агентство по образованию
- •Структурированные типы данных. Классификация
- •Массивы Определение массива
- •Обращение к элементу массива. Хранение элементов массива. Доступ к элементам массива
- •Действия над массивами
- •Поиск элемента (одномерного ) массива Поиск среди неупорядоченных элементов массива
- •Поиск среди упорядоченных элементов массива
- •Сортировка элементов (одномерного) массива
- •Линейная сортировка (сортировка отбором)
- •Сортировка методом пузырька
- •5 4 3 1 2
- •5 4 3 2 1 Метод быстрой сортировки с разделением
- •Множества
- •Объявление множеств
- •Представление в памяти переменной типа множество
- •Операторы для работы с множествами Проверка принадлежности элемента множеству
- •Операции над множествами
- •Сравнение множеств
- •Применение множеств
- •Процедуры и структурное программирование
- •Преимущества структурного программирования
- •Планирование структурированной программы
- •Метод программирования сверху вниз
- •Определение процедуры
- •Передача управления при вызовах процедур и функций
- •Функции: подпрограммы,возвращающие единственный результат
- •Понятие блока
- •Область действия и время жизни переменных
- •Особенности локальных переменных
- •Особенности глобальных переменных
- •Особенности использования процедур и функций в турбо паскале
- •Опережающее определение процедур и функций
- •Рекурсия и итерация
- •Процедуры и функции как параметры
- •Директивы подпрограмм
- •Отладка и тестирование программ, содержащих подпрограммы
- •Нисходящее тестирование и подпрограммы-заглушки
- •Восходящее тестирование и программы-тестеры
- •Рекомендации по отладке программ, содержащих подпрограммы
- •Использование отладчикадля трассировки процедур
- •Запуск внешних программ
- •Стандартные модули
- •Модуль Crt
- •Модуль Graph
- •Функции
- •Текстовые файлы
- •Нетипизированные файлы
- •Типизированные файлы
- •Прямой доступ
- •Дополнительные функции работы с файлами
- •Обработка ошибок ввода-вывода
- •Указатели и динамические переменные Статические и динамические переменные
- •Адресация памяти в Турбо Паскале
- •Карта памяти Турбо Паскаля
- •Указатели
- •Операция для получения адреса
- •Функции для работы с адресами
- •Процедуры для работы с указателями
- •Присваивание значений указателям
- •Организация ссылок
- •Динамические структурированные переменные Динамические записи
- •Динамические массивы
- •Массивы размером более 64 кбайт
- •Строки с завершающим нулем (asciiz)
- •Процедуры и функции модуля strings
- •Указатели на процедуры и функции
- •Динамические структуры данных
- •Линейные списки
- •60 Лекции по курсу «Языки программирования» Часть II
Модуль Graph
Модуль обеспечивает работу с экраном в графическом режиме.
Экран в графическом режиме представляется в виде совокупности точек -пикселов (pixel, сокращение от picture element). Цвет каждого пиксела можно задавать отдельно. Начало координат находится в левом верхнем углу экрана и имеет координаты (0, 0). Количество точек по горизонтали и вертикали (разрешение экрана) и количество доступных цветов зависят от графического режима. Графический режим устанавливается с помощью служебной программы — графического драйвера.
В состав оболочки входят несколько драйверов, каждый из которых может работать в нескольких режимах. Режим устанавливается при инициализации графики либо автоматически, либо программистом. Самый «мощный» режим, поддерживаемый модулем Graph, — 640 х 480 точек, 16 цветов.
Модуль Graph обеспечивает:
вывод линий и геометрических фигур заданным цветом и стилем;
закрашивание областей заданным цветом и шаблоном;
вывод текста различным шрифтом, заданного размера и направления;
определение окон и отсечение по их границе;
использование графических спрайтов и работу с графическими страницами.
В отличие от текстового режима в графическом курсор невидим, однако его можно переместить в любую точку экрана. Текущее положение курсора используют многие процедуры вывода изображений. При определении на экране окна началом координат считается левый верхний угол этого окна.
Перед выводом изображения необходимо определить его стиль, то есть задать цвет фона, цвет линий и контуров, тип линий (например, сплошная или пунктирная), их толщину, шаблон (орнамент) заполнения, вид и размер шрифта и т. д.
Эти параметры устанавливаются с помощью соответствующих процедур. Возможные значения параметров определены в модуле Graph в виде многочисленных констант. Например, константа DottedLn определяет пунктирную линию, а константа CenterText — выравнивание текста по центру .отведенного ему поля.
Структура графической программы
Программа, использующая графический режим, должна содержать следующие действия.
Подключение модуля Graph.
Перевод экрана в графический режим.
Установка параметров изображения.
Вывод изображения.
Возврат в текстовый режим.
Записи
В программах часто возникает необходимость логического объединения данных. Например, база данных предприятия содержит для каждого сотрудника его фамилию, дату рождения, должность, оклад и т. д.; программа моделирования движения поездов — пункты отправления и прибытия, время, количество вагонов и многое другое. Однотипные данные, как вы уже знаете, организуются в массивы, а для объединения разнотипных данных предназначен тип «запись». Он вводится с помощью ключевого слова record. Элементы записи называются полями.
Синтаксическая диаграмма:
type
имя_типа = record
описание 1-го поля записи;
описание 2-го поля записи;
……………….
описание n-го поля записи;
end;
Поля записи могут быть любого типа, кроме файлового.
Переменные типа «запись» описываются обычным образом. Можно задавать описание типа при описании переменной, создавать массивы из записей, записи из массивов и т. д.:
С записями целиком можно делать то же, что и с массивами: присваивать одну запись другой, если они одного типа.
Все остальные действия выполняются с отдельными полями записи. Есть два способа доступа к полю записи: либо с помощью конструкции <имя_записи>.<имя_поля>, либо с использованием оператора присоединения with.
Оператор with удобнее использовать, если требуется обращаться к нескольким полям одной и той же записи.
Инициализация записей выполняется в разделе констант, при этом для каждого поля задается его имя, после которого через двоеточие указывается значение.
const g : goods = (name : 'boots'; price : 200: number : 10);
Записи с вариантной частью
Этот вид записей применяется для экономии памяти. Представьте себе массив записей, состоящих из многих полей; в каждой записи заполнена только часть полей, причем в разных записях разная. Изменяющаяся часть записи называется вариантной. Все варианты располагаются в памяти на одном и том же месте в конце записи.
Синтаксическая диаграмма:
Вариантная часть может быть только одна, ее длина равна длине наибольшего из вариантов.
Записи с вариантной частью применяются только тогда, когда известно, что любая конкретная запись может содержать набор полей только из одного варианта. Какой именно вариант используется, можно определить по значению поля <вариант>, о формировании значения которого должен позаботиться сам программист.
Поле варианта должно быть порядкового типа. Часто его делают перечисляемым.
Можно не хранить в записи поле варианта, в этом случае его имя не указывается.
Доступ к вариантным полям остается на совести программиста, то есть ничто не мешает записать в вариантную часть одни поля, а обратиться к ним через другие.
Файлы
Файловые типы данных введены в язык для работы с внешними устройствами — файлами на диске, портами, принтерами и т. д. Передача данных с внешнего устройства в оперативную память называется чтением, или вводом, обратный процесс — записью, или выводом.
Файловые типы языка Паскаль бывают стандартные и определяемые программистом. Стандартными являются текстовый файл (text) и нетипизированный файл (file). Они описываются в программе, например, так:
var
ft : file;
fb : text;
Программист может определить файл, состоящий из элементов определенного типа. Такой файл называется компонентным, или типизированным:
var
fc : file of <тип_компонент>;
Компоненты могут быть любого типа, кроме файлового. Любой файл, в отличие от массива и записи, может содержать неограниченное количество элементов.
Текстовые файлы предназначены для хранения информации в виде строк символов. При выводе в текстовый файл данные преобразуются из внутренней формы представления в символьную, понятную человеку, при вводе выполняется обратное преобразование.
Типизированные и нетипизированные файлы хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть при обмене с файлом происходит побитовое копирование информации.
Доступ к файлам может быть последовательным, когда очередной элемент можно прочитать (записать) только после аналогичной операции с предыдущим элементом, и прямым, при котором выполняется чтение (запись) произвольного элемента по заданному адресу. Текстовые файлы позволяют выполнять только последовательный доступ, а в типизированных и нетипизированных можно использовать оба метода.
Прямой доступ возможен благодаря тому, что данные в этих файлах условно разделены на блоки одинакового размера и перед операцией обмена выполняется установка текущей позиции файла на заданный блок. Прямой доступ в сочетании с отсутствием преобразований обеспечивает высокую скорость получения нужной информации.
Для понимания сути работы с файлами полезно разделить их по признаку наличия или отсутствия преобразования информации при выполнении чтения-записи и по способу доступа.
Классификация файлов Паскаля
Файл |
Преобразование |
Прямой доступ |
Текстовый |
+ |
– |
Типизированный |
– |
+ |
Нетипизированный |
– |
+ |
Чтобы не путать файлы в программе и файлы на диске, переменные файлового типа называют логическими файлами, а реальные устройства и файлы на диске — физическими файлами. Их имена задаются с помощью строк символов, например:
'primer.pas' - имя файла в текущем каталоге;
'd:\pascal\input.txt' - полное имя файла
'CON' 'NUL' 'COM1' 'PRN' - имена устройств
Для организации ввода-вывода в программе необходимо выполнить следующие действия.
1. Объявить файловую переменную.
2. Связать ее с физическим файлом.
3. Открыть файл для чтения и/или записи.
4. Выполнить операции ввода-вывода.
5. Закрыть файл.
Все стандартные процедуры и функции Паскаля, обеспечивающие ввод-вывод данных, работают только с логическими файлами, то есть с файловыми переменными. Перед выполнением операций файловая переменная связывается с физическим файлом, после чего он в тексте программы не упоминается.
Ввод-вывод выполняется не непосредственно между внешним устройством и переменными программы, а через так называемый буфер — специальную область оперативной памяти. Буфер выделяется для каждого открытого файла. При записи в файл вся информация сначала направляется в буфер и там накапливается до тех пор, пока весь буфер не заполнится. Только после этого или после специальной команды сброса происходит передача данных на внешнее устройство. При чтении из файла данные вначале считываются в буфер, причем данных считывается не столько, сколько запрашивается, а сколько поместится в буфер.
Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с внешними устройствами.
В Паскале есть подпрограммы, применяемые для файлов любого типа, а также подпрограммы для работы только с определенными типами файлов. Рассмотрим сначала первые.
Процедуры и функции для работы со всеми типами файлов
Процедуры | |
assign(var f; filename : string) |
Связывает логический файл f с физическим файлом, имя которого задано в строке filename. Если путь к файлу не задан, предполагается, что он находится в текущем каталоге. |
close(var f)
|
Закрывает открытый логический файл. Вызов процедуры close необходим при завершении работы с файлом, который был открыт для записи, поскольку при ее выполнении происходит выгрузка содержимого буфера. При отсутствии процедуры close последнее содержимое буфера вывода может быть утеряно. Для входных файлов закрывать файл не обязательно. |
erase(var f)
|
Уничтожает физический файл, который был связан с файловой переменной f. Файл к моменту вызова этой процедуры должен быть закрыт. |
rename(var f; newname : string)
|
Переименовывает физический файл на диске, связанный с логическим файлом f. Переименование возможно после закрытия файла. |
reset(var f)
|
Открывает логический файл f для последующего чтения данных, то есть открывает входной файл. После успешного выполнения процедуры reset файл готов к чтению из него первого элемента. |
rewrite(var f)
|
Открывает логический файл f для записи данных (открывает выходной файл). После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если физический файл, с которым связана переменная f, существовал ранее, он очищается, то есть вся информация из него теряется. Если файл не существовал, он создается. |