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-я волна):

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

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

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

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


 

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

391. Проблемы экономической безопасности России 128 KB
  Ключевые тенденции проблематики экономической безопасности. Прикладные аспекты экономической безопасности. Глобализация как угроза экономическому суверенитету государства. Методика определения ключевых проблем экономической безопасности.
392. Объекты промышленной интеллектуальной собственности 62.5 KB
  Объект интеллектуальной собственности, цели и задачи, на решение которых направлен объект. Сравненительный анализ разработанного объекта и прототипа. Разработка объекта промышленной собственности.
393. Коммуникативная компетенция учителя иностранного языка 96 KB
  Теоретические аспекты формирования коммуникативной компетенции в рамках педагогического процесса. Лингвистическая компетенция как одна из составляющих иноязычной коммуникативной компетенции. Коммуникативная компетенция как новый тип содержания образования в школе.
394. Теория дизайна 222 KB
  История понятие термина дизайн. Промышленный и транспортный дизайн. Колористика и суперграфика. Визуальная идентификация, товарные знаки, визуальные коммуникации и ландшафтный дизайн. Примеры дизайна квартир.
395. Денежная масса и скорость обращения денег 62 KB
  Деньги являются важнейшим атрибутом рыночной экономики. Налично-денежное обращение - движение наличных денег в сфере обращения и выполнение ими двух функций (средства платежа и средства обращения).
396. М.В. Исаковский на Смоленщине 297.56 KB
  Связь биографии поэта с историей народа и страны. Народность песенного творчества М.В. Исаковского. Отражение в лирике М. В. Исаковского черт русского национального характера.
397. Электрический ток в различных средах 333 KB
  Электрический ток в металлах. Носителями зарядов являются положительные ионы и электроны. Рекомбинация заряженных частиц. Самостоятельный электрический разряд. Электрический ток в полупроводниках.
398. Алгоритм микропроцессорного комплекта К580 62.5 KB
  На вход поступает двух проводная линия, по которой поступает параллельный 8-ми разрядный код. Состав кристаллов: ВМ80, ВВ51, ВИ53, ПЗУ/ОЗУ. Посчитать коэффициент преобразования входной величины в выходную.
399. Создание счетчика с произвольным коэффициентом пересчета 101 KB
  Реализовать двоичный вычитающий счётчик с пропуском начальных состояний и коэффициентом пересчёта 10 на RS-триггерах на элементах 1533 серии.