
- •Часть 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 Ошибки стадии выполнения
- •Ошибки ввода-вывода
- •Фатальные ошибки
- •Библиографический список
Изменение структуры основного файла
Часто программист сталкивается с задачей, когда требуется изменить структуру основного файла, то есть изменить тип или размер одного или нескольких полей, добавить новое поле или несколько полей, но старая информация в файле должна сохранится. Иногда требуется удалить поле записи и всю хранящуюся в нем информацию.
Пример 7. Требуется, во-первых, сохранив всю хранимую информацию, изменить в файле STUDENTS.DAT поле FIO: STRING[20], сократив его размер на 5 байт, то есть на FIO: STRING[15]. Во-вторых, добавить два новых поля: DEL: BYTE и DATE: STRING[8].
Алгоритм функционирования программы следующий:
Присвоить основному файлу имя (процедура Assign);
Открыть уже существующий на диске файл (процедура Reset);
Присвоить рабочему файлу имя (процедура Assign);
Создать рабочий файл TEMP на диске A: (процедура Rewrite);
Читать основной файл запись за записью. Каждую запись копировать в соответствующую компоненту рабочего файла. Новые поля DEL и DATE заполнять величинами - $0 и пробел, соответственно. Сформированную таким образом запись писать в файл TEMP.
Закрыть основной файл (процедура Close);
Удалить основной файл (процедура Erase);
Закрыть рабочий файл TEMP (процедура Close);
Рабочему файлу присвоить имя основного файла (процедура Rename).
Ниже приведен код программы.
PROGRAM PR7;
TYPE OLD = RECORD
TAB : LONGINT;
FIO : STRING[20];
DATA : STRING[8];
GRUP : STRING[7];
STEPA: REAL
END;
NEW = RECORD
TAB: LONGINT;
FIO : STRING[15]; {МЕНЯЕМ РАЗМЕР ПОЛЯ}
DATA : STRING[8];
GRUP : STRING[7];
STEPA: REAL;
DEL: BYTE; {ДОБАВЛЯЕМ НОВЫЕ ПОЛЯ DEL И DATE}
DATE: STRING[8]
END;
VAR S:OLD; N:NEW; ST:STRING;
FS:FILE OF OLD; FI:FILE OF NEW;
BEGIN
WRITELN('ВВЕДИТЕ ИМЯ ОСНОВНОГО ФАЙЛА: '); READLN(ST);
ASSIGN (FS,ST); RESET(FS);
ASSIGN (FI,'A:\TEMP'); REWRITE(FI); {СОЗДАНИЕ РАБОЧЕГО НАБОРА}
WHILE NOT EOF(FS) {ПРОСМОТР ОСНОВНОГО ФАЙЛА}
DO BEGIN
READ(FS, S);
N.TAB := S.TAB; N.FIO := S.FIO; {КОПИРОВАНИЕ ИНФОРМАЦИИ}
N.DATA := S.DATA; N.GRUP := S.GRUP; N.STEPA := S.STEPA;
N.DEL := $0; N.DATE := ' ';
WRITE(FI, N);
END;
CLOSE(FS);
ERASE(FS); {УДАЛЕНИЕ ОСНОВНОГО ФАЙЛА}
CLOSE(FI);
RENAME(FI, ST); {ПЕРЕИМЕНОВАНИЕ РАБОЧЕГО НАБОРА В ОСНОВНОЙ ФАЙЛ}
END.
Использование клавиш для управления программой
Работа с файлом предусматривает ряд альтернативных процессов (действий). Инициировать эти процессы можно с помощью активных клавиш. Например, для удаления записи можно использовать клавишу Del , для перемещения к предыдущей записи – стрелка вверх, для перемещения к первой записи - Home , для выхода из программы – клавишу Esc .
Работа с клавишами, в том числе и управляющими Shift , Ctrl , Alt - осуществляется с помощью функции ReadKey. При этом считываемый символ не отображается на экране. Если перед вызовом ReadKey функция KeyPressed имеет значение True, то символ считывается немедленно. В противном случае, функция ожидает нажатия клавиши. Специальные клавиши на PC клавиатуре генерируют расширенные коды сканирования. (Расширенные коды сканирования приведены в табл. 5). К специальным клавишам относятся функциональные клавиши, клавиши управления курсором, клавиши Alt и т.п.
При нажатии специальной клавиши ReadKey сначала возвращает нулевой символ (#0), а затем возвращает расширенный код сканирования. Нулевые символы не могут быть получены никаким другим путем, что гарантирует то, что следующим символом будет расширенный код сканирования.
Пример 8. Разработать программу, которая с помощью функции READKEY отображает на экране ASC II код, нажатой клавиши, а для служебных клавиш или их комбинаций с другими клавишами второй (расширенный) код.
PROGRAM PR8;
USES CRT;
Var CH, CH1:CHAR;
Begin
Writeln('Нажимайте клавиши, или их комбинации и смотрите коды');
Writeln('Клавиша ESC - конец');
While TRUE {БЕСКОНЕЧНЫЙ ЦИКЛ}
Do begin
CH := READKEY; {ОЖИДАНИЕ НАЖАТИЯ КЛАВИШИ}
IF ORD(CH) = 0
THEN BEGIN CH1:=READKEY; {КЛАВИШИ ВТОРОЙ ГРУППЫ}
WRITELN('КОД КЛАВИШИ -> 0, РАСШИРЕНИЕ -> ', ORD(CH1))
END
ELSE BEGIN {КЛАВИШИ ПЕРВОЙ ГРУППЫ}
WRITELN('КОД КЛАВИШИ - ', ORD(CH));
IF ORD(CH) = 27
THEN BREAK {ВЫХОД ИЗ ЦИКЛА WHILE ПО КЛАВИШЕ Esc}
END
END {WHILE}
END.
В программе PR8 активной является только клавиша Esc, потому, что только ее код обрабатывается программным путем и влияет на ход вычислительного процесса. Остальные клавиши пассивно фиксируются (после нажатия их коды высвечиваются на экране монитора). С помощью программы PR8 можно получить табл. 3.3.
Таблица 3.3.
Возвращаемые коды |
Клавиши |
|
Первый |
Второй |
|
13 |
- |
Enter |
27 |
- |
Esc |
32 |
- |
Пробел |
0 |
3 |
Ctrl + C (Null – нулевой символ) |
0 |
15 |
Shift + Tab |
0 |
16 - 25 |
Alt + Q/W/E/R/T/Y/0/I/O/P |
0 |
30 - 38 |
Alt + A/S/D/F/e/H/J/K/L |
0 |
44 - 50 |
Alt + Z/X/C/У/В/М/М |
0 |
59 - 68 |
Ключи F1 – F10 |
0 |
71 |
Home (начало) |
0 |
72 |
Стрелка вверх |
0 |
73 |
PgUp (страница в верх) |
0 |
75 |
Стрелка влево |
0 |
77 |
Стрелка вправо |
0 |
79 |
End (конец) |
0 |
80 |
Стрелка вниз |
0 |
81 |
PgDn (страница в низ) |
0 |
82 |
Ins (вставка) |
0 |
83 |
Del (удалить) |
0 |
84 - 93 |
Shift + F1 / … / Shift + F10 |
0 |
94 - 103 |
Ctrl + F1 / … / Ctrl + F10 |
0 |
104 - 113 |
Alt + F1 / … / Alt + F10 |
0 |
114 |
Ctrl + PrtScr (копия с экрана) |
0 |
115 |
Ctrl + Стрелка влево |
0 |
116 |
Ctrl + Стрелка вправо |
0 |
117 |
Ctrl + End (конец) |
0 |
118 |
Ctrl + PgDn (страница в низ) |
0 |
119 |
Ctrl + Home (начало) |
0 |
120 - 131 |
Alt + 1/2/3/4/5/6/7/8/9/0/-/= |
0 |
132 |
Ctrl + PgUp (страница в верх) |