Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лекция 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-я волна):
, двигаться можно только вниз;
, двигаться лучше вниз;
, двигаться лучше вправо;
, двигаться можно только вправо.
Таким образом, можно найти цены и начальное направления оптимального пути для всех «волн», а значит, и для всех элементов матрицы, заканчивая элементом . Результат поиска показан в виде постановки при каждом элементе матрицы двух индексов: цена оптимального пути от этого элемента до конца (нижний индекс), направление оптимального пути от этого элемента (верхний индекс).