Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Паскаль в среде Turbo Pascal версии 6 и 7 (Курс лекций). Воронов Г.И.Санкт-Петербург 2010г.doc
Скачиваний:
64
Добавлен:
15.04.2015
Размер:
754.69 Кб
Скачать

Глава 7. Составные типы данных Классификация составных типов

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

Операции обработки процессор может выполнять только над простыми элементами, входящими в составные данные, поэтому кроме общего имени должны существовать или внутренние имена входящих в них элементов, или какие-либо другие способы их выбора.

Все составные данные делятся на три различных типа

Составные данные

Массивы

Структурыыы

Списки

и Строки

Рисунок 12. Классификация составных даных

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

Массивы Основные определения

Массивом называется совокупность однотипных простых данных, имеющих общее имя и расположенных в памяти ЭВМ подряд; обращение к элементам, составляющим массив, осуществляется с помощью индексных выражений. Количество индексов, задающих отдельный элемент массива, определяет размерность массива.

Массивы являются наименее сложными из всех составных типов и, поэтому, реализованы во всех алгоритмических языках.

Впамяти массив представляет собой подряд расположенные ячейки одного типа. Все имеют одно и то же имя, и могут вызываться используя это имя и индекс (порядковый номер для одномерного массива).

Благодаря тому, что индекс может задаваться выражением (в частности – именем переменной), Элементы массива удобно использовать в циклах. При этом обращение к разным элементам массива выглядит одинаково: A[i].

Такая возможность определяет назначение массивов – хранение в памяти данных одного типа, которые следует обрабатывать одинаковыми операциями.

Массивы бывают одномерные и многомерные. Одномерные массивы иногда называют векторами, двумерные - матрицами.

В общем случае массивом может выступать совокупность однотипных составных данных, например массив структур, массив символьных строк и т.д. Такие массивы реализованы не во всех языках (в Turbo Pascal - разрешены).

В линейной памяти ЭВМ одномерные массивы размещаются в порядке возрастания индекса, многомерные "вытягиваются в цепочку элементов" или с наиболее быстрым ростом первого индекса - "по столбцам" (в языке Фортран) или с наиболее быстрым ростом последнего индекса - "по строкам" (Паскаль).

Чтобы выбрать из памяти нужный элемент массива, процессор должен выполнить некоторые вспомогательные расчеты (вычислить адрес элемента массива в памяти по адресу начала массива и смещению элемента относительно начала). Эти вычисления выполняются по формуле доступа, которая тем сложнее, чем больше размерность массива.

Например, для двумерного массива А[MxN], состоящего из элементов длиной d байт каждый, где M - число строк, а N -столбцов, адрес элемента А[i,j] (@A[i,j]) будет вычисляться по формуле:

@A[i,j] = @A[1,1] + d*( N*(i-1) + (j-1))

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

B Turbo Pascal компоненты массива могут быть любого (в том числе - составного) типа, индексы могут быть любого порядкового типа (т.е. не вещественного), но не Longint. Описание массива можно производить двумя способами: через задание типа-массива и непосредственно.

Например:

Создание массивов с использованием описателей типов

TYPE

mas1 = array[1..100] of integer; {описатель для целочисленных

одномерных массивов длиной не более 100 элементов}

vector = array [1..30] of real; {описатель для вещественных

одномерных массивов длиной не более 20 элементов}

mas2 = array[1..8, 1..10] of Char; {описатель для символьных

двумерных массивов размерами не более 8 строк и 10 столбцов }

matrix = array[1..12] of vector; {описатель для вещественных

двумерных массивов размерами не более 10 строк и 20 столбцов.}

Последний описатель можно было бы задать без использования описателя типа vector:

matrix = array[1..12, 1..30] of real;

После задания типов, можно описать переменные таких типов:

VAR {здесь выделяется место под все массивы }

Names : mas2;

Numbers, Ages : mas1;

Day_Tempr,Day_Wind : vector;

Tempr1996 : matrix;

Создание массивов без использования специальных описателей типов

VAR Ball_Groop_1,B_M170 : array[1..30] of real; {выделение места под два одномерных вещественных массива }

B_M175 : array[1..30] of real;

Ball_Kurs : array[1:12, 1..30] of real; {выделение места под двумерный вещественный массив }

Массивы созданные одним оператором описания или разными операторами, но использующими общий писатель являются совместимыми, для них возможны операции присваивания, операции отношения (только равно и не равно). Для массивов описанных выше можно написать операторы:

. . .

Ball_Groop1 := B_M170;

Numbers:= Ages;

If Day_Tempr=Day_Wind then ...

Но недопустим ни один из операторов:

Ball_Kurs := Tempr1996;

Ball_Groop1 := B_M175;

B_M175 := B_M170;

While B_M175<> B_M170 do ...

Следует отметить, что оператор присваивания переписывает значения из элементов массива, стоящего в правой части в соответствующие элементы массива, имя которого указано в левой части оператора присваивания. Два совместимых массива равны (и результат сравнения равен TRUE), если каждый элемент одного массива равен соответствующему элементу второго массива. При нарушении равенства хотя бы для одной пары элементов результат сравнения - FALSE.

Заполнение массива данными

Заполнить массив значениями можно тремя способами (как и любую переменную).

Во-первых, можно задать все элементы массива, или начало массива при описании его в разделе CONST. (В дальнейшем заданные значения можно изменить.)

TYPE

mas = array[1..10] of real;

CONST

A1 : mas = (-5,4,-3,2,-1);

Во-вторых, элементы массива можно заполнить с помощью оператора присваивания:

for I := 1 to M do

for j := 1 to N do

A2[I,j] := 1;

Наконец, в-третьих, массив можно полностью или частично заполнить вводом (с клавиатуры или из файла). В этом случае, заполнение включает ввод количества элементов массива (с проверкой допустимости введенного значения) и ввод самих элементов массива в указанном количестве. Если ввод значений предусмотрен с клавиатуры, перед каждым оператором чтения должен быть запрос на ввод. (Работа с файлами рассмотрена в главе 9). Пример заполнения массива числами с клавиатуры:

CONST MIN=2;

MAX=20

. . .

BEGIN

. . .

Repeat

Writeln(' Введи длину массива');

Read(N);

if(N<MIN) or (N>MAX) then

Writeln('Недопустимое количество, введите снова');

Until(N>MIN)and(N<=MAX); {здесь MIN и MAX задают диапазон изменения индекса

в одномерном массиве }

fori:=1toNdo

begin

WriteLn(‘Введите очередное число в массив’);

ReadLn(A3[i]);

end;

. . .

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