Pascal abc динамический массив

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Объявление, выделение памяти

Обычно в языке Паскаль используются статические массивы вида:

var mas: array [1..10] of integer;

Границы статического массива изменить в ходе программы нельзя, так как они задаются в разделе объявлений «раз и навсегда».
Основным недостатком такого массива является то, что в случае, когда заранее не известно количество элементов массива, то приходится выделять память максимального размера, что называется «на всякий случай».

Рассмотрим работу с динамическим массивом.

Объявляется динамический массив в теле программы:

begin . var a: array of integer;

Или объявление с инициализацией:


А выделение памяти и размер такого массива задается уже по ходу программы:

var a: array of integer; var n:=readInteger; a:=new integer[n];

var a: array of integer; a:=new integer[readInteger];

var a: array of integer; var n:=readInteger; SetLength(a,n); // устанавливаем размер массива а

Ссылочная объектная модель: память выделяется служебным словом NEW

var a := new integer[5];

Организация памяти для массива a

Инициализация, присваивание и вывод

Возможна инициализация динамического массива при описании:

var a: array of integer := (1,2,3);

Новые способы заполнения массива (заполнители):

var a:=Arr(1,2,3);// по правой части — integer

var a:=ArrFill(5,2); // 2 2 2 2 2

Ввод с клавиатуры:

var a:=ReadArrInteger(5); var a:=ReadArrReal(5);

Заполнение случайными числами:

var a:=new integer[10]; a:=arrRandomInteger(10);

Или с разделителем между элементами:

Переприсваивание:

var a: array of integer := (1,2,3); var b:=a; // [1,2,3]


Но!
Если теперь переприсвоить значение элементов массива b , то изменится и массив a :

var a: array of integer := (1,2,3); var b:=a; b[2]:=1; print(a); //[1,2,1]

Для того, чтобы избежать данной ситуации, необходимо создать массив b , как копию массива a :

var a: array of integer := (1,2,3); var b:=Copy(a); b[2]:=1; print(a); //[1,2,3]

Очистка динамического массива

Если в программе случайно создается повторно один и тот же массив:

var a: array of integer; a:=new integer[4]; . a:=new integer[5];


В результате возникают так называемые участки «утекшей» памяти (неиспользуемой).
Постепенно произойдет переполнение памяти. В платформе .net используется автоматический сборщик мусора.

Но можно очистить память и принудительно:

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

Работа с элементами массива

  1. Цикл for

for var i:=0 to High(a) do print(a[i]);;

foreach var x in a do print(x);

High(массив) — возвращает верхнюю границу динамического массива

Примеры работы с динамическими массивами

function IndexOf(a:array of integer;x:integer):integer; begin result:=-1; for var i:=0 to High(a) do if a[i]=x then begin result:=i; break end end; begin var a:=Arr(1,2,3,4,5); print(IndexOf(a,5)) end.

А теперь, выполним с использованием обобщенной функции:

function IndexOf (a:array of T;x:T):integer; begin . end; begin var a:=Arr(1,2,3,4,5); print(IndexOf(a,5)) end.

При вызове обобщенной функции компиляция будет в два этапа:

  1. Автовыведение типа Т, сравнение с реальными цифрами, и т.к. числа целые, то Т определится как integer.
  2. Берется тело функции и заменяется Т на integer (инстанцирование функции с конкретным типом)

Читайте также:  Как убрать линию в экселе в таблице

Методы для работы с массивами

var a:=Arr(1,2,3,4,5); reverse(a); // [5,4,3,2,1]

var a:=Arr(2,3,1,4,5); //[1,2,3,4,5] sort(a);

Следующие методы не меняют сам массив:
a.Min
a.Max
a.Sum
a.Average — среднее арифметическое

Сдвиги

var a:=Arr(1,2,3,4,5,6); var x:=a[0]; for var i:=0 to 4 do a[i]:=a[i+1]; a[5]:=x; print(a)

Если сдвиг вправо:

  1. либо задействовать еще один массив ( (n-k) — по времени)
  2. либо много раз запускать один и тот же алгоритм ( (1) — по памяти)

Срезы

  • Срезы доступны только на чтение, присваивать им значения нельзя.
  • Тип среза такой же, как у массива.
  • Срезы работают с массивами, строками и со списками.

var a:=Arr(1,2,3,4,5,6); print(a[1:5]) // [2,3,4,5]

a[1:5] — 1-й элемент включая, 5-й не включая

println(a[:5]); // [1,2,3,4,5] — с начала до 5-го не включая println(a[1:]); // [2,3,4,5,6] — до конца println(a[::2]); // [1,3,5] — третий параметр — это шаг

a[::-1] — получим 6 5 4 3 2 1


Т.о. выполнение при помощи срезов выглядит так:
Перестановка:

var a:=Arr(1,2,3,4,5,6); var k:=a.Length-1; // 6 — 1 a:=a[k:]+a[:k]; print(a) // [6,1,2,3,4,5]

Т.е. создан еще массив уже со сдвигом.

Время работы алгоритма n+n , (n)

Удаление и вставка элементов массива. Списки

Для расширения массива путем вставки какого-либо элемента, необходимо предусмотреть место в памяти. По этой причине для данных случаев проще использовать списки:
Списки — List — это тоже динамический массив, который может «расширяться» и «сужаться» по ходу программы (вставка и удаление элементов).

Решение задач

Простые задачи

function SumArray(var a: array of integer): integer:=a.Sum; begin var a:=new integer[10]; a:=arrRandomInteger(10); foreach var x in a do print(x); println(‘длина массива = ‘,a.Length,’ сумма = ‘,ArraySum(a)) end.

procedure PrintArr( a: array of integer; delim:string:=’; ‘); begin foreach var . in . do print(x,delim); end; begin var a:=new integer[10]; a:=arrRandomInteger(10); . end.

  1. Функция MakeOddArrFunc с одним параметром N , возвращающая массив.
  2. Процедура MakeOddArrProc с двумя параметрами: входным — массив a и выходным параметром — массивом положительный нечетных чисел

function MakeOddArrFunc (a: array of integer; n:integer):array of integer; begin var b:= new integer[n]; var j:=0; for var i:=0 to . do if . then begin . ;. ;end; SetLength(. ); result:=b; end; procedure MakeOddArrProc (a: array of integer;var b: array of integer; n:integer); begin b:= new integer[n]; var j:=0; for var i:=0 to . do if . then begin . ;. ;end; SetLength(. ); end; begin var a:=arrRandomInteger(20); var b: array of integer; var n:=readInteger(‘введите N’); println(‘исходный массив ‘,a); println(‘результат работы с функцией ‘,MakeOddArrFunc(a,n)); MakeOddArrProc(a,b,n); print(‘результат работы с процедурой ‘,b) end.

function MakeFibArr (n : integer):array of integer; begin var c:= new integer[n]; c[0]:=. ;c[1]:=. ; for var i:=2 to n-1 do . ; result:=c; end; begin var n:= readinteger; . ; end.

function MakeRandomRealArr (n : integer;a,b:real):array of real; begin var c:= ArrRandomReal(n,a,b); result:=c; end; begin var n:= readinteger; var a:=readReal; var b:=readReal; println(‘результат работы с функцией ‘,MakeRandomRealArr(n,a,b)); end.

Читайте также:  Как прозвонить видеокарту мультиметром

procedure SetToZeroOddIndexes(a: array of integer); begin var j:=0; while j FirstLocMin ).
Пояснение: локальным минимумом считается тот элемент, который меньше каждого из своих соседей. Считать, что локальный минимум в массиве есть. Первый и последний элемент в качестве локальных минимумов не рассматривать.

Задачи на срезы

Условный оператор не использовать.

var n:=ReadInteger; var a:=ReadArrReal(n); var k:=ReadInteger; a[k-1 : : k].Print;

Условный оператор не использовать.

Условный оператор не использовать.

Условный оператор не использовать

var n:=ReadInteger; var a:=ReadArrReal(n); var srez:=a[1::2]+a[::2]; Print(srez);

Условный оператор не использовать

var n:=ReadInteger; var a:=ReadArrReal(n); var k:=ReadInteger; var l:=ReadInteger; var srez:=a[k-1:l].Average; print(srez);

var n:=ReadInteger; var a:=ReadArrReal(n); print(a[1::2].min);

BEGIN

Динамические структуры данных. Динамические массивы (одномерные и двумерные), работа с ними

Основным отличием динамических массивов от статических является возможность изменения их размерности в ходе выполнения программы.

Можно отметить следующие достоинства динамической памяти:

1) Экономичность и эффективность ее использования;

2) возможность динамического изменения числа элементов в связанных структурах, например в списках;

3) статические переменные существуют только в течение жизни блока, в котором они объявлены, а динамические – и после выхода из блока до окончания программы.

4) Переменная, размещаемая динамически, не объявляется в разделе VAR и не имеет имени в программе. компилятор не планирует выделение места в памяти под такие переменные.

В Delphi:

Динамический массив это массив, память для которого выделяется динамически. Размерность динамического мас­сива на момент компиляции не известна. Для объявления такого мас­сива применяется обычное описание, но без указания размерности. Основным отличием динамических массивов от статических является возможность изменения их размерности в ходе выполнения программы.

Динамические массивы— это тип данных с управля­емым временем жизни, поэтому можно не думать о своевременном освобождении выделенной им памя­ти — она будет освобождена автоматически, когда дан­ная переменная покинет область видимости.

Описание динамического массива:

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

Пример динамического массива:

TYPE CODES = ARRAY OF INTEGER;

VAR A:CODES;

SETLENGTH (A,30);

A[0]:= ‘POOH LIKES HUNNY’

END;

Необходимо учитывать, что динамический массив индексируется значениями, отсчет которых начинается с 0. Чтобы обратиться к первому элементу массива, необходимо использовать индекс 0, а к последнему – 29.

При необходимости память, выделенную под массив, можно осво­бодить самостоятельно (например, если массив ис­пользовал слишком большое ее количество). Для этого достаточно просто присвоить массиву значение nil. Например: A:= nil;

Пример многомерного динамического массива:

Type Codes = array of array of array of integer;

Массив А имеет 10 элементов, каждый массив A[i] имеет 20 элементов, а массивы A[i][j] – 30 элементов

Читайте также:  Как разобрать кофемолку скарлетт

Обращение к участку динамической памяти в программе осуществляется с помощью специальной ссылочной переменной, которая называется указателем (ссылкой). Переменная типа «указатель» содержит адрес размещения участка динамической памяти, с которой связан этот указатель. Компилятор отводит под переменную типа «указатель» 4 байта статической памяти.

Описание типа указатель:

P=^Word; P – идентификатор типа «указатель» на данные типа WORD.

Динамическая память может быть выделена двумя способами:

New (p), где Р – переменная типа «типизированный указатель»

Getmem (P, size), где Р – переменная типа «указатель» требуемого типа, а size – целочисленное выражение размера запрашиваемой памяти в байтах. Эта процедура создает новую динамическую переменную требуемого размера и свойства, а также помещает адрес этой созданной переменной в переменную Р типа «указатель». Доступ к значению созданной переменной можно получить с помощью P^.

При работе с массивами практически всегда возникает задача настройки программы на фактическое количество элементов массива. В зависимости от применяемых средств решение этой задачи бывает различным.

Первый вариант — использование констант для задания размерности массива. Такой способ требует перекомпиляции программы при каждом изменении числа обрабатываемых элементов.

PROGRAM FIRST;

Дата добавления: 2015-04-24 ; Просмотров: 3278 ; Нарушение авторских прав?

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Динамические массивы введены в Pascal, начиная с Delphi 4. Основное отличие от статических массивов в том, что в динамических массивах заранее не объявляется количество элементов. Объявление динамического массива содержит его имя и тип элементов – один из базовых типов.

Пример: var A: array of integer;

При объявлении динамического массива место под него не отводится. При использовании такого массива, следует задать его размер процедурой SetLength.

Пример: SetLength(А,15);

Индексы массива всегда целые, начинающиеся с 0. В примере массив содержит элементы от А[0] до А[14].

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

Programm massiv;

Var A: array of integer;

N, i: Integer;

Begin

N:=5;

SetLength (A,N); //массивА(0,0,0,0,0)

For i:=0 to N do A[i]:=i+1; //массивА(1,2,3,4,5)

N:=8;

SetLength (A,N); //массивА(1,2,3,4,5,0,0,0)

End.

Усечь массив можно при помощи функции Copy: A:=Copy(A,0,4); — произойдет усечение массива А, оставляя неизменными первые четыре элемента.

Переменная динамического массива является указателем на начало массива. Если массив еще не объявлен, то переменная равна nil. Удалить динамический массив можно несколькими способами: функция Finalize или установить нулевую длину.

Присваивание вида B:=A массивов возможно, когда var A,B:array of integer; и A>=В или A=nil.

. set length пример паскаль динамические массивы паскаль динамический массив pascal динамический массив pascal динамические массивы турбо паскаль

9726552