
- •Часть 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 Ошибки стадии выполнения
- •Ошибки ввода-вывода
- •Фатальные ошибки
- •Библиографический список
Редактирование записей
Одной из наиболее часто встречающихся задач, является редактирование записей основного набора данных. Например, Вахрушеву лишили стипендии. Для поиска записи используется индексный файл. Проблема возникает в том случае, если приходится изменить значение ключевого поля, которое является основой индексного файла. В этом случае по окончании редактирования записи основного файла следует внести изменения в индексный файл. Например, студентка с фамилией Вейнерман вышла замуж за студента Яковлева и изменила свою фамилию на Яковлеву. Одним из простейших способов решения этой проблемы является переиндексация. То есть повторное создание индексного файла. Это самый долгий по времени, но и самый надежный способ. Остальные способы мы рассматривать не будем, так это прерогатива специальных разделов информатики, а именно разработки программного обеспечения СУБД.
Пример 6. Вывести на экран монитора с целью коррекции информацию о студенте из файла STUDENTS.DAT, расположенном в корневом каталоге диска A. Поиск студента осуществить по его фамилии. Откорректировать любое из полей или все поля записи, и сохранить изменения в файле STUDENTS.DAT.
Алгоритм функционирования программы следующий:
Присвоить основному файлу имя (процедура Assign);
Открыть уже существующий на диске основной файл (процедура Reset);
Присвоить индексному файлу имя (процедура Assign);
Открыть уже существующий на диске индексный файл (процедура Reset);
Ввести с клавиатуры имя студента сведения о котором вы хотите посмотреть и возможно откорректировать.
Читать индексный файл запись за записью пока не будет достигнута метка EOF, сверяя имя студента с указанным. При совпадении организовать диалог для коррекции информации.
Скорректированную запись занести в соответствующую компоненту рабочего файла.
Если при коррекции было изменено ключевое поле, установить флаг FL в состояние TRUE.
Закрыть основной файл (процедура Close);
Закрыть индексный файл (процедура Close);
Если ключевое поле изменялось (анализ FL), то сделать переиндексацию.
Код программы приведен ниже. В программе сформирована процедура IND, которая обеспечивает переиндексацию файла в случае изменения ключевого поля FIO.
PROGRAM PR6;
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; I,J,N: INTEGER; ST,STI:STRING; STUD:STRING[20];
S:STUDENT; FS:FILE OF STUDENT; FI:FILE OF INDEX;
FL:BOOLEAN; {ФЛАГ: TRUE - ИЗМЕНИЛОСЬ КЛЮЧЕВОЕ ПОЛЕ}
PROCEDURE IND; {ПРЕРИНДЕКСАЦИЯ ФАЙЛА}
VAR MS: ARRAY[0..20] OF STUDENT;MI: ARRAY[0..20] OF INDEX;
BEGIN {ЧТЕНИЕ ФАЙЛА В МАССИВ MS}
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;
{ФОРМИРОВАНИЕ ИНДЕКСНОГО ФАЙЛА}
WRITELN('ЖДИТЕ ИДЕТ ИНДЕКСАЦИЯ ФАЙЛА ...',STI);
ASSIGN(FI, STI); REWRITE(FI);
FOR I := 0 TO N
DO WRITE(FI, MI[I]);
CLOSE(FI)
END;
END; {INDEX}
BEGIN
WRITE('ВВЕДИТЕ ИМЯ ОСНОВНОГО ФАЙЛА: '); READLN(ST);
ASSIGN (FS, ST); RESET(FS);
WRITE('ВВЕДИТЕ ИМЯ ИНДЕКСНОГО ФАЙЛА: '); READLN(STI);
ASSIGN (FI, STI); RESET(FI);
FL := FALSE;
WRITE('ВВЕДИТЕ ФАМИЛИЮ СТУДЕНТА: '); READLN(STUD);
WHILE NOT EOF(FI) {ПРОСМОТР ИНДЕКСНОГО ФАЙЛА}
DO BEGIN
READ(FI, L);
IF L.FIO = STUD {Найдена запись, подлежащая коррекции}
THEN BEGIN
SEEK(FS, L.NAMBER); READ(FS, S); {Чтение записи из файла}
WRITE(S.TAB, '=> '); READLN(S.TAB); {Коррекция}
WRITE(S.FIO, '=> '); READLN(S.FIO); {полей }
WRITE(S.DATA, '=> '); READLN(S.DATA); {записи }
WRITE(S.GRUP, '=> '); READLN(S.GRUP);
WRITE(S.STEPA, '=> '); READLN(S.STEPA);
IF S.FIO<>STUD THEN FL:=TRUE; {Ключевое поле FIO изменено}
SEEK(FS,L.NAMBER); WRITE(FS,S) {Сохранение изменений}
END
END;
CLOSE(FS); CLOSE(FI);
IF FL
THEN IND; {ПРИ ИЗМЕНЕНИИ КЛЮЧЕВОГО ПОЛЯ ИДЕТ ПЕРЕИНДЕКСАЦИЯ}
END.