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

3. Составные типы данных

Краткий обзор массивов

Массив — это тип данных, который может включать несколько значений одного типа. Например, массив может содержать 60 значений типа Integer — данные о продажах игр за пять лет, либо 12 значений типа ShortInt, каждое из которых представляет собой количество дней в определенном месяце, или 365 значений Real, которые отражают ежедневные расходы на продукты питания в течение года. Каждое значение представлено отдельным элементом массива, а компьютер сохраняет все элементы массива в памяти последовательно.

Для создания массива используется оператор объявления. Объявление массива должно содержать три аргумента:

  • имя массива

  • количество элементов в массиве

  • тип каждого элемента

Например, объявление

var months: array[1..12] of Integer; // создает массив из 12 элементов типа Integer

создает массив с именем months, который содержит 12 элементов. Каждый из них может хранить значение типа Integer. Каждый элемент, в сущности, является переменной, и его можно обрабатывать как обычную переменную.

Общая форма записи для объявления массива выглядит так:

var <имя массива>: array [<размерность массива>] of <тип элементов>;

Многие полезные свойства массива базируются на возможности обращаться к элементам массива по отдельности. Для этого нужно использовать индекс, который позволяет перечислять элементы. Для указания элемента массива используется запись индекса в квадратных скобках. Например, months[1] — первый элемент массива months, a months[12] — последний. Таким образом, объявление массива дает возможность создать несколько переменных одним объявлением, после чего можно использовать индекс, чтобы идентифицировать отдельные элементы и обращаться к ним.

Программа 3_1

// небольшие массивы целых чисел

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

yams: array[1..3] of Integer; //создается массив из трех элементов

yamcosts: array[1..3] of Integer = (20, 30, 5); //создание и инициализация массива

total: Integer;

begin

total := 0;

yams[1] := 7; //присвоение значения первому элементу

yams[2] := 8;

yams[3] := 6;

Writeln('Total yams = ', yams[1] + yams[2] + yams[3]);

Write('The package with ', yams[2], ' yams costs ');

Writeln(yamcosts[2], ' center per yam.');

total := total + yams[1] * yamcosts[1] + yams[2] * yamcosts[2];

total := total + yams[3] * yamcosts[3];

Writeln('The total yam expense is ', total, ' cents.');

Writeln;

Writeln('Size of yams array = ', SizeOf(yams), ' bytes.');

Writeln('Size of one element = ', SizeOf(yams[1]), ' bytes.');

Readln;

end.

Результат:

Total yams = 21

The package with 8 yams costs 30 center per yam.

The total yam expense is 410 cents.

Size of yams array = 12 bytes.

Size of one element = 4 bytes.

Сначала программа создает трехэлементный массив с именем yams. Поскольку yams имеет три элемента, они пронумерованы от 1 до 3, и программа использует значения индекса в диапазоне 1-3, чтобы присвоить значения трем отдельным элементам. Каждый отдельный элемент yams имеет тип Integer со всеми возможностями и преимуществами этого типа данных. Таким образом, в программе можно присваивать значения элементам, а также складывать их, умножать и отображать.

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

yamcosts: array[1..3] of Integer = (20, 30, 5);

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

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

Как уже упоминалось, оператор sizeof возвращает размер типа или объекта данных в байтах. Заметим, что если оператор sizeof используется с именем массива, то выводится общее количество байтов массива. Если же sizeof используется с элементом массива, возвращается размер элемента в байтах (еще одно свидетельство того, что yams — массив, a yams[1] — обычное значение типа Integer).

Для любого массива определены следующие функции:

Length

Число элементов массива

High

Наибольшее значение индекса

Low

Наименьшее значение индекса

Впрочем, для рассматриваемых массивов использовать эти функции вряд ли имеет смысл, поскольку все эти значения известны из объявления массива.

Они используются для открытых и динамических массивов.

Для числовых массивов определены функции (добавить uses Math)

Функция

Тип аргумента

Тип результата

Описание

MaxIntValue

array of integer

integer

Возвращает максимальное значение элемента массива целых чисел.

MinlntValue

array of integer

integer

Возвращает минимальное значение элемента массива целых чисел.

MaxValue

array of double

double

Возвращает максимальное значение элемента числового массива.

MinValue

array of double

double

Возвращает минимальное значение элемента числового массива.

Sum

array of double

extended

Возвращает сумму элементов массива.

Константы - массивы

Синтаксис объявления константы-массива следующий:

const

ИмяМассива: array[Диапазон] of ТипДанных = (значение_1, значение_2, значение_n);

В ряде случаев применение констант-массивов позволяет радикально уменьшить объем кода.

const

MONTH: array[1..6] of string = ('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь');

Строки

Строка – это ряд символов, хранящихся в последовательно расположенных байтах памяти. Доступ к отдельному символу некоторой строки S дается выражением вида S[i], где i — индекс символа в строке. Но это только для однобайтных символов. Тип данных для строк – String.

Краткий обзор структур (записей)

Предположим, что нужно сохранить информацию об игроке в баскетбол. Сюда входят следующие данные: имя, заработок, рост, вес, средний рейтинг, процент попаданий и т.д. Хотелось бы иметь некоторую форму данных, которая может содержать всю эту информацию в одном блоке. Массив для этого не годится, поскольку все его элементы должны быть одного типа. Иначе говоря, один массив может содержать двадцать элементов типа Integer, а другой — десять элементов типа Real, но один и тот же массив не может содержать элементы типа Integer и Real.

Решение состоит в применении структуры. Структура — более универсальная форма данных, чем массив, поскольку может содержать элементы, относящиеся к различным типам данных. Использование структуры позволяет унифицировать представление данных путем сохранения всей связанной с баскетболистом информации в единственной переменной структуры, а для ведения данных по целой команде можно использовать массив структур. Тип структуры также служит мостиком к классу, который является основой ООП (объектно - ориентированного программирования). Изучение структур позволит нам гораздо глубже понять, что представляет собой класс.

Структура (запись) — определяемый пользователем тип данных. Объявление структуры (записи) служит для того, чтобы задавать свойства типов данных. После определения типа можно создавать переменные этого вновь созданного типа. Таким образом, создание структуры предусматривает два этапа. Сначала создается описание структуры. При этом описываются и именуются различные типы данных, которые могут содержаться в структуре. Затем можно создавать структурные переменные или, более обобщенно, структурные объекты данных, которые соответствуют схеме описания.

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

type

TInflatable = record

name: String;

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