- •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
- •Использование сопроцессора
7. Определение значения и местоположения максимального элемента в стеке.
Поиск максимального элемента в стеке производится аналогично поиску в массиве, но вместо индекса элемента массива здесь местоположение элемента определяется значением его указателя. Если стек пустой, то указатель максимального элемента должен иметь значение nil.
Program MaxElem;
Type PoinType = ^DynType;
DynType = record
Inf : integer;
Next : PoinType;
end;
Var Beg, { указатель входа в стек }
Run, { текущий указатель }
Pmax : PoinType; { указатель макс.элемента }
kmax : integer; { значение макс.элемента }
Begin
Формирование стека
Pmax:=Beg;
If Beg<>nil then
Begin
kmax:=Beg^.Inf; Run:=Beg^.Next;
While Run<>nil do { в цикле просматрива- }
Begin { ются элементы стека, }
If Run^.Inf>kmax then { начиная со второго }
Begin
kmax:=Run^.Inf; Pmax:=Run
End;
Run:=Run^.Next;
End;
End;
Печать kmax, Pmax^.Inf
End.
8. Удаление из стека максимального элемента.
В программе рассматриваются две ситуации, определяющие местоположение максимального элемента:
a) максимальный элемент - это первый элемент стека (рис.14);
б) максимальный элемент - это любой элемент стека, кроме первого (на рис.15 - это третий элемент).
Из рис.15 можно сделать вывод, что для удаления из стека заданного элемента необходимо знать адрес предшествующего элемента. Поэтому в отличие от предыдущего примера в программе дополнительно используется указатель Pred, определяющий адрес элемента, расположенного в стеке перед максимальным элементом. Если стек не пустой и Pmax=Pred, то максимальным элементом является первый элемент стека, в противном случае между ними существует следующее соотношение: Pmax = Pred^.Next.
Program DelMaxElem1;
Type PoinType = ^DynType;
DynType = record
Inf : integer;
Next : PoinType;
end;
Var Beg, { указатель входа в стек }
Run, { текущий указатель }
Pmax, { указатель макс.элемента }
Pred : PoinType; { указатель эл-та, предшествующего Pmax}
kmax : integer; { значение макс.элемента }
Begin
Формирование стека
Pmax:=Beg;
If Beg<>nil then
Begin
kmax:=Beg^.Inf;
Pred:=Beg; Run:=Beg;
While Run^.Next<>nil do
Begin
If Run^.Next^.Inf>kmax then
Begin
kmax:=Run^.Next^.Inf;
Pred:=Run; Pmax:=Run^.Next;
End;
Run:=Run^.Next;
End;
If Pmax=Pred then
Beg:=Beg^.Next
Else
Pred^.Next:=Pmax^.Next;
Dispose(Pmax);
End;
Печать стека
End.
В программе DelMaxElem1 следует обратить внимание на следующую деталь.
Указателю предшествующего элемента стека назначено имя Pred, совпадающее с именем предописанной функции, которая определяет предыдущее значение ординальной переменной. Это допускается в Паскаль-программе, поскольку имя pred считается предописанным, а не зарезервированным. Однако если нам потребуется в программе записать kmax:=pred(kmax), то при компиляции будет выдано сообщение "Error 26: Type mismatch" (несоответствие типов). Тем не менее в этой программе функцию pred все же можно использовать, но это должно быть записано в виде kmax := System.pred(kmax), где System - имя стандартного модуля, содержащего функцию pred.
Указатели Pred и Pmax жестко связаны друг с другом, а именно Pmax = Pred^.Next. Поэтому в приведенной ниже программе DelMaxElem2 вместо двух указателей Pred и Pmax используется один указатель Pmax, но он адресует здесь элемент, предшествующий максимальному. Поскольку для первого элемента стека не существует предшествующего элемента, то Pmax = Beg как в случае, когда максимальным элементом стека является первый элемент, так и в случае, когда таким является второй элемент. В связи с этим в качестве признака удаления первого элемента в программе используется логическое выражение Pmax^.Inf=Beg^.Inf (если максимальный элемент равен первому элементу стека, то удалению подлежит первый элемент).
Program DelMaxElem2;
Type PoinType = ^DynType;
DynType = record
Inf : integer;
Next : PoinType;
end;
Var Beg, { указатель входа в стек }
Run, { текущий указатель }
Pmax : PoinType; { указатель предшествующего элемента }
kmax : integer; { значение макс.элемента }
Begin
Формирование стека
If Beg<>nil then { стек не пустой }
Begin
kmax:=Beg^.Inf;
Pmax:=Beg; Run:=Beg;
While Run^.Next<>nil do
Begin
If Run^.Next^.Inf>kmax then
Begin
kmax:=Run^.Next^.Inf;
Pmax:=Run;
End;
Run:=Run^.Next;
End;
If kmax=Beg^.Inf then
Begin
Run:=Beg; Beg:=Beg^.Next
End
Else
Begin
Run:=Pmax^.Next; Pmax^.Next:=Pmax^.Next^.Next;
End;
Dispose(Run);
End;
Печать стека
End.