
- •Часть 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.5 Создание индексного файла
Процесс первоначального создания индексного файла называется индексацией. При работе с базой данных существует невидимая информационная (реляционная) связь между двумя таблицами (файлами STUDENTS.DAT и STUDENTS.NTX), при этом индексный файл должен постоянно отслеживать состояние основного файла. Этот процесс необходимый атрибут ведения базы данных. Но файлы располагаются раздельно, и по этой причине возникают различные ситуации, при которых индексный файл перестает соответствовать основному файлу. В этой ситуации приходится старый индексный файл удалять с диска, а на его месте создавать новый индексный файл. Этот процесс называется переиндексацией.
Пример 4. Для файла STUDENTS.DAT, расположенном в корневом каталоге диска A создать индексный файл STUDENTS.NTX, соответствующий табл. 4.
Ниже приведен код программы, обеспечивающей индексацию файла STUDENTS.DAT. Имя индексного файла формируется автоматически из имени основного файла. Файл размещается в том же директории, что и основной.
PROGRAM PR4;
TYPE STUDENT = RECORD
TAB : LONGINT;
FIO : STRING[20];
DATA : STRING[8];
GRUP : STRING[7];
STEPA: REAL
END;
INDEX = RECORD
FIO : STRING[20];
NAMBER: INTEGER
END;
VAR MS: ARRAY[0..20] OF STUDENT;
MI: ARRAY[0..20] OF INDEX; L: INDEX;
I, J, N: INTEGER; FS: FILE OF STUDENT; ST,STI: STRING;
FI: FILE OF INDEX;
BEGIN {ЧТЕНИЕ ФАЙЛА В МАССИВ MS}
WRITELN('ВВЕДИТЕ ИМЯ ИНДЕКСИРУЕМОГО ФАЙЛА: '); READLN(ST);
ASSIGN (FS, ST); RESET(FS);
N := -1; {НОМЕР ЗАПИСИ В ФАЙЛЕ}
WHILE NOT EOF(FS)
DO BEGIN
N := N+1;
READ(FS, MS[N])
END;
CLOSE(FS);
IF N > -1
THEN BEGIN
{ЗАПОЛНЕНИЕ МАССИВА ИНДЕКСОВ MI}
FOR I:=0 TO N
DO BEGIN MI[I].FIO := MS[I].FIO; MI[I].NAMBER := I END;
{СОРТИРОВКА ИНДЕКСНОГО МАССИВА ПО КЛЮЧЕВОМУ ПОЛЮ FIO}
FOR I := 0 TO N
DO FOR J := N DOWNTO I + 1
DO IF MI[J-1].FIO > MI[J].FIO
THEN BEGIN
L := MI[J-1]; MI[J-1] := MI[J]; MI[J] := L
END;
{ФОРМИРОВАНИЕ ИМЕНИ ИНДЕКСНОГО ФАЙЛА}
IF POS('.',ST) = 0
THEN STI := ST + '.NTX'
ELSE STI := COPY(ST, 1, POS('.', ST)) + 'NTX';
{ФОРМИРОВАНИЕ ИНДЕКСНОГО ФАЙЛА}
WRITELN('ЖДИТЕ ИДЕТ ИНДЕКСАЦИЯ ФАЙЛА ...', STI);
ASSIGN(FI, STI); REWRITE(FI);
FOR I := 0 TO N
DO WRITE(FI, MI[I]);
CLOSE(FI)
END
ELSE WRITE ('ФАЙЛ ',ST, ' НЕ СОДЕРЖИТ НИ ОДНОЙ ЗАПИСИ!')
END.
3.6 Работа с файлом произвольного доступа
Рассмотрим четыре важнейших режима работы с файлом прямого доступа: просмотр информации в файле; редактирование содержимого полей существующих в файле записей; корректировку структуры файла с сохранением информации; удаление существующей записей; добавление новой записи.
Просмотр файла
Доступ к компонентам файла произвольного доступа может быть как последовательный, так и произвольный. Но при этом мы просматриваем записи в том порядке как они располагаются на диске в основном файле. Часто этот порядок нас не устраивает. Например, хочется вывести сведения о студентах в алфавитном порядке их фамилий, или по группам, а в каждой группе упорядочить по фамилиям. Именно для этих целей и используются индексные файлы и процедура Seek.
Приведем порядок действий (алгоритм) при просмотре файла произвольного доступа:
Присвоить файлу имя (процедура Assign);
Открыть файл (процедура Reset) и запросить индексный файл;
Присвоить индексному файлу имя (процедура Assign);
Открыть индексный файл (процедура Reset);
Осуществить последовательный просмотр индексного файла начиная с первой записи до метки EOF, выполняя для каждой записи следующие два пункта.
Для каждой записи индексного файла, используя процедуру Seek установить указатель основного файла на соответствующую запись;
Считать нужный компонент (оператор read) основного файла и вывести на экран монитора;
Закрыть файлы (процедура Close).
Пример 5. Вывести на экран монитора в алфавитном порядке фамилий сведения о студентах, хранящихся в файле STUDENTS.DAT, расположенном в корневом каталоге диска A.
Именно для решения таких задач и создаются индексные файлы. В нашем случае будем использовать индексный файл STUDENTS.NTX.
PROGRAM PR5;
TYPE STUDENT = RECORD
TAB : LONGINT;
FIO : STRING[20];
DATA : STRING[8];
GRUP : STRING[7];
STEPA: REAL
END;
INDEX = RECORD
FIO : STRING[20];
NAMBER: INTEGER
END;
VAR L: INDEX; S: STUDENT; I, J, N: INTEGER;
FS: FILE OF STUDENT; ST, STI: STRING; FI: FILE OF INDEX;
BEGIN {ЧТЕНИЕ ФАЙЛА В МАССИВ MS}
WRITELN('ВВЕДИТЕ ИМЯ ОСНОВНОГО ФАЙЛА: '); READLN(ST);
ASSIGN (FS, ST); RESET(FS);
WRITELN('ВВЕДИТЕ ИМЯ ИНДЕКСНОГО ФАЙЛА: '); READLN(STI);
ASSIGN (FI, STI); RESET(FI);
WHILE NOT EOF(FI) {ПРОСМОТР ИНДЕКСНОГО ФАЙЛА}
DO BEGIN
READ(FI, L);
SEEK(FS, L.NAMBER);
READ(FS, S);
WRITELN(S.TAB:9, S.FIO:15, S.DATA:10, S.GRUP:9 , S.STEPA:9:2)
END;
CLOSE(FS); CLOSE(FI);
END.