Карта памяти Turbo Pascal.
Вариант №4 (5 баллов)
Сформировать список L, включив в него по одному разу элементы, которые входят хотя бы в один из списков L1 и L2.
Вариант №5 (6 баллов)
Дана непустая последовательность непустых слов из букв; между соседними словами – запятая, за последним словом точка. Напечатать все слова максимальной длины. (Выбрать для представления данных подходящую списковую структуру).
Вариант №6 (5 баллов)
Сформировать список L, включив в него по одному разу элементы, которые входят одновременно в оба списка L1 и L2.
Вариант №7 (5 баллов)
Дано целое n>1, за которым следует n вещественных чисел. Напечатать эти числа в порядке их неубывания (Выбрать для представления данных подходящую списковую структуру).
Вариант №8 (5 баллов)
Сформировать список L, включив в него по одному разу элементы, которые входят в список L1, но не входят в список L2.
Вариант №9 (5 баллов)
Дано целое n>1, за которым следует n вещественных чисел. Напечатать порядковые номера тех чисел последовательности, которые имеют наименьшую величину (Выбрать для представления данных подходящую списковую структуру).
Вариант №10 (5 баллов)
Сформировать список L, включив в него по одному разу элементы, которые входят в один из списков L1 и L2, но в тоже время не входят в другой.
Вариант №11 (5 баллов)
Расположить элементы списка L в обратном порядке.
Вариант №12 (5 баллов)
Добавить в конец списка L1 все элементы списка L2
Вариант №13 (5 баллов)
Объединить два упорядоченных по неубыванию списка L1 и L2 в один упорядоченный по неубыванию список.
Вариант №14 (5 баллов)
Дано целое n>1, за которым следует n вещественных чисел. Напечатать порядковые номера тех чисел последовательности, которые имеют наибольшую величину (Выбрать для представления данных подходящую списковую структуру).
Вариант №15 (5 баллов)
Вставить в список L новый элемент E1 перед первым вхождением элемента E, если E входит в L.
Вариант №16 (5 баллов)
Вставить в непустой список L пару новых элементов E1 и E2 перед его последним элементом.
Вариант №17 (5 баллов)
Вставить в непустой список L, элементы которого упорядочены по неубыванию, новый элемент E так, чтобы сохранилась упорядоченность.
Вариант №18 (5 баллов)
Проверить, есть ли в списке L хотя бы два одинаковых элемента.
Вариант №19 (5 баллов)
Проверить, входит ли список L1 в список L2.
Вариант №20 (5 баллов)
Дано целое n>1, за которым следует n вещественных чисел. Напечатать эти числа в порядке их невозрастания (Выбрать для представления данных подходящую списковую структуру).
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ ЛАБОРАТОРНОЙ РАБОТЫ №4.
«Динамические переменные»
Карта памяти Turbo Pascal.
Префикс сегмента программы (Program Segment Prefix - PSP) - это 256-ти байтовая область, создаваемая DOS при загрузке программы. Адрес сегмента PSP хранится в переменной PrefixSeg. Каждый модуль (и главная программа и каждый модуль) имеет свой кодовый сегмент. Главная программа занимает первый кодовый сегмент; кодовые сегменты, которые следуют за ним, занимают модули (в порядке, обратном тому, как они следовали в операторе uses), и последний кодовый сегмент занимает библиотека времени выполнения (модуль System). Размер одного кодового сегмента не может превышать 64К, но общий размер кода ограничен только имеющейся памятью.
Рис. 16.1. Распределение памяти в Turbo Pascal.
HeapEnd -->-----------------------------
¦ ¦
¦ свободная память¦
¦ ¦
HeapPtr -->¦................. ..........¦
¦ куча (растет вверх) ¦
HeapOrg -->+ >- - OvrHeapEnd
¦ оверлейный буфер ¦
+------------------------+ >- - OvrHeapOrg
¦ стек (растет вниз) ¦
SSeg:SPtr -->¦.... ........................¦
¦ свободный стек ¦
SSeg:0000 -->+ ----------------------------+
¦ глобальные переменные ¦
¦ типированные константы ¦
DSeg:0000 ->+--------------------- -------+
¦ кодовый сегмент ¦¦
¦ модуля System ¦ ¦
¦........ ....................¦ ¦
¦ кодовый семент ¦ ¦
¦ первого модуля ¦ ¦. кодовый сегмент содержат образ других модулей .EXE файла
¦ кодовый сегмент ¦ ¦
¦ последнего модуля ¦ ¦
+------------------------- -- -+ ¦
¦ кодовый сегмент ¦ ¦
¦ главной программы ¦ ¦
¦ префикс сегмента программы ¦
Нижняя граница памяти DOS
Сегмент данных (адресуемый через DS) содержит все глобальные переменные и затем все типированные константы. Регистр DS никогда не изменяется во время выполнения программы. Размер сегмента данных не может превышать 64К.
При запуске программы регистр сегмента стека (SS) и указатель стека (SP) устанавливаются так, что SS:SP указывает на первый байт после сегмента стека. Регистр SS никогда не изменяется во время выполнения программы, а SP может передвигаться вниз пока не достигнет конца сегмента. Размер стекового сегмента не может превышать 64К; размер по умолчанию - 16К, он может быть изменен директивой компилятора $M.
Буфер оверлеев используется стандартным модулем Overlay для хранения оверлейного кода. Размер оверлейного буфера по умолчанию соответствует размеру наибольшего оверлея в программе; если в программе нет оверлеев, размер буфера оверлеев равен 0. Размер буфера оверлеев может быть увеличен с помощью вызова программы OvrSetBuf модуля Overlay; в этом случае размер кучи соответственно уменьшается, смещением вверх HeapOrg.
Куча хранит динамические переменные, то есть переменные, распределенные через вызов стандартных процедур New и GetMem. Куча занимает всю или часть свободной памяти, оставшейся после загрузки программы. Фактически размер кучи зависит от минимального и максимального значений кучи, которые могут быть установлены директивой компилятора $M. Размер кучи никогда не будет меньше минимального значения и не превысит максимального. Если в системе нет памяти равного минимальному значению, программа не будет выполняться. Минимальное значение кучи по умолчанию равно 0 байт, максимальное - 640К; это означает, что по умолчанию куча будет занимать всю оставшуюся память.
Ссылочные типы.
До сих пор рассматривались только статические объекты. Это объекты, которые порождаются непосредственно перед выполнением программы, существуют в течении всего времени ее выполнения и размер которых (объем памяти необходимой для их размещения) не изменяется по ходу выполнения программы. Место в памяти машины, необходимое для хранения их значений, можно выделить еще на этапе трансляции исходного текста на язык машины.
В программе на алгоритмическом языке ссылка на программные объекты осуществляется путем указания их имен. На машинном языке ссылка на объект осуществляется путем указания его места в памяти машины (номер ячейки памяти, начиная с которой размещен этот объект). Положительной стороной использования статических объектов является то, что вся работа по размещению объектов в памяти и формированию ссылок на эти объекты выполняется на этапе трансляции.
Однако иногда мы не знаем не только размер того или иного программного объекта, но даже и того будет существовать этот объект или нет. Объекты, которые возникают в процессе выполнения программы или размер которых изменяется называют динамическими объектами. Кроме того, бывает, что какой-либо объект нужен не на все время выполнения программы, а на какую-то часть этого времени. Временные программные объекты могут занимать значительный объем памяти и одновременное существование таких объектов в ОП машины невозможно.
В Паскале для работы с динамическими объектами определен специальный тип значений – ссылочный тип. Значение этого типа – ссылка на какой либо программный объект, по которой осуществляется непосредственный доступ к этому объекту. Для описания действий над динамическими объектами каждому такому объекту в программе сопоставляется статическая переменная ссылочного типа – в терминах этих ссылочных переменных и описываются действия над динамическими объектами. Значения же переменных ссылочного типа определяются уже в процессе выполнения программы.