67458

Инициализация массивов

Лекция

Информатика, кибернетика и программирование

Динамические массивы не имеют фиксированного размера. Память под массив выделяется, когда ему придается значение (!) или по отношению к нему применяется процедура SetLength.

Русский

2014-09-10

123.5 KB

0 чел.

Лекция 6

Инициализация массивов

const

   A: array[1..7] of double = (1, 3, 5, 7, 9, 11, 13);

   B: array[1..2, 1..4] of integer =

   (

      (3, 4, 1, 0),

      (5, 2, 7, 6)

   );

   C: array[1..2, 1..3] of char =

   (

      (‘a’, ‘b’,  ‘c’),

      (‘x’, ’y’, ‘z’)

   );

Инициализация записей

type

 MyRecord1 = record

   i, j: integer;

   x: double;

   s: string[7];

 end;

 MyRecord2 = record

    mA: array[1..3, 1..3] of char;

    S: MyRecord1;

 end;

const

 R1: MyRecord1 = (i: 4; j: 9; x: 3.14159; s: 'ABCDE');    

 R2: MyRecord2 = ( ??? );

Открытые массивы

var

   B: array[3..7] of double;

procedure P(var A: array of double);

begin

   WriteLN('High(A)=', High(A), '  A[High(A)[=', A[High(A)]:0:2);

   WriteLN('Low(A)=', Low(A),  '  A[Low(A)[=',  A[Low(A)]:0:2);

   ReadLN;

end;

begin

   B[3] := 3; B[4] := 4; B[5] := 5; B[6] := 6; B[7] := 7;

   P(B);

end.

Динамические массивы

Динамические массивы не имеют фиксированного размера. Память под массив выделяется, когда ему придается значение (!) или по отношению к нему применяется процедура SetLength.

<Объявление динамического массива> ::=

   <Имя массива>: array of <Тип>

Переменная <Имя массива> в действительности является указателем, однако, знаком  ^,  процедурами New, Dispose  пользоваться по отношению к этой переменной нельзя.


Процедура
SetLength

procedure SetLength(var <Имя массива>; <Число элементов>: integer);

Под одномерный массив <Имя массива> выделяется место в памяти, объем которого задает <Число элементов>.

Диапазон индексов:  0 .. <Число элементов> - 1 .


Процедура
Finalize

procedure Finalize(var <Имя массива>);

Память из-под переменной <Имя массива> высвобождается.

Альтернатива:    

<Имя массива> := Nil;

Процедуру  FreeMem  применять не следует.


Пример
1.

program Project1;

{$APPTYPE CONSOLE}

uses

 SysUtils;

var

 mA: array of char;

begin

 SetLength(mA, 3);

 mA[2] := 's';

 writeln(mA[2]);

 readln;

end.

Пример 2.

var

 mA, mB: array of integer;

 mC, mD: array [0..10] of integer;

begin

 SetLength(mA, 11);

 mA[0] := 1;

 mB := mA;  // Указатель mB стал указывать туда же, куда и указатель mA.

 mB[0] := 2;

 mC[0] := 1;

 mD := mC;  // В массив mD скопировано всё содержимое массива mC.

end.

Переменная  mB  есть указатель на тот же динамический массив, что и переменная  mA.  Значение  mA[0]  есть 2.

Оператор  mB[11] := 2;  не приводит к увеличению числа элементов массива до 12. Ответственность за выход за границы массива (и за всю тяжесть последствий) лежит на программисте.


Пример
3.

var

 mA, mB: array of integer;               // Динамические массивы

 mC, mD: array[0..0] of integer;     // Статические массивы

begin

 mC[0] := 2;  mD[0] := 2;

 writeln(mC = mD);              // True. Содержимое массивов одинаково.

 SetLength(mA, 1);  SetLength(mB, 1);

 mA[0] := 2;  mB[0] := 2;

 writeln(mA = mB);              // False. Содержимое массивов одинаково,

                                              // а вот указатели на массивы НЕ равны.

 writeln(mA[0] = mB[0]);     // True. Эти элементы массивов равны.

end;


Пример
4.

var

 i, n: integer;

 mA: array of integer;

begin

 n:=7;  SetLength(mA, n);  for i:=0 to n-1 do mA[i]:=i;

 for i:=0 to n-1 do write(mA[i]:3);     // 0  1  2  3  4  5  6

 n:=4;  SetLength(mA, n);

 for i:=0 to n-1 do write(mA[i]:3);     // 0  1  2  3

// Массив «подрезан» до 4 элементов. Эти элементы сохранили свои значения.

 n:=8;  SetLength(mA, n);

 for i:=0 to n-1 do write(mA[i]:3);     // 0  1  2  3  0  0  0  0

// Массив расширен до 8 элементов.

// Но нет гарантии, что новым элементам придается значение 0.

// Эти значения, вообще говоря, непредсказуемы.

 readln;

 writeln(Length(mA));         // 8

 writeln(High(mA));            // 7

 writeln(Low(mA));             // 0

 Finalize(mA);

 writeln(Length(mA));         // 0

 writeln(High(mA));            // -1

 writeln(Low(mA));             // 0

 readln;

end.


Пример 5.
Двумерные массивы (точнее, массивы массивов)

program Project1;

{$APPTYPE CONSOLE}

uses

 SysUtils;

type

 MyRowType = array of integer;   

// MyRowType – указатель на массив элементов типа integer.

var

 i, j: integer;

 mA: array of MyRowType;

// mA – указатель на массив указателей (на массив элементов типа integer)


begin

 SetLength(mA, 3);  // Размещен в памяти массив указателей на строки матрицы.

                                 // Сами строки пока в памяти не размещены.

 for i := 0 to 2 do

   SetLength(mA[i], 4);

// Размещены в памяти строки матрицы. Длина каждой строки – 4 числа.

 for i := 0 to 2 do

   for j := 0 to 3 do

     mA[i][j] := 10 * (i + 1) + (j + 1);

// Допускается обращение mA[i, j]

 

 for i := 0 to 2 do

 begin

   for j := 0 to 3 do

     write(mA[i][j]:5);

   writeln;

 end;

 for i := 0 to 2 do

     Finalize(mA[i]);

// Память освобождена из-под строк матрицы.

// Указатели на строки пока доступны.

 writeln;

 for i := 0 to 2 do

   SetLength(mA[i], i+4);

// Размещены в памяти новые строки «матрицы». Длины строки неодинаковы.

// Таким образом, «матрица» - не совсем верное определение.

// Правильнее говорить, что mA есть «Jagged Array» (зазубренный массив).

 

 for i := 0 to 2 do

   for j := 0 to i+3 do

     mA[i][j] := 10*(i+1)+(j+1);

 for i := 0 to 2 do

 begin

   for j := 0 to i+3 do write(mA[i][j]:5);

   writeln;

 end;

 for i := 0 to 2 do Finalize(mA[i]);

// Память освобождена из-под строк матрицы.

 Finalize(mA);

// Память освобождена и из-под указателей на строки.  

 readln;

end.


Тип «Множество»

<Объявление типа «Множество»> :: =

type

 <Имя типа «Множество»> =

   Set Of  <Список (перечисление) или диапазон значений>;

<Объявление переменной типа «Множество»> :: =

var

 <Имя переменной> : Set Of  <Список (перечисление) или диапазон значений>;

//или

 <Имя переменной> : <Имя типа «Множество»>;


Операции над множествами:

+   Объединение

-    Вычитание

*   Пересечение

Проверка отношения двух множеств:

=    Равно

<>  Не равно

<=  Левое множество содержится в правом

>=  Левое множество содержит в себе правое

Проверка принадлежности элемента множеству:

in   Левый элемент принадлежит правому множеству


Пример

type

   EnglishLetterType = 'A' .. 'z';               // Все английские буквы

   EnglishLettersSetType = set of EnglishLetterType;

   SetOfDigitsType = set of 0 .. 9;           // Все десятичные цифры

   MonthesType = (June, July, August);  // Все летние месяцы   

var

   EnglishLetters: EnglishLettersSetType;

   P: SetOfDigitsType;

   A, B, C: set of 0 .. 9;

   M: MonthesType;


//  
procedure ShowElementsOfSet(Tittle: string; z: set of 0..9);

procedure ShowElementsOfSet(sTittle: string; z: SetOfDigitsType);

var

  i: integer;

begin

  Write('Set "', sTittle,'" Containes: ');

  for i := 0 to 9 do

     if i  in  z  then Write(i:2);

 writeln;

end;

begin

  if  EnglishLetters = []  then

     writeln('EnglishLetters Is Empty')

  else

     writeln('EnglishLetters Is Not Empty');

  A := [2,4,5,6,7,8];

  B := [1,3,5,7];

  C := A * B;

  if C = [] then

     writeln('c Is Empty')

  else

     writeln('c Is Not Empty');

  if  4  in  C  then

     writeln(' 4 Is in C')

 else

     writeln('4 Is Not in C');

  if 4 in B then

     writeln(' 4 Is in B')

  else

     writeln('4 Is Not in B');

  ShowElementsOfSet('A', A);

  ShowElementsOfSet('B', B);

   P := A + B;

   ShowElementsOfSet('A+B', P);

   P := A - B;

   ShowElementsOfSet('A-B', P);

   ShowElementsOfSet('A*B', A * B + [0]);

   readln;

end.


Тип
Variant

var

 V1, V2, V3, V4: Variant;

 I: Integer;  D: Double;  S: string;

begin

 V1 := 1;                          // integer value, integer type

 V2 := 1234.5678;            // real value, real type

 V3 := ‘1000’;                  // string value, string type

 V4 := V1 + V2 + V3;      // double value 2235.5678,  double type

 I := V1;

 D := V2;

 S := V3;                          // S=’1000’

 I := V4;                           // I = 2236 

end;

Delphi: Help, “Variant type conversions

VB6, VBA-MS/Office:   Тип Variant разрешен.

VBScript:   Все переменные есть переменные типа Variant.

VB.Net: Тип Variant запрещен.


Тип
«Денежный»

var

   x: Currency;

Диапазон изменения:  –922337203685477.5808 . . 922337203685477.5807

Объем памяти: 8 байт.


Метод динамического программирования

Пример. Найти наиболее «дешевый» путь от элемента  матрицы  размера   до элемента . Второй способ решения задачи.

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

Идея метода динамического программирования состоит в следующем. Для каждого элемента строится оптимальный путь от него до конца пути. Сначала это делается для всех элементов, которые в одном шаге от конца пути. Затем для всех элементов, которые в двух шагах от конца пути. Затем для всех элементов, которые в трёх шагах от конца пути. И так далее.

Пусть матрица цен имеет размер  и выглядит так:


Пусть  есть цена оптимального пути от элемента  до конца пути.

Множество предпоследних элементов (1-я волна):

, двигаться можно только вниз;

, двигаться можно только вправо.

Множество «предпредпоследних» элементов (2-я волна):

, двигаться можно только вниз;

, двигаться лучше вправо;

, двигаться можно только вправо.

Множество «предпредпредпоследних» элементов (3-я волна):

, двигаться можно только вниз;

, двигаться лучше вниз;

, двигаться лучше вправо;

, двигаться можно только вправо.
Таким образом, можно найти цены и начальное направления оптимального пути для всех «волн», а значит, и для всех элементов матрицы, заканчивая элементом . Результат поиска показан в виде постановки при каждом элементе матрицы двух индексов: цена оптимального пути от этого элемента до конца (нижний индекс), направление оптимального пути от этого элемента (верхний индекс).


 

А также другие работы, которые могут Вас заинтересовать

80129. ФЕДЕРАЛЬНОЕ КАЗНАЧЕЙСТВО 55.5 KB
  267 Бюджетного кодекса РФ осуществляет предварительный и текущий контроль за ведением операций с бюджетными средствами главных распорядителей распорядителей и получателей бюджетных средств кредитных организаций других участников бюджетного процесса по исполняемым бюджетам и бюджетам государственных внебюджетных фондов взаимодействует с другими федеральными органами исполнительной власти в процессе осуществления указанного контроля и координирует их работу. Органы Казначейства осуществляют следующие главные задачи: а организация и...
80130. ФИНАНСЫ И ФИНАНСОВАЯ СИСТЕМА РОССИЙСКОЙ ФЕДЕРАЦИИ 62.5 KB
  Их содержанием являются только те из них посредством которых образуются денежные фонды государства его территориальных подразделений а также предприятий организаций учреждений. По своему материальному выражению финансы представляют собой денежные фонды государства его территориальных подразделений субъектов Федерации муниципальных образований предприятий и учреждений организаций используемые для потребностей общества и развития производства. В результате функционирования финансов создаются распределяются и используются денежные...
80131. ФИНАНСОВОЕ ПЛАНИРОВАНИЕ ДЕЯТЕЛЬНОСТИ ПРЕДПРИЯТИЯ 76.5 KB
  Основное предназначение управления финансами предприятия и финансового планирования состоит в том чтобы: обеспечить рациональную сбалансированность активов средств и пассивов источников финансирования предприятия. обеспечить достаточность платежных средств для исполнения всех обязательств предприятия как по срокам. Вторая из перечисленных выше задач теснейшим образом взаимосвязана с первой С точки зрения текущей деятельности текущих операции в центре внимания управляющего финансами находится именно сбалансированность платежного...
80132. ФИНАНСОВОЕ ПРАВО В СИСТЕМЕ РОССИЙСКОГО ПРАВА: ЕГО ОСОБЕННОСТИ И СВЯЗЬ С ДРУГИМИ ОТРАСЛЯМИ ПРАВА 45.5 KB
  В литературе высказывались сомнения по поводу самостоятельности финансового права как отрасли в системе права. Утверждалось к примеру что это часть государственного и административного права или даже только административного. В дискуссии по этому вопросу были высказаны убедительные доводы опровергнувшие упомянутые сомнения и главный аргумент наличие у финансового права специфики в предмете и методе правового регулирования что требуется для выделения совокупности юридических норм в отрасль права.
80133. Формы межбюджетных трансфертов, предоставляемых из федерального бюджета 116.5 KB
  Межбюджетные трансферты из федерального бюджета за исключением субвенций предоставляются при условии соблюдения органами государственной власти субъектов Российской Федерации бюджетного законодательства Российской Федерации и законодательства Российской Федерации о налогах и сборах. Субъекты Российской Федерации в бюджетах которых расчетная доля межбюджетных трансфертов из федерального бюджета за исключением субвенций в течение двух из трех последних отчетных финансовых лет превышала 5 процентов объема собственных доходов...
80134. ФУНКЦИИ ФИНАНСОВ 42.5 KB
  Следовательно финансовая деятельность государства представляет собой деятельность государства по формированию распределению и использованию централизованных и децентрализованных фондов денежных средств обеспечивающих его бесперебойное функционирование и развитие. Под централизованными финансами понимают экономические отношения связанные с образованием и использованием фондов денежных средств аккумулируемых в государственной бюджетной системе и правительственных внебюджетных фондах. Иными словами к централизованным фондам денежных...
80135. Стабилизационный фонд РФ 202.5 KB
  Формирование и использование средств Фонда Фонд аккумулирует поступления средств вывозной таможенной пошлины на нефть и налога на добычу полезных ископаемых нефть при цене на нефть сорта Юралс превышающей базовую цену. Средства Фонда могут быть использованы на покрытие дефицита федерального бюджета при снижении цены на нефть ниже базовой цены. Если накопленный объем средств Фонда превышает 500 млрд. Объем использования средств Фонда определяется федеральным законом о федеральном бюджете на соответствующий финансовый год.
80136. Банковский контроль. Субъекты, осуществляющие банковский контроль 34 KB
  Банковский контроль осуществляется банками в ходе операций по кредитованию финансированию и расчетам. Банковский контроль необходим для эффективного использования банковских ссуд и направлен также на укрепление платежной дисциплины. Обеспечение возвратности кредита создает основу для банковского контроля в процессе кредитования а контроль в свою очередь служит необходимым условием возвратности кредита.
80137. БЮДЖЕТНАЯ СИСТЕМА И БЮДЖЕТНОЕ УСТРОЙСТВО В РОССИЙСКОЙ ФЕДЕРАЦИИ 67 KB
  В законодательстве было дано ее определение как основанной на экономических отношениях государственном устройстве и юридических нормах совокупности федерального бюджета РФ бюджетов субъектов Федерации и местных бюджетов муниципальных образований.6 и 10 расширил рамки бюджетной системы включив в нее помимо бюджетов в собственном смысле слова внебюджетные государственные социальные фонды ст. С бюджетом названные фонды сближает утверждение их представительными законодательными органами власти которые утверждают и отчеты об исполнении...