- •1. Двоичная система счисления.
- •2. Восьмеричная система счисления.
- •3. Шестнадцатеричная система счисления.
- •4. Сложение и вычитание в 2, 8 и 16 c/c.
- •2. Вещественные числа (числа с плавающей запятой).
- •3. Логические данные.
- •2. Зарезервированные слова.
- •X a8 alpha Massiv z52d9 eps Res_52_a ___75
- •6. Метка.
- •2. Целые типы данных.
- •4. Вещественные типы.
- •1. Раздел описания меток.
- •2. Раздел описания констант.
- •3. Раздел описания типов.
- •4. Раздел описания переменных.
- •6. Раздел операторов.
- •7. Последовательность разделов.
- •1. Формульно-словесный способ.
- •2. Блок-схемный способ.
- •Ввод - вывод одномерного массива
- •2. Ввод массива из текстового файла.
- •3. Вывод одномерного массива на экран.
- •Примеры обработки одномерных массивов
- •1. Параметр цикла должен быть ординального типа.
- •2. Параметр должен быть описан в том же блоке, где находится сам оператор цикла.
- •5. В теле цикла параметр не должен изменяться.
- •6. Начальное и конечное значения параметра цикла вычисляются только один раз, до начала цикла.
- •7. При нормальном завершении цикла значение его параметра считается неопределенным.
- •Контроль ординальных переменных
- •Вставка элемента в упорядоченный массив
- •Удаление элементов из массива
- •«Школьный» алгоритм сортировки
- •Группировка массива методом прямой выборки
- •Группировка массива методом прямого обмена
- •Var c : array[1..10,1..15,1..8] of real.
- •1. Ввод элементов матрицы с клавиатуры.
- •2. Ввод матрицы из текстового файла.
- •3. Вывод матрицы на экран.
- •Тождественные и совместимые типы
- •Обработка в процедуре одномерных массивов с различными именами типов
- •Обработка в процедуре матриц с различными именами типов
- •Var s : string[V],
- •Процедуры и функции для обработки строк
- •Определение битовой структуры поля памяти
- •Процедуры и функции для файлов любого типа
- •Var p : pointer;
- •1. Формирование стека из текстового файла.
- •7. Определение значения и местоположения максимального элемента в стеке.
- •8. Удаление из стека максимального элемента.
- •9. Добавление элемента в упорядоченный стек.
- •2. Добавление нового элемента в очередь.
- •3. Удаление элемента из очереди.
- •6. Удаление произвольного элемента из очереди.
- •7. Добавление нового элемента в произвольное место очереди.
- •1. Формирование дека.
- •Var sin : integer;
- •Процедура заполнения FillChar
- •Процедура перемещения данных move
- •Управление экраном в текстовом режиме
- •Сохранение и восстановление экрана
- •Interface
- •Implementation
- •Процедуры управления текстовым режимом экрана
- •Intr(n:byte; Var Reg:Registers),
- •If KeyPressed then
- •Автоматическая оптимизация программ
- •1. Свертывание констант.
- •2. Слияние констант.
- •3. Вычисление по короткой схеме.
- •4. Удаление неиспользуемого кода.
- •If false then
- •5. Эффективная компоновка.
- •Оверлейная структура программы
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Использование сопроцессора
Сохранение и восстановление экрана
При формировании на экране сменяющих друг друга окон, при выборе режима работы программы с помощью экранного меню и других ситуациях требуется предварительно запоминать состояние экрана, а затем его восстанавливать. Эта процедура сводится к копированию видеопамяти в оперативную память и обратно.
В примерах, которые будут в дальнейшем иллюстрировать работу с экраном, используются различные переменные, связанные с видеопамятью. Чтобы не повторять описание переменных, будем считать, что это описание содержится в модуле DesUnit, а в обрабатывающей программе задано предложение Uses DesUnit.
Текст модуля DesUnit:
UNIT DesUnit;
{ Модуль содержит глобальные описания типов и переменных }
Interface
Type
ScreenColRange = 1..80; { тип номера столбца экрана }
ScreenRowRange = 1..25; { тип номера строки экрана }
ScreenChar = record { элемент видеопамяти }
Symbol : char; { символ }
Attrib : byte; { атрибут }
end;
ScreenRowArray = array[ScreenColRange] of ScreenChar;
{ тип строки экрана }
ScreenArray = array[ScreenRowRange] of ScreenRowArray;
{ тип видеопамяти }
ScreenPointer = ^ScreenArray;
Var Screen : ScreenArray absolute $B800:$0000;
{ видеопамять }
RowAr : ScreenRowArray;{ строка видеопамяти }
BufAr : ScreenPointer; { указатель буферного }
{ массива для сохранения видеопамяти }
Implementation
End.
Сформируем две процедуры, пересылающие из видеопамяти в оперативную память и обратно содержимое экрана, ограниченное строками Row1 и Row2.
Procedure MoveFromScreen(Row1,Row2:byte);
Var Len : word;
Begin
New(BufAr);
Len:=(Row2-Row1+1)*80 shl 1;
Move(Screen[Row1],BufAr^,Len);
End { MoveFromScreen };
Procedure MoveToScreen(Row1,Row2:byte);
Var Len : word;
Begin
Len:=(Row2-Row1+1)*80 shl 1;
Move(BufAr^,Screen[Row1],Len);
Dispose(BufAr);
End { MoveFromScreen };
Здесь Row1, Row2 - соответственно номер первой и последней строк сохраняемой или восстанавливаемой области экрана; операция shl k (Shift Left) - сдвиг целочисленной переменной на k разрядов влево, что эквивалентно умножению ее на .
С Д В И Г Э К Р А Н А
При вертикальном сдвиге текстового экрана вверх строки 2 .. 25 переписываются в строки 1 .. 24, а в строку 25 вводятся данные из оперативной памяти. Сдвиг вниз осуществляется аналогично.
Вертикальный сдвиг экрана называют также скроллингом (scroll - рулон, свиток).
Пусть для заполнения строки экрана в программе используется переменная BufRow типа ScreenRowArray.
Вертикальный сдвиг вверх:
Procedure ScreenToUp;
Begin
Move(Screen[2],Screen[1],3840);
Screen[25]:=BufRow;
End { ScreenToUp };
Вертикальный сдвиг вниз:
Procedure ScreenToDown;
Begin
Move(Screen[1],Screen[2],3840);
Screen[1]:=BufRow;
End { ScreenToDown };
В программах иногда требуется выполнять также горизонтальный сдвиг экрана, в частности при обработке текста.
Пусть нам требуется сдвинуть экран на пять столбцов влево. В этом случае левые пять столбцов исчезнут, весь текст сдвинется влево, а самые правые пять столбцов будут очищены. Сдвиг вправо осуществляется аналогично.
Ниже приведена процедура для сдвига текстового экрана на один столбец влево.
Procedure ScreenToLeft;
Var i : byte;
Begin
For i:=1 to 25 do
Begin
Move(Screen[i,2],Screen[i,1],158); { 79 2 = 158 }
Screen[i,80].Symbol:=' ';
End;
End { ScreenToLeft };
В столбцы, очищенные при горизонтальном сдвиге, в дальнейшем можно записать какую-либо информацию из оперативной памяти.