- •1. Введение
- •2. Архитектура эвм и вычислительных систем.
- •3. Основы алгоритмизации и программирования
- •4. Разработка и проектирование информационных систем.
- •5. Информационные технологии
- •6. Базы данных.
- •7. Сетевые операционные системы и среды.
- •9. Технические средства информации.
- •9. Компьютерные сети.
3. Основы алгоритмизации и программирования
ИСПОЛЬЗОВАНИЕ ДИНАМИЧЕСКИХ СТРОКОВЫХ МАССИВОВ.
Массив — это составной тип данных, состоящий из фиксированного числа элементов одного и того же типа. Для описания массива предназначено словосочетание array of. После слова array в квадратных скобках записываются границы массива, а после слова of — тип элементов массива, например:
type
TStates = array[1..50] of string;
TCoordinates = array[1..3] of Integer;
После описания типа можно переходить к определению переменных и типизированных констант:
var
States: TStates; { 50 strings }
const
Coordinates: TCoordinates = (10, 20, 5); { 3 integers }
Обратите внимание, что инициализация элементов массива происходит в круглых скобках через запятую.
Массив может быть определен и без описания типа:
var
Symbols: array[0..80] of Char; { 81 characters }
Чтобы получить доступ к отдельному элементу массива, нужно в квадратных скобках указать его индекс, например:
Symbols[0]
Объявленные выше массивы являются одномерными, так как имеют только один индекс. Одномерные массивы обычно используются для представления линейной последовательности элементов. Если при описании массива задано два индекса, массив называется двумерным, если n индексов — n-мерным. Двумерные массивы используются для представления таблицы, а n-мерные — для представления пространств. Вот пример объявления таблицы, состоящей из 5 колонок и 20 строк:
var
Table: array[1..5] of array[1..20] of Double;
То же самое можно записать в более компактном виде:
var
Table: array[1..5, 1..20] of Double;
Чтобы получить доступ к отдельному элементу многомерного массива, нужно указать значение каждого индекса, например
Table[2][10]
или в более компактной записиTable[2, 10]
Эти два способа индексации эквивалентны.
2.11.2. Работа с массивами
Массивы в целом участвуют только в операциях присваивания. При этом все элементы одного массива копируются в другой. Например, если объявлены два массива A и B,
var
A, B: array[1..10] of Integer;
то допустим следующий оператор:A := B;
Оба массива-операнда в левой и правой части оператора присваивания должны быть не просто идентичны по структуре, а описаны с одним и тем же типом, иначе компилятор сообщит об ошибке. Именно поэтому все массивы рекомендуется описывать в секции type.
С элементами массива можно работать, как с обычными переменными. В следующей программе элементы численного массива последовательно вводятся с клавиатуры, а затем суммируются. Результат выводится на экран.program Console;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
A: array[1..5] of Double;
Sum: Double;
I: Integer;
begin
for I := 1 to 5 do Readln(A[I]);
Sum := 0;
for I := 1 to 5 do Sum := Sum + A[I];
Writeln(Sum);
Writeln('Press Enter to exit...');
Readln;
end.
Для массивов определены две встроенные функции — Low и High. Они получают в качестве своего аргумента имя массива. Функция Low возвращает нижнюю, а High — верхнюю границу этого массива. Например, Low(A) вернет значение 1, а High(A) — 5. Функции Low и High чаще всего используются для указания начального и конечного значений в операторе цикла for. Поэтому вычисление суммы элементов массива A лучше переписать так:for I := Low(A) to High(A) do Sum := Sum + A[I];
В операциях с многомерными массивами циклы for вкладываются друг в друга. Например, для инициализации элементов таблицы, объявленной какvar
Table: array[1..5, 1..20] of Double;
требуются два вложенных цикла for и две целые переменные Col и Row для параметров этих циклов:for Col := 1 to 5 do
for Row := 1 to 20 do
Table[Col, Row] := 0;
Массивы в параметрах процедур и функций
Массивы, как и другие типы данных, могут выступать в качестве параметров процедур и функций. Вот как может выглядеть функция, вычисляющая среднее значение в массиве действительных чисел:const
Max = 63;
type
TStatistics = array [0..Max] of Double;
function Average(const A: TStatistics): Double;
var
I: Integer;
begin
Result := 0;
for I := Low(A) to High(A) do Result := Result + A[I];
Result := Result / (High(A) - Low(A) + 1);
end;
Функция Average принимает в качестве параметра массив известной размерности. Требование фиксированного размера для массива-параметра часто является чрезмерно сдерживающим фактором. Процедура для нахождения среднего значения должна быть способна работать с массивами произвольной длины. Для этой цели в язык Delphi введены открытые массивы-параметры. Такие массивы были заимствованы разработчиками языка Delphi из языка Modula-2. Открытый массив-параметр описывается с помощью словосочетания array of, при этом границы массива опускаются:function Average(const A: array of Double): Double;
var
I: Integer;
begin
Result := 0;
for I := Low(A) to High(A) do Result := Result + A[I];
Result := Result / (High(A) - Low(A) + 1);
end;
Внутри подпрограммы Average нижняя граница открытого массива A равна нулю (Low(A) = 0), а вот значение верхней границы (High(A)) неизвестно и выясняется только на этапе выполнения программы.
Существует только два способа использования открытых массивов: обращение к элементам массива и передача массива другой подпрограмме, принимающей открытый массив. Нельзя присваивать один открытый массив другому, потому что их размеры заранее неизвестны.
Заметьте, что во втором операторе открытый массив конструируется в момент вызова функции Average. Конструктор открытого массива представляет собой заключенный в квадратные скобки список выражений. В выражениях могут использоваться константы, переменные и функции. Тип выражений должен быть совместим с типом элементов массива. Конструирование открытого массива равносильно созданию и инициализации временной переменной.
И еще одно важное замечание по поводу открытых массивов. Некоторые библиотечные подпрограммы языка Delphi принимают параметры типа array of const — открытые массивы констант. Массив, передаваемый в качестве такого параметра, обязательно конструируется в момент вызова подпрограммы и может состоять из элементов различных типов (!). Физически он состоит из записей типа TVarRec, кодирующих тип и значение элементов массива (записи рассматриваются ниже). Открытый массив констант позволяет эмулировать подпрограммы с переменным количеством разнотипных параметров и используется, например, в функции Format для форматирования строки (см. выше).
Уплотнение структурных данных в памяти
С целью экономии памяти, занимаемой массивами и другими структурными данными, вы можете предварять описание типа зарезервированным словом packed, например:var
A: packed array[1..10] of Byte;
Ключевое слово packed указывает компилятору, что элементы структурного типа должны храниться плотно прижатыми друг к другу, даже если это замедляет к ним доступ. Если структурный тип данных описан без ключевого слова packed, компилятор выравнивает его элементы на 2- и 4-байтовых границах, чтобы ускорить к ним доступ.
Заметим, что ключевое слово packed применимо к любому структурному типу данных, т.е. массиву, множеству, записи, файлу, классу, ссылке на класс.