Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
36
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

11. Динамические структуры Использование динамических массивов

Задача:

Десять раз генерировать ряд случайных чисел от 0 до 99.

Каждый ряд также должен иметь произвольную длину.

В каждом ряде следует найти максимальное число.

Сохранить только максимальные числа и вывести их на экран.

Описание переменных:

arrmax – обычный массив, где будут сохраняться максимальные значения рядов;

row – динамический массив для текущего ряда чисел;

n – длина текущего ряда чисел.

Алгоритм решения задачи:

Переменной j будет играть роль индекса элементов массива arrmax. В конце цикла for, который сделает 10 итераций, j будет увеличиваться на единицу, что будет означать переход к следующей ячейке массива.

Длина очередного ряда чисел случайна. Получив значение n, выделяем память под динамический массив с помощью процедуры getmem.

Заполняем динамический массив случайными числами.

Записываем в очередную ячейку массива arrmax первое значение динамического массива. Если какое-либо последующее значение массива, на который указывает row, будет больше arrmax[j], то производится перезапись значения.

После нахождения максимума память можно освободить (freemem).

Программа на языке Паскаль:

type

arrdinamic = array[1..50] of integer;

var

arrmax: array[1..10] of integer;

row: ^arrdinamic;

n, i, j, k: integer;

begin

randomize;

j := 1;

for i := 1 to 10 do begin

n := random(50) + 1;

getmem(row,n*sizeof(integer));

for k := 1 to n do

row^[k] := random(100);

arrmax[j] := row^[1];

for k := 1 to n do

if row^[k] > arrmax[j] then

arrmax[j] := row^[k];

freemem(row,n*sizeof(integer));

j := j + 1

end;

for i := 1 to 10 do

write(arrmax[i], ' ');

readln

end.

Процедуры для работы с динамической структурой спискового типа

Задача:

Создать процедуры для добавления элемента в заданную позицию списка (add), удаления элемента из списка по его номеру (delitem), вывода содержимого списка на экран (writestack).

Описание переменных:

head – указатель на начало списка;

p – указатель на обрабатываемую область памяти;

pl -

Программа на языке Паскаль:

type

pitem = ^item;

item = record

data: integer;

next: pitem;

end;

var

head, p, p1: pitem;

n, k, l: integer;

procedure add(x,i:integer);

var j: integer;

begin

if (i > 0) and (i <= n+1) then begin

new(p);

p^.data := x;

if i = 1 then begin

p^.next := head;

head := p

end

else begin

p1 := head;

for j := 2 to i-1 do

p1 := p1^.next;

p^.next := p1^.next;

p1^.next := p;

end;

n := n + 1;

end;

end;

procedure delitem(i:integer);

var k: integer;

begin

if (i>=1) and (i<=n) and (head<>nil) then

if i = 1 then begin

p := head^.next;

dispose(head);

head := p;

end

else begin

p := head;

for k := 2 to i-1 do

p := p^.next;

p1 := p^.next;

p^.next := p1^.next;

dispose(p1);

end;

end;

procedure writelist;

begin

p1 := head;

writeln('Содержимое списка. ');

while p1 <> nil do begin

write(p1^.data,' ');

p1 := p1^.next;

end;

writeln;

end;

begin

n := 0;

head := nil;

for k := 1 to 10 do add(k,k);

writelist;

write('Введите значение добавляемого элемента: ');

readln(k);

write('Введите позицию добавляемого элемента: ');

readln(l);

add(k,l);

writelist;

write('Введите номер удаляемого элемента: ');

readln(k);

delitem(k);

writelist;

readln

end.