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

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

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

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

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


 

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

45862. Инструментальные магазины – накопители. Виды инструментальных магазинов. Кодирование и распознавание инструментов в инструментальных магазинах 320.18 KB
  Инструментальные магазины накопители. Виды инструментальных магазинов. Кодирование и распознавание инструментов в инструментальных магазинах. Основным элементом УАСИ является инструментальные магазины накопители устанавливаемые на многооперационных станках представляющих собой накопители инструментов большой емкости от 16 и более.
45863. Автоматизация загрузочных операций. Автоматизация и механизация загрузки и разгрузки. Виды загрузочно – разгрузочных устройств 16.43 KB
  Для осуществления загрузочных операций в автоматическом режиме необходимо осуществлять следующие действия: 1создать задел заготовок для обеспечения бесперебойной работы загрузочного оборудования 2осуществить пространственную ориентацию загрузочных изделий. В комплексе задач по автоматизации технологических процессов наиболее сложным является задача автоматизации и механизации загрузки и разгрузки что вызвано большим разнообразием форм и размеров заготовок и деталей а также самих процессов. ЗРУ в условиях серийного производства...
45864. Автоматический контроль. Виды контроля по формам воздействия на объект. Активный автоматический контроль 14.98 KB
  Виды контроля по формам воздействия на объект. Под устройствами автоматического контроля понимают устройства которые без вмешательства человека выполняют всю совокупность операций необходимых для выяснения действительных параметров заготовок и деталей полуфабрикатов производят измерения в процессе обработки до его начала либо после сортируют по величине отклонений действительных параметров от номинального значения а также управляет режимами работы оборудования. Для осуществления пассивного автоматического контроля широко используются...
45865. Промышленные роботы: понятие и назначение. Основные сведения о промышленных роботах. Манипуляторы и автооператоры 18.22 KB
  При обслуживании основного технологического оборудования ПР выполняют операции по загрузке заготовок и разгрузке готовых деталей или полуфабрикатов контролю смене инструментов уборке отходов производства установке и смене средств контроля в автоматическом режиме на технологическое оборудование межоперационной передаче и транспортированию складированию. В составе транспортных систем ПР могут самостоятельно осуществлять операции перемещения и доставки грузов обслуживать различные линии осуществлять операции по накоплению и контролю. Они...
45866. Инструменты для нарезания резьбы. Формообразующие движения. Особенности эксплуатации и обеспечение точности нарезаемой резьбы 103.44 KB
  Инструменты для нарезания резьбы. Особенности эксплуатации и обеспечение точности нарезаемой резьбы. Резьбы на деталях получают на сверлильных резьбонарезных и токарных станках а также накатыванием т. Инструментом для накатывания резьбы служат накатные плашки накатные ролики и накатные головки.
45867. Инструменты для нарезания зубьев цилиндрических колес. Методы их работы. От каких факторов зависит степень точности нарезаемого зубчатого венца 96.1 KB
  Относятся 1дисковые пальцевые и зуборезные фрезы зубодолбежные головки идрСхема фрезерия зуб. Вращение фрезы вокруг своей оси. Пальцевые фрезы целесообразно использовать при обр. фрезы и загат.
45868. Инструменты для повышения степени точности зубчатых колес, их конструкция и принцип работы 61.73 KB
  Если вращать шевер а обрабатываемому колесу увлекаемому им во вращение сообщать поступательное движение то режущие кромки канавок шевера будут снимать тонкие толщиной менее 001 мм волосообразные стружки с поверхности зубьев. Шевингование применяют для тонкой обработки зубьев у незакаленных колес или закаленных до твердости HRC = 35. Схема шлифования зубьев: а методом копирования; б методом обкатки Закаленные до более высокой твердости поверхности зубьев могут быть отделаны шлифованием. Как и при зубонарезании шлифование зубьев...
45869. Абразивные материалы и техническая характеристика абразивных инструментов. Особенности режима шлифования 42.39 KB
  Особенности режима шлифования. АБРАЗИ́ВНЫЕ МАТЕРИА́ЛЫ вещества повышенной твердости применяемые в массивном или измельченном состоянии для механической обработки шлифования резания истирания заточки полирования и т. Плоские круги прямого профиля ПП применяют для круглого наружного внутреннего и бесцентрового шлифования для плоского шлифования периферией круга и для заточки инструментов. Плоские круги с двухсторонним коническим профилем 2П применяют для вышлифовывания зубьев шестерен и шлифования резьбы.
45870. Особенности конструкций инструментов для автоматизированного производства 12.54 KB
  Особенности конструкций инструментов для автоматизированного производства. К этому инстрту предъявся повышенные требования е его качеству к точности размеровгеометрой формы качеству заточки. инструм. инстров с мехим креплением многогранных неперетаых пластинок из тверд.