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-я волна):
, двигаться можно только вниз;
, двигаться лучше вниз;
, двигаться лучше вправо;
, двигаться можно только вправо.
Таким образом, можно найти цены и начальное направления оптимального пути для всех «волн», а значит, и для всех элементов матрицы, заканчивая элементом . Результат поиска показан в виде постановки при каждом элементе матрицы двух индексов: цена оптимального пути от этого элемента до конца (нижний индекс), направление оптимального пути от этого элемента (верхний индекс).
А также другие работы, которые могут Вас заинтересовать | |||
41003. | Українське козацьке бароко | 59.5 KB | |
Архітектура українського бароко.Українська скульптура періоду бароко.Особливості барокової графіки.В архітектурних стилях XVII – XVIII ст. виявляються урізноманітнення економічного, політичного й культурного життя українського суспільства. Естетичні риси української архітектури яскраво виявлені у будівлях стилю бароко. Українське бароко поширюється у XVIIIст. | |||
41004. | Культурологія як наукова дисципліна: об’єкт і предмет | 50.5 KB | |
Сутність культури визначається у трьох основних її сферах: предмети матеріальної і духовної діяльності людини; субєкти творці і носії культури; національний характер народу менталітет мораль. Творчість від Бога і людини. Захід протиставляє Людину і Природу людина панує над природою може змінити її у відносності до своїх уявлень про досконалість і потреб єдність людини з природою можлива через підлаштування пристосування до людини. Східна культура орієнтується на нерозривність людини і природи на їх єдність на основі... | |||
41005. | СУТЬ, РОЛЬ І МЕТОДОЛОГІЧНІ ОСНОВИ МЕНЕДЖМЕНТУ | 455 KB | |
Суть зміст менеджменту та управління Менеджмент як система наукових знань та як мистецтво управління Рівні управління. Методи досліджень Менеджмент як специфічна сфера людської діяльності Будьяке управління це не тільки управління своїм часом а й управління процесами часу. | |||
41006. | М’язова система людини та її вікові особливості | 145.5 KB | |
Основні поняття теми: мязи посмугований скелетний мяз будова мяза фасція мязові волокна міофібрили актин міозин групи мязів синергісти антагоністи згиначі розгиначі скорочення мязів тонус мязів сила мязів втома мязів рухова активність гіподинамія травматичні пошкодження опорнорухового апарату фізична культура динамічна робота статична робота фізична втома постава фізіологічна постава патологічна постава сколіоз кіфоз лордоз плоскостопість. Посмуговані скелетні мязи це активна частина... | |||
41007. | СИСТЕМА УПРАВЛІННЯ ОХОРОНОЮ ПРАЦІ В ОРГАНІЗАЦІЇ | 162 KB | |
Історія виникнення і розвитку системи управління охороною праці в організації СУОП. Політика в галузі охорони праці. Функціональні обовязки з охорони праці керівників посадових осіб і фахівців підприємства галузі. | |||
41008. | Організація навчально-виховного процесу в педагогічних закладах | 96 KB | |
Ознайомити студентів з специфікою організації навчальновиховного процесу в педагогічних закладах; системою контролю та оцінювання умінь та навичок студентів особливостями організації та проведення педагогічної практики. Система контролю та оцінювання знань умінь і навичок студентів. Педагогічна практика студентів. Методичні рекомендації з питань організації та проведення педагогічної практики студентів перед випуском і випускних курсів педагогічних інститутів. | |||
41009. | Поняття про педагогічні конфлікти: специфіка, функції | 154.5 KB | |
Природа педагогічного конфлікту має суттєві відмінності порівняно з іншими видами конфліктів зумовлені тим що в конфліктну взаємодію включені дитина і дорослий а не просто дві рівноцінні дорослі людини що мають певний досвід розум волю саморегуляцію і інші якості набуті в ході життя В. Тому велика кількість літератури з питань конфліктів не завжди сприяє педагогічному успіху у вирішенні проблеми педагогічного конфлікту. Більше того необхідність вивчення педагогічних конфліктів диктується гостротою соціальнопсихологічних ситуацій в... | |||
41010. | ЕТЮД НА ПОДІЮ, ЯКУ ВИРАЖЕНО «ЛАНЦЮГОМ ПСИХОФІЗИЧНИХ ДІЙ» НА ОСНОВІ ЛІТЕРАТУРНОГО ТВОРУ | 235.5 KB | |
Якщо у вправі студенти освоюють той або інший навик узятий ізольовано як такий то етюд це завжди якась історія відрізок життя в основі якого лежить подія. В таких етюдах особливо важливим є момент сприйняття факту: детальна розшифровка миті життя що передбачає рух думки внутрішній монолог внутрішню боротьбу мотивів розробку психофізичної реакції на подію темпоритму існування. В кінці життя Костянтин Сергійович Станіславський стверджував що надзадача і наскрізна дія головне в мистецтві. Необхідно виробити в собі звичку постійно... | |||
41011. | Походження і головні етапи розвитку культури | 37 KB | |
Виникнення мистецтва.Основні види мистецтва.Походження мистецтва.Види і функції мистецтва.Виготовлення знарядь праці передбачає ускладнення центральної нервової системи, передовсім головного мозку,здатність до точніших рухів,але не розвиток м’язів | |||