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

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

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

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

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


 

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

13409. Методика і техніка шкільного демонстраційного експерименту із розділу Хвильова і квантова оптика (10 кл.) 1.65 MB
  Тема: Методика і техніка шкільного демонстраційного експерименту із розділу Хвильова і квантова оптика 10 кл. Кільця Ньютона Обладнання: апарат проекційний з лампою розжарювання або дуговою лампою кільця Ньютона з набору по дифракції та інтерфе
13410. Створення дидактичних засобів у програмі Microsoft Word 609 KB
  исципліна Інформаційні технології та ТЗН ЛАБОРАТОРНА РОБОТА №1011. Тема: Створення дидактичних засобів у програмі Microsoft Word. Мета: Сформувати практичні навички створення дидактичних засобами програми Microsoft Word. Основні поня...
13411. Введення і редагування тексту засобами MS Excel 229 KB
  Автори: Бондар Н.П. Глушак О.М.Дисципліна Інформаційні технології та ТЗН ЛАБОРАТОРНА РОБОТА №12. Тема: Введення і редагування тексту засобами MS Excel. Мета: Формувати практичні вміння та навички введення редагування тексту та налаштування роботи в MS Excel...
13412. Форматування таблиць засобами MS Excel 293 KB
  Автори: Бондар Н.П. Глушак О.М.Дисципліна Інформаційні технології та ТЗН ЛАБОРАТОРНА РОБОТА №13. Тема: Форматування таблиць засобами MS Excel. Мета: Формувати практичні вміння та навички форматування таблиць в програмі MS Excel.
13413. Робота зі списками в MS Excel 53 KB
  Автори: Бондар Н.П. Глушак О.М. Дисципліна Інформаційні технології та ТЗН ЛАБОРАТОРНА РОБОТА №15. Тема: Робота зі списками в MS Excel. Мета: Формувати практичні вміння та навички роботи із засобами сортування та фільтрації в MS Excel. ...
13414. Створення дидактичних матеріалів засобами MS Excel 580 KB
  Автори: Бондар Н.П. Глушак О.М.Дисципліна Інформаційні технології та ТЗН ЛАБОРАТОРНА РОБОТА №1617. Тема: Створення дидактичних матеріалів засобами MS Excel. Мета: Формувати практичні вміння та навички розроблювати дидактичні матеріали з автоматичним виз...
13415. Радіаційна безпека 143.5 KB
  Радіаційна безпека Мета роботи: вивчити теоретичні положення про радіаційну безпеку навчитись вимірювати дозу іонізуючого випромінювання скласти орієнтований раціон харчування. Зміст роботи: 1. Поняття радіації. 2. Вплив радіації на біологічні структури. 3. Мет...
13416. Параметри функціонального стану організму людини як умова її безпеки 113 KB
  Лабораторна робота № 3 Параметри функціонального стану організму людини як умова її безпеки Мета: ознайомитися з найбільш поширеними методами визначення фізіологічного та психологічного стану людини використати дані методи для аналізу параметрів власного стану. ...