Карта памяти 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К; это означает, что по умолчанию куча будет занимать всю оставшуюся память.

Ссылочные типы.

До сих пор рассматривались только статические объекты. Это объекты, которые порождаются непосредственно перед выполнением программы, существуют в течении всего времени ее выполнения и размер которых (объем памяти необходимой для их размещения) не изменяется по ходу выполнения программы. Место в памяти машины, необходимое для хранения их значений, можно выделить еще на этапе трансляции исходного текста на язык машины.

В программе на алгоритмическом языке ссылка на программные объекты осуществляется путем указания их имен. На машинном языке ссылка на объект осуществляется путем указания его места в памяти машины (номер ячейки памяти, начиная с которой размещен этот объект). Положительной стороной использования статических объектов является то, что вся работа по размещению объектов в памяти и формированию ссылок на эти объекты выполняется на этапе трансляции.

Однако иногда мы не знаем не только размер того или иного программного объекта, но даже и того будет существовать этот объект или нет. Объекты, которые возникают в процессе выполнения программы или размер которых изменяется называют динамическими объектами. Кроме того, бывает, что какой-либо объект нужен не на все время выполнения программы, а на какую-то часть этого времени. Временные программные объекты могут занимать значительный объем памяти и одновременное существование таких объектов в ОП машины невозможно.

В Паскале для работы с динамическими объектами определен специальный тип значений – ссылочный тип. Значение этого типа – ссылка на какой либо программный объект, по которой осуществляется непосредственный доступ к этому объекту. Для описания действий над динамическими объектами каждому такому объекту в программе сопоставляется статическая переменная ссылочного типа – в терминах этих ссылочных переменных и описываются действия над динамическими объектами. Значения же переменных ссылочного типа определяются уже в процессе выполнения программы.