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

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

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

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

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


 

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

46729. Exclamatory sentences 28 KB
  The main distinctive feature of this communicative type of sentence is a specific intonation; structurally it is variable
46730. Основні правила наголошування в українській мові. Засоби милозвучності української мови 28 KB
  Основні правила наголошування в українській мові. Система наголошування в українській мові досить складна проте є певні основні правила: Віддієслівні іменники середнього роду на ання у яких більше двох складів мають наголос як правило на суфіксі. Українській мові властиве уникання як збігу голосних так і збігу приголосних.
46731. ХАРАКТЕРИСТИКА КРИЗИСА НОВОРОЖДЕННОСТИ 28 KB
  ХАРАКТЕРИСТИКА КРИЗИСА НОВОРОЖДЕННОСТИ Первый критический период развития ребенка период новорожденности. С одной стороны это полная биологическая беспомощность ребенка он не в состоянии удовлетворить ни одной жизненной потребности без взрослого. В противоречии между максимальной социальностью и минимальными средствами общения заложена основа всего развития ребенка в младенческом возрасте. Основное новообразование возникновение индивидуальной психической жизни ребенка.
46732. Система стимулювання збуту в діяльності підприємства на зовнішніх ринках 1.02 MB
  Рoзглянутo наукові погляди вчених на маркетингові комунікації загалом та систему стимулювання збуту зокрема, основні складові засобів маркетингових комунікацій нa міжнародному ринку. Досліджено сучасний стан маркетингової комунікативної політики вітчизняного підприємства та проаналізовано його систему стимулювання збуту
46733. Экономическое обоснование ремонтопригодности функционального генератора 281 KB
  Функциональные генераторы относятся к измерительным приборам, вырабатывающим сигналы различных форм, т. е. различные «функции»: синусоидальную, треугольную, прямоугольную, пилообразную, ступенчатую, экспоненциальную, трапецеидальную и другие.
46734. The United States of America 28 KB
  The United States of America is a federal union of 50 states plus one independent district – the District of Columbia. Forty-nine states are situated on the continent but the 50th state is the state of Hawaii – a group of islands situated in the mid Pacific Ocean