
- •Часть I. Этапы решения задачи на компьютере 7
- •Часть II. Задачи. Алгоритмизация и программирование 15
- •Часть III. Теоретические положения и примеры программ 188
- •Введение
- •Часть I. Этапы решения задачи на компьютере
- •1.1 Постановка и формализация условий задачи
- •1.2 Алгоритмизация задачи
- •1.2.1 Интерпретация объектов
- •1.2.2 Вычислительная схема
- •1.2.3 Вычислительная схема решаемой задачи
- •1.2.4 Составление блок-схемы
- •1.2.5 Трассировка
- •1.3 Составление программы на языке Паскаль
- •1.4 Подготовка текста программы на машинном носителе
- •1.5 Трансляция (компиляция) программы
- •1.6 Компоновка (редактирование связей)
- •1.7 Запуск программы на исполнение
- •1.8 Анализ результатов
- •Часть II. Задачи. Алгоритмизация и программирование классических вычислительных процессов
- •1 Линейный вычислительный процесс
- •1.1 Программирование формул
- •1.2 Формализация и алгоритмизация задачи
- •2 Разветвляющийся вычислительный процесс
- •2.1 Программирование формул
- •2.2 Формализация и алгоритмизация графических задач
- •2 .3 Параметрические задачи
- •3 Циклические вычислительные процессы
- •3.1 Арифметический цикл
- •Вычисление произведения n сомножителей.
- •Табулирование функции на конечном отрезке.
- •3.2 Итерационный цикл
- •Вычисление предела последовательности с заданной точностью.
- •Вычисление суммы бесконечного ряда с заданной точностью.
- •3.3 Арифметические циклы с рекуррентными соотношениями
- •3.4 Итерационные циклы с рекуррентными соотношениями
- •3.5 Двойной вложенный цикл
- •4. Пользовательские алгебраические функции
- •4.1 Применение функции в линейных и разветвляющихся вычислительных процессах
- •4.2 Использование функции в циклических процессах
- •4.3 Табуляция функции
- •5 Одномерные числовые массивы
- •5.1 Работа с компонентами массива
- •5.2 Работа с векторами
- •6 Двумерные числовые массивы
- •6.1 Работа с элементами массива
- •6.2 Работа с векторами и матрицами
- •6.3 Использование процедур и функций для работы с массивами
- •7 Работа со строками
- •7.1 Анализ и преобразование текста строки
- •7.2 Работа со строковыми функциями и процедурами
- •8 Работа со списками
- •8.1 Стеки
- •8.2 Очереди
- •8.3 Бинарные деревья
- •9 Работа с текстовыми файлами
- •10 Работа с файлами записей
- •11 Компьютерная графика
- •12 Анимация изображений
- •Часть III. Теоретические положения и примеры программ
- •1 Вычисление определителя квадратной матрицы
- •2.2 Использование записей для описания таблиц
- •Работа с полями записи
- •Использование оператора with … do
- •Ввод данных в массив записей с клавиатуры
- •2.3 Вложение записей
- •Присвоение значений полям вложенных записей
- •3 Файлы записей
- •3.1 Структура файла
- •3.2 Встроенные процедуры и функции обработки файлов
- •3.3 Организация последовательного доступа к записям файла
- •3.4 Организация прямого доступа к компонентам файла
- •3.5 Создание индексного файла
- •3.6 Работа с файлом произвольного доступа
- •Просмотр файла
- •Редактирование записей
- •Изменение структуры основного файла
- •Использование клавиш для управления программой
- •Удаление записи из файла
- •Добавление записи в файл
- •3.7 Информационное взаимодействие текстовых файлов и файлов записей
- •Экспорт данных. Копирование информации из файла записей в текстовый файл
- •Импорт данных. Копирование информации из текстового файла в файл записей
- •3.8 Запросы к файлам записей
- •Запрос с группировкой
- •4 Графическое программирование
- •4.1 Управление видеорежимом
- •Инициализация видеорежима. Процедура InitGraph
- •Закрытие видеорежима. Процедура CloseGraph
- •Создание графического окна. Процедура SetViewPort
- •Закрытие графического окна. Процедура ClearDevice
- •4.2 Построение графических фигур
- •Построение прямой линии. Процедуры SetColor, SetLineStyle, Line, LineRel, LineTo
- •Построение прямоугольника. Процедуры Rectangle и Bar
- •Построение окружности. Процедура Circle
- •Построение дуги окружности. Процедура Arc
- •Построение эллипса. Процедуры Ellipse, FillEllipse
- •Построение сектора. Процедуры PieSlice, Sector
- •4.3 Корректировка изображения Процедуры GetAspectRatio, SetAspectRatio
- •4.4 Создание пользовательского шаблона заливки
- •Заливка замкнутой области. Процедура FloodFill
- •Построение и окраска произвольного рисунка на примере замка
- •Построение и заливка правильного многоугольника
- •4.5 Работа с текстом
- •Выбор стандартного шрифта. Процедура SetTextStyle
- •Коррекция стандартного шрифта. Процедура SetUserCharSize
- •Вывод числовых величин на экран
- •5 Анимация изображений
- •5.1 Дублирования спрайта цветом фона
- •5.2 Манипулирование фрагментами изображения
- •5.3 Использование страниц видеопамяти
- •6 Сообщения об ошибках
- •6.1 Ошибки стадии компиляции
- •6.2 Ошибки стадии выполнения
- •Ошибки ввода-вывода
- •Фатальные ошибки
- •Библиографический список
3.1 Структура файла
Файл хранится во внешней памяти на магнитном диске, и по мере необходимости данные из файла вызываются в оперативную память для обработки. Различают следующие состояния файла:
Закрыт для чтения и записи;
Открыт для записи, закрыт для чтения;
Открыт для чтения закрыт для записи компонент;
Открыт для чтения, открыт для записи компонент.
Доступ к компонентам файла осуществляется через указатель файла (буферную переменную). При чтении или записи этот указатель перемешается к следующему компоненту и делает его доступным для обработки. Буферная переменная имеет отличие от всех других переменных: она не может участвовать в выражениях и операторах присваивания.
Для типизированных файлов к которым относятся и файлы записей используют два способа доступа к компонентам файла: последовательный и прямой (произвольный). Исторически, это разделение вызвано наличием устройств с последовательным (стримеры) и прямым доступом (магнитные диски). При последовательном способе доступа поиск начинается с первой записи файла и проверяется по очереди каждый компонент, пока не будет найден нужный (нужные). Произвольный способ доступа позволяет обращаться к компоненту по его порядковому номеру в файле. Если файлы расположены на магнитных дисках, то допускается значительная гибкость при работе с компонентами. Например, компоненты последовательно организованного файла могут обрабатываться с помощью прямого доступа, а компоненты произвольного файла - последовательно. Однако программист с самого начала на основе анализа структуры данных, требований к функциям программы и существующих ограничений должен четко уяснить, какой способ доступа к компонентам ему необходимо выбрать. От этого во многом зависит успех решения задачи и эффективность работы разрабатываемой программы. Концептуальная схема файла приведена на рис.3.1.
Рис. 3.1 Схема файла: а) файл содержит N компонент, б) пустой файл.
На рис. 3.1.а представлен файл, с именем S, содержащий N компонент (записей). А на рис. 3.1.б изображен пустой файл, в котором нет ни одной компоненты, только название и метка конца файла.
Каждому файлу пользователя должно быть присвоено уникальное имя (в рамках каталога в котором этот файл хранится), которое используется при обращении к этому файлу. Имя должно соответствовать стандарту MS-DOS, и состоит из собственно имени (от 1 до 8 символов: букв или цифр) и необязательного типа файла (до 3-х символов). Если тип файла присутствует, он отделяется от первой части имени точкой. Тип файла присваивается обычно в мнемонической зависимости от содержимого файла.
Пример имени файла: STUDENTS.DAT
Для обращения к файлу необходимо указать путь, то есть имя диска, на котором расположен нужный файл (A, B, C, D, E …) корневой директорий \, и поддиректории, если они есть. Пример пути и имени файла, расположенного в корневом каталоге на дискете: A:\STUDENTS.DAT
3.2 Встроенные процедуры и функции обработки файлов
Процедуры осуществляют все необходимые действия по организации файлов и доступу к компонентам файлов. Процедуры и функции для работы с файлами записей весьма похожи на аналогичные процедуры и функции, которые рассматривались ранее для текстовых файлов.
Для организации доступа к файлу записей следует объявить файловую переменную F следующим образом:
VAR F: FILE OF <тип компонент>;
Assign (F, ST) - присвоить в программе имя файлу. Имя файла, которое является значением ST (строка текста типа String), ставится в соответствие с переменной файлового типа F. С момента выполнения процедуры Assign все действия над этой переменной будут эквивалентны действиям над файлом, с именем определяемым значением ST.
Rewrite (F) - создать новый пустой файл. Эта процедура служит для создания нового файла на диске. Имя файла должно быть предварительно определено в процедуре Assign. Если на диске уже был файл с таким именем, он уничтожается. Указатель файла устанавливается в первую позицию (с номером 0). Фактически файл не содержит ни одного компонента, он только подготовлен для загрузки (см. схему на рис. 3.2).
Рис. 3.2 Состояние файла F после выполнения команды Rewrite (F)
Reset (F) - установить указатель в начало файла. Выполнение процедуры обеспечивает установку указателя файла на первый компонент (запись с номером 0, см. рис. 3.3). Если эта процедура применена к несуществующему в указанном каталоге файлу, возникает ошибка ввода-вывода.
Рис. 3.3 Состояние файла F после выполнения команды Reset (F)
Read (F, Z) - читать текущий компонент из файла. С помощью этой команды производится чтение из дискового файла, определенного файловой переменной F значений Zl, Z2, ... , ZN. После завершения выполнения процедуры, то есть чтения текущего компонента в переменную Z, указатель файла устанавливается на следующий компонент (запись).
Write (F, Z) - записать новый компонент в файл. Переменные Zl, Z2, ... , ZN записываются в дисковый файл, определенный переменной F. После выполнения процедуры указатель перемещается к следующему компоненту.
Seek (F, k) - установить указатель на компонент Zk с порядковым номером k в файле. Указатель перемещается к компоненту с номером k, начиная счет с нуля, т.е. первый компонент имеет номер 0, второй - 1, третий - 2 и т.д.
Close(F) - закрыть файл. Выполнение процедуры обеспечивает закрытие файла, назначенного переменной F. Если файл был открыт, никогда не следует выходить из программы, предварительно не закрыв его.
Erase(F) - уничтожить файл. Выполнение процедуры вызывает уничтожение файла, назначенного переменной F. Если производится уничтожение открытого файла, его необходимо предварительно закрыть с помощью процедуры Close.
Rename(F, ST) - переименовать файл. Выполнение процедуры вызывает занесение в каталог диска (директорий) нового имени файла, определенного переменной F. Новое имя определяется значением текста в строке ST.
Truncate (F) - уничтожить все компоненты файла, начиная с места текущего положения указателя, и подготовить файл для записи.
Помимо перечисленных выше процедур следует использовать перечисленные ниже функции, которые выполняют дополнительные действия, облегчающие программисту обслуживание уже существующих файлов.
Eof (F) - проверить маркер "конец файла". Значение функции равно True, если указатель файла находится сразу за последним компонентом файла, и False в любом другом случае.
FilePos (F) - определить текущий номер компонента. Функция возвращает целочисленное значение, равное номеру компонента, на котором установлен в данный момент указатель файла, соответствующего переменной F. Отсчет номера компонента начинается с нуля.
FileSize (F) - определить размер файла. Функция возвращает целочисленное значение, равное количеству компонентов файла, соответствующего переменной F. Эта функция обычно используется для проверки, содержит файл какую-либо информацию или является пустым. Если FileSize (F) = 0, то файл пуст, в другом случае файл содержит данные.
lOResult (F) - проверить результат выполнения последней операции ввода-вывода на наличие ошибок. Если ошибка обнаружена, функция возвращает номер ошибки, если ошибок нет, возвращает значение 0. Эта функция используется при пассивном состоянии директивы {$I-} для организации обработки ошибок ввода-вывода самим пользователем. Если программа для обработки ошибок отсутствует, наличие ошибки ввода-вывода не вызывает прерывания программы и выполняется следующий оператор.