Динамическая память

1. Какие виды внешней памяти для персонального компьютера Вы знаете?

2. Какие виды внутренней памяти персонального компьютера Вы знаете?

3. Как распределяется оперативная память при работе программы на Паскале?

4. Каковы размеры статической памяти, выделяемой для хранения данных любой программы на Паскале? В чем ее статичность?

5. Как Вы понимаете термин «динамическая память»? Каковы ее размеры?

6. Что представляет собой адрес ячейки в оперативной памяти?

7. Как образуется абсолютный адрес?

8. Что такое указатель? Какие типы указателей Вы знаете?

9. Как описываются указатели в программе?

10. Какие операции можно производить с указателями?

11. Какой оператор служит для выделения места в динамической памяти? Что происходит при его выполнении?

12. Какой оператор служит для освобождения места в динамической памяти? Что происходит при его выполнении?

13. Какие действия и в каком порядке надо произвести, чтобы использовать переменную в динамической памяти?

14. Объясните назначение процедур NEW(X) и DISPOSE(X).

15. Переменные X и Y типа "Указатель". Что произойдет в результате выполнения следующих операций: X := Y ? X^ := Y^ ?

16. Укажите синтаксические и смысловые ошибки в следующих фрагментах:

(1) Var pp:pointer; a,b^:real; k,l:^integer; Begin new(a); new(k); b:=a; pp^:=b; read(a^); l:=k; b^:=a^; pp^:=a^; a^:=a^+1; (2) Var pp:^pointer; a,b^:real; k,l:^integer; Begin new(pp);a^:=b^; new(k);new(a);l:=k; b:=pp; read(a); ^b:=^a;
(3) Var a:^array[1..1000] of real; i,k:^integer; a,b:^real; begin new(a); new(b); new(i); For i^:=1 to 1000 do read(a[i]^); b:=a[13]; (4) Var a:array[1..1000] of ^real; i,k:^integer; B:real; begin for i:=1 to1000 do read(a[i]^); read(b); a[13]:=b;

17. Найдите смысловые ошибки в следующих фрагментах программ и укажите, как будет реагировать машина на данную ошибку:

(1) фрагмент программы создания списка из массива

begin

for i:=1 to n do begin

new(x); x^.f:=A[i]; x:=x^.next end; x^.next:=nil end;

(2) фрагмент программы создания массива из списка

i:=1;

while x<>nil do begin

A[i]:=x^.f; x:=x^.next; i:=i+1 end; n:=i;

(3) добавление элемента после k-го элемента списка

begin i:=1;

while i<k do begin i:=i+1; x:=x^.next end;

new(y); y^.f:=z; x^.next:=y; y^.next:=x^.next end;

(4) меняет местами второй и третий элементы списка

x:=first;

x^.next:=x^.next^.next; x^.next^.next:=x^.next;

(5) создает из массива двунаправленный список

Program spisok;

tipe tip=…;

p=^element;

element=record

f: tip;

next, previous: p end;

var: A: array [1..20] of tip; x, y, first, last: p;

begin {заполняем массив A}

new(x); first:=x; x^.previous:=nil; x^.f:=A[1];

for i:=2 to 20 do begin

new(y); y^.f:=A[i]; x^.next:=y; y^.previous:=x end; last:=x; x^.next:=nil end;

(6) добавление элемента z в двунаправленный список после элемента g (g не последний элемент)

begin

x:=first;

while x<>nil do

if x^.f<>g then x:=x^.next else begin

new(y); y^.f:=z; y^.next:=x^.next; y^.previous:=x; x^.next:=y;

x^.next^.previous:=y end;

(7) добавление элемента z в двунаправленный список перед элементом g (g не первый элемент)

begin

x:=first;

while x<>nil do begin x:=x^.next; if x^.f=g then begin

new(y); y^.previous:=x^.previous; x^.previous:=y; x^.previous^.next:=y; y^.next:=x end end end;

(8) удаление k-го элемента из двунаправленного списка (1<k<len(x))

x:=first; n:=0;

while x<>nil do x:=x^.next; n:=n+1;

if k=n then begin z:=x^.next; y:=x^.previous;

y^.next:=z; z^.previous:=y end;

(9) меняет местами первый и второй элементы в двунаправленном списке

begin

x:=first;

y:=x^.next; y^.next:=x; x^.previous:=y; x^.next:=x^.next^.next;

x^.next^.previous:=x;

(10) поиск элемента g в списке

function poisk (x: p; g: tip): boolean;

var a: boolean;

begin a:=false;

while x<>nil do if x^.f=g then a:=true; x:=x^.next end;

poisk:=a end.

18. Напишите фрагменты программ, которые описывают и определяют некоторые значения для:

(1) указателей на целые и вещественные числа;

(2) указателей на символьные и строковые переменные;

(3) указателя на массив целых чисел;

(4) указателя на массив строк из 10 символов;

(5) массив указателей на вещественные числа;

(6) массив указателей на массивы целых чисел;

(7) массив записей, одно поле которых является числовым, а второе – указателем на строковую переменную максимальной длины;

(8) запись, которая содержит некоторую информацию (по Вашему выбору) и поле – указатель на себе подобную запись.

19. Напишите процедуры:

(1) создания списка из массива;

(2) создания массива из списка;

(3) печати списка;

(4) добавления одного элемента в список после k-го элемента;

(5) удаления первого элемента списка;

(6) удаления n-го элемента списка;

(7) удаления последнего элемента списка;

(8) печати списка элементов в обратном порядке;

(9) меняющую местами второй и третий элементы списка;

(10) замены элемента g на h;

(11) объединения двух списков в один.

20. Напишите функции:

(1) подсчета количества элементов в списке;

(2) для нахождения наибольшего из чисел, на которые ссылаются элементы массива X;

(3) поиска элемента g в списке (результат типа boolean);

(4) поиска элемента g в списке (результатом будет указатель на найденный элемент).

21. Перепишите с использованием рекурсии:

(1) процедуру печати списка;

(2) функцию подсчета количества элементов в списке.

(3) Напишите программу, которая из массива создает двунаправленный список.

(4) Напишите программу печати двунаправленного списка в обратном порядке.

22. Напишите процедуры:

(1)добавления элемента z в двунаправленный список после элемента g;

(2)добавления элемента z в двунаправленный список перед элементом g;

(3)удаления элемента g из двунаправленного списка;

(4)меняющую местами в двунаправленном списке элемент с указателем g и следующий за ним, если известно, что g не первый и не последний элемент.