Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi через Прат.doc
Скачиваний:
2
Добавлен:
14.11.2019
Размер:
631.81 Кб
Скачать

Volume: 1.40

Price: $17.99

Динамический массив

Динамические массивы отличаются от обычных статических массивов тем, что в них не объявляется заранее длина — число элементов. Поэтому динамические массивы удобно использовать в приложениях, где объем обрабатываемых массивов заранее неизвестен и определяется в процессе выполнения в зависимости от действий пользователя или объема перерабатываемой информации.

Объявление динамического массива содержит только его имя и тип элементов — один из базовых типов. Синтаксис объявления:

<имя> array of <базовый тип>

Например

Var a: array of integer;

объявляет переменную А как динамический массив целых чисел.

При объявлении динамического массива место под него не отводится. Прежде, чем использовать массив, надо задать его размер процедурой SetLength. В качестве аргументов в нее передаются имя массива и целое значение, характеризующее число элементов. Например

SetLength(А, 10);

выделяет для массива А место в памяти под 10 элементов и задает нулевые значения всех элементов.

Индексы динамического массива — всегда целые числа, начинающиеся с 0.

Таким образом, в приведенном примере массив содержит элементы от А[0] до А[9].

Повторное применение SetLength к уже существующему в памяти массиву изменяет его размер. Если новое значение размера больше предыдущего, то все значения элементов сохраняются и просто в конце добавляются новые нулевые элементы. Если же новый размер меньше предыдущего, то массив усекается и в нем остаются значения первых элементов. Например, для приведенной ниже программы размерность и значения элементов массива при выполнении различных операторов показаны в комментариях к тексту.

var

A: array of integer;

N,i: integer;

begin

N:=5;

SetLength(A,N); //массив А(0,0,0,0,0)

for i:=0 to N-1 do

A[i]:=i+1; // массив А(1,2,3,4,5)

N:=7;

SetLength(A, N) ; // массив A(1 ,2,3, 4, 5, 0, 0)

N:=3;

SetLength(A/N); // массив А(1,2,3)

N:=4;

SetLength(A,N); // массив A(1,2,3,0)

end;

Впрочем, усечение динамического массива лучше проводить функцией Сору, присваивая ее результат самому массиву. Например, оператор

А := Сору(А, 0, 3);

усекает динамический массив А, оставляя неизменными первые три его элемента.

Если динамический массив уже размещен в памяти, к переменной этого массива можно применять стандартные для массивов функции Length — длина, High — наибольшее значение индекса (очевидно, что всегда High = Length -1) и Low — наименьшее значение индекса (всегда 0). Если массив имеет нулевую длину, то High возвращает -1, т.е. при этом получается, что High < Low.

Сама переменная динамического массива является указателем на начало массива. Если место под массив еще не выделено, значение переменной равно nil. Но это не совсем обычный указатель. Его нельзя разыменовывать операцией ^, нельзя передать в процедуры New и Dispose.

Удалить из памяти динамический массив можно одним из следующих способов: присвоить ему значение nil, или установить нулевую длину. Таким образом, эквивалентны следующие операторы:

А := nil;

или

SetLength(А,0);

Программа 3_9

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

A: array of Integer;

begin

SetLength(A, 1);

A[0] := 2;

Writeln(A[0]);

SetLength(A, 2);

A[1] := 5;

Writeln(A[0], ' ', A[1]);

Readln;

end.

Результат:

2

2 5

ВОПРОСЫ ДЛЯ ПОВТОРЕНИЯ (3)

  1. Как бы вы объявили следующие объекты данных?

    1. actors — массив 30 элементов типа String.

    2. betsie — массив 100 элементов типа Smallint.

    3. chuck — массив 13 элементов типа Real.

    4. dipsea — массив 64 элементов типа Extended.

  2. Объявите массив из пяти элементов типа Integer и заполните его первыми пятью целыми нечетными числами.

  3. Сконструируйте оператор, который присваивает сумму первого и последнего элемента массива из вопроса 2 переменной even.

  4. Сконструируйте оператор, который выводит значение второго элемента массива ideas типа Real.

  5. Объявите строку типа String и присвойте ему значение строки "cheeseburger".

  6. Придумайте объявление записи, описывающей рыбу. Запись должна включать вид, вес в целых граммах и длину в долях метра.

  7. Объявите переменную типа, описанного в вопросе 6, и присвойте ей начальное значение.

  8. Предположим, что переменная ted имеет тип Real. Объявите указатель на ted и используйте его для вывода значения этой переменной.

  9. Создайте фрагмент кода, который запрашивает ввод с клавиатуру положительных целых чисел, а затем создает динамический массив из полученного количества значений типа Integer.

  10. Напишите фрагмент кода, который динамически определяет запись типа, описанного в вопросе 6, а затем считывает значение для элемента этой записи, описывающего вид.

Упражнения по программированию (3)

  1. Напишите программу на Delphi, которая запрашивает и выводит информацию как показано ниже. Заметьте также, что программа понижает отметку на один балл, т. е. выводит следующую по алфавиту букву относительно введенной пользователем (в американских школах принято буквенное обозначение оценок, А — наивысший балл.).

What is your first name? Betty Sue

What is your last паше? Yew

What letter grade do you deserve? В

What is your age? 22

Name: Yew, Betty Sue

Grade: С

Age: 22

  1. Запись TCandyBar включает три элемента. Первый элемент содержит имя производителя конфеты-батончика. Второй — вес (определенный с помощью вещественного числа) конфеты-батончика, а третий — количество калорий (целочисленное значение). Напишите программу, которая объявляет такую запись и создает переменную типа TCandyBar с именем snack, присваивая элементам этой структуры значения "Mocha Munch", 2.3 и 350 соответственно. Присваивание (инициализация) должно быть частью объявления snack. В результате программа должна вывести содержимое переменной snack.

  2. Запись TCandyBar содержит три элемента, как описано в упражнении по программированию 2. Напишите программу, которая создает массив из трех записей TCandyBar, присваивает им значения на ваш выбор и затем выводит содержимое каждой записи.

  3. Уильям Вингейт предлагает услуги по учету пиццы. Для каждой пиццы он записывает такую информацию:

    • Имя компании-производителя пиццы, которое может содержать более одного слова

    • Диаметр пиццы

    • Вес пиццы

Придумайте запись, которая может хранить такую информацию, и напишите программу, в которой используется переменная специального типа для такой записи. Программа должна предлагать пользователю ввести данные для каждого из названных пунктов и затем выводить эту информацию.

  1. Напишите программу к упражнению 2, но используйте оператор new для выделения записи области памяти вместо объявления структурной переменной. Программа должна также запрашивать диаметр пиццы до запроса названия компании — производителя пиццы.

  2. Выполните упражнение 3, но вместо объявления массива трех структур типа TCandyBar используйте оператор new для динамического выделения памяти массиву.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]