- •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
- •Использование сопроцессора
1. Формирование стека из текстового файла.
Assign(F,'F.dat'); Reset(F);
Beg:=nil;
While not SeekEof(F) do
Begin
Read(F,k); New(Run);
Run^.Inf:=k;
Run^.Next:=Beg;
Beg:=Run;
End;
Close(F);
Здесь, в отличие от рассматриваемой далее очереди, не имеет значения номер элемента, прочитанного из файла (первый или не первый). Если исходный файл пустой, то стек также будет пустой, о чем свидетельствует значение Beg=nil.
2. Добавление нового элемента в стек.
Read(k); New(Run);
Run^.Inf:=k;
Run^.Next:=Beg;
Beg:=Run;
Фактически это однократное повторение работы предыдущего цикла.
3. Удаление элемента из стека.
Run:=Beg; Beg:=Beg^.Next;
Dispose(Run);
В указателе Run временно запоминается адрес удаляемого в дальнейшем элемента стека.
4. Просмотр элементов стека.
Run:=Beg; k:=0;
While Run<>nil do
Begin
Inc(k);
Writeln('k= ',k,' Inf= ',Run^.Inf);
Run:=Run^.Next;
End;
5. Удаление стека.
While Beg<>nil do
Begin
Run:=Beg; Beg:=Beg^.Next;
Dispose(Run);
End;
6. Реверсирование стека.
При формировании стека из текстового файла информационные элементы стека будут расположены в обратном порядке по сравнению с их расположением в файле. Это может создавать определенные неудобства при обработке стека в программе. В связи с этим возникает задача реверсирования элементов стека.
По отношению к обычному массиву задача реверсирования стека аналогична перестановке элементов массива в обратном порядке. Существенная разница между ними заключается в том, что положение информационных элементов стека в памяти не должно изменяться, изменению подвергаются лишь связи между элементами, т.е. значения указателей.
Выполним два варианта реверсирования стека.
Вариант 1 :
Var BegBuf,RunBuf : PoinType;
Begin
BegBuf:=nil; Run:=Beg;
If (Run<>nil) and (Run^.Next<>nil) then { в стеке }
Begin { больше одного эл-та }
While Run<>nil do { перепись стека Beg }
Begin { в стек BegBuf }
k:=Run^.Inf; New(RunBuf);
RunBuf^.Inf:=k;
RunBuf^.Next:=BegBuf;
BegBuf:=RunBuf;
Run:=Run^.Next;
End;
While Beg<>nil do { удаление стека Beg }
Begin
Run:=Beg; Beg:=Beg^.Next;
Dispose(Run);
End;
Beg:=BegBuf; BegBuf:=nil; { переадресация }
End; { стека }
В варианте 1 исходный стек переписывается в буферный с начальным указателем BegBuf, при этом элементы исходного стека будут расположены в обратном порядке. После этого стек Beg удаляется, указателю Beg присваивается адрес входа в новый стек BegBuf, а буферный указатель принимает пустое значение. Если исходный стек пустой или в нем находится только один элемент, реверсирование не производится.
В программе варианта 1 следует обратить внимание на следующую деталь.
Если стек пустой, т.е. Beg = nil, то указатель Beg^.Next не существует. В этом случае запись условного оператора в виде
If (Run^.Next<>nil) and (Run<>nil) then
может привести к неправильной работе программы или к ее зацикливанию.
Вычисление логического выражения в Паскаль-программе производится по так называемой короткой схеме. Это означает, что вычисление выражения прекращается, как только становится очевидным его результат. В частности,
- если несколько операндов связаны между собой операцией логического умножения, то при получении значения false для одного из операндов, вычисляемых слева направо, остальные операнды не рассматриваются;
- если несколько операндов связаны между собой операцией логического сложения, то при получении значения true для одного из операндов, вычисляемых слева направо, остальные операнды не рассматриваются.
Поэтому в операторе
If (Run<>nil) and (Run^.Next<>nil) then
при обнаружении (Run <> nil) = false значение второго операнда не вычисляется.
Недостатки варианта 1 :
- в программе используется буферный стек, что требует выделения дополнительной памяти;
- при формировании буферного стека производится пересылка информационных элементов из исходного стека, что приводит к дополнительным затратам машинного времени (информационные элементы могут быть большого размера).
Вариант 2 :
Var P : PoinType;
Begin
If Beg<>nil then
Begin
Run:=Beg; Beg:=Beg^.Next;
Run^.Next:=nil;
While Beg<>nil do
Begin
P:=Beg; Beg:=Beg^.Next;
P^.Next:=Run; Run:=P;
End;
Beg:=Run;
End;
В программе варианта 2 изменяются лишь связи между элементами стека. Чтобы понять работу этой программы, рекомендуется нарисовать карандашом стек, состоящий из трех или четырех элементов, и "проиграть" на нем работу программы реверса, изменяя связи между элементами стека после выполнения каждого оператора программы.
Примечание. Если в программе заранее известно, что последовательность элементов в линейном списке должна быть такой же, как и в исходном файле, то в этом случае целесообразно вместо стека использовать очередь.