
- •Часть 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 Ошибки стадии выполнения
- •Ошибки ввода-вывода
- •Фатальные ошибки
- •Библиографический список
Удаление записи из файла
Удаление записей происходит в два этапа. На первом этапе запись помечается как удаляемая. Для этого в записи предусматривается специальное поле DEL: BYTE, занимающее один байт памяти. При пометке записи на удаление в нее заносится специальный код, например, $FF. Таким образом, удаленные записи физически продолжают существовать еще какое-то время. Как правило, при просмотре файла они высвечиваются с пометкой Delete. Если пользователь базы данных обнаружил, что напрасно хочет удалить ту или иную запись он может ее восстановить, повторной пометкой записи на удаление.
На втором этапе происходит физическое удаление записей помеченных как удаляемые. Этот процесс называется сжатием файла. Создается рабочий файл TEMP структура которого тождественна сжимаемому. Основной файл просматривается с первой записи до последней. Каждая запись основного файла проверяется на признак “удалена” DEL = $FF. Если это условие не выполнено, то текущая запись копируется в файл TEMP. Таким образом, когда мы достигнем метки EOF основного файла все непомеченные на удаление записи этого файла будут скопированы в рабочий файл. Теперь следует удалить основной файл с помощью процедуры Erase. А файлу TEMP присвоить имя основного файла с помощью процедуры Rename.
Пример 9. Требуется разработать программу, обеспечивающую последовательный просмотр и пометку удаляемых записей в файле STUDENTS.DAT с помощью поля - DEL: BYTE, а также сжатие файла, если это нужно пользователю.
PROGRAM PR9;
USES CRT;
Type STUDENT = record
tab : Longint;
Fio : String[15];
Data : String[8];
Grup : String[7];
Stepa: Real;
DEL: BYTE;
DATE: STRING[8]
end; {RECORD}
Var S:STUDENT; St: String;CH, CH1: CHAR;
Fs, Fi: File of STUDENT; NZ: WORD;
FUNCTION DL(X: BYTE): STRING;
BEGIN
DL := ' ';
IF X = $FF THEN DL := 'DELETE'
END; {FUNCTION}
Begin
Writeln('Введите имя основного файла: '); Readln(St);
Assign (Fs, St); Reset(Fs); {открытие основного файла}
WRITELN('Используйте клавиши:');
WRITELN('ESC - завершение работы с записями файла;');
WRITELN('ENTER - переход к следующей записи;');
WRITELN('DEL - пометка записи на удаление, отмена признака;');
WRITELN('Пробел - повторный вывод записи;');
WRITELN('HOME - первая запись в файле;');
WRITELN('Стрелка вверх - предыдущая запись.');
While Not Eof(Fs) {Просмотр основного файла}
Do begin
NZ := FILEPOS(Fs); {Запомнить номер текущей записи}
Read(Fs, S);
WRITELN(NZ:2, S.TAB:9, S.FIO:17, S.Data:10, S.Grup:9,
S.STEPA:9:2, DL(S.DEL):8);
CH:=' ';CH1:=' '; CH := READKEY; {Ожидание нажатия клавиши}
IF ORD(CH) = 0
THEN BEGIN CH1:=READKEY;{КЛАВИШИ ВТОРОЙ ГРУППЫ}
CASE ORD(CH1) of
83: BEGIN
IF S.DEL = $FF {НАЖАТА КЛАВИША: DEL}
THEN S.DEL:= $00 {ОТМЕНА УДПЕНИЯ}
ELSE S.DEL:= $FF; {ПОМЕТКА ЗАПИСИ НА УДАЛЕНИЕ}
SEEK(Fs, NZ);
WRITE(FS,S) {ЗАПИСЬ ОТМЕТКИ В ФАЙЛ}
END;
72: IF NZ=0 {НАЖАТА КЛАВИША: Стрелка вверх}
THEN SEEK(Fs, NZ) {ПЕРВАЯ ЗАПИСЬ }
ELSE SEEK(Fs, NZ-1);{НА ПРЕДЫДУЩУЮ ЗАПИСЬ }
71: SEEK(Fs,0) {НАЖАТА КЛАВИША: HOME }
END {CASE}
END {THEN}
ELSE CASE ORD(CH) of {КЛАВИШИ ПЕРВОЙ ГРУППЫ}
13: CONTINUE; {НАЖАТА КЛАВИША: ENTER}
27: BREAK; {НАЖАТА КЛАВИША: ESC }
32: SEEK(Fs,NZ) {НАЖАТА КЛАВИША: ПРОБЕЛ}
END; {CASE}
END; {WHILE}
WRITELN ('БУДЕТЕ СЖИМАТЬ ФАЙЛ: Y - ДА'); READLN(CH);
IF (CH = 'y') OR (CH = 'Y')
THEN BEGIN
Assign(Fi,'A:\TEMP'); Rewrite(Fi); {СОЗДАНИЕ РАБОЧЕГО НАБОРА}
SEEK(Fs,0);
While Not Eof(FS) {ПРОСМОТР ОСНОВНОГО ФАЙЛА}
Do begin
Read(Fs, S);
IF S.DEL <> $FF
THEN WRITE(FI, S) {ПРОПУСК ПОМЕЧЕННЫХ ЗАПИСЕЙ}
END;
Close(Fs);
ERASE(Fs); {УДАЛЕНИЕ ОСНОВНОГО ФАЙЛА}
Close(Fi);
RENAME(Fi,St) {РАБОЧИЙ НАБОР ПЕРЕИМЕНОВЫВАЕТСЯ В ОСНОВНОЙ}
END
END.