28631

Структурный тип - Массив

Лекция

Информатика, кибернетика и программирование

Понятие массива в Паскале. Описание массивов и доступ к элементам массива. Понятие массива в Паскале. Идея массива состоит в том чтобы объединить в одно целое фиксированное количество элементов одного и того же типа.

Русский

2013-08-20

48.5 KB

6 чел.

Лекция 10: Структурный тип - Массив.

1. Понятие массива в Паскале.

2. Описание массивов и доступ к элементам массива..

3. Обработка массивов.

4. Пример работы с массивом.

1. Понятие массива в Паскале.

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

Суть концепции массива в Паскале заключается в том, чтобы объединить элементы в такую структуру, в которой эти элементы были бы линейно упорядочены (пронумерованы) так, чтобы к ним был прямой доступ через их номер. Номер элемента в массиве принято называть индексом элемента.

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

2. Описание массивов и доступ к элементам массива.

Прежде чем использовать массив, его следует описать в разделе описаний программы. Общая форма описания массива имеет вид:

type <имя типа-массива> = array [ < тип индекса > ] of  < тип  элементов>;

где: <имя типа-массива> - имя, выбираемое программистом.

      < тип индекса > - любой порядковый тип (кроме longint) или тип-диапазон.

      < тип элементов > - любой тип Турбо Паскаля.

В качестве типа индекса часто используют тип-диапазон, указывающий границы индекса. Например:  

type measure = array [ 1..16] of  real; {тип -массив измерений}

var m1,m2: measure; {переменные-массивы измерений}

Кроме переменных допускается также описание типизированных констант-массивов, в котором элементы-константы перечисляются через запятую. Например:

сonst vect: array [1..8] of 0..9 = (0,0,0,0,1,2,3,4);

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

Двумерный массив (матрица) может быть описан в виде:

type <имя типа-массива>= array [<тип индекса1>] of  array [<тип индекса2>] of <тип >;

Однако в Паскале допускается более компактная форма таких описаний, в которой вместо одного типа индекса используется список из нескольких типов индексов.

Для матрицы такое описание будет иметь вид:

type <имя типа-массива>=array[<тип индекса1,тип индекса2>]of <тип компонент>;

Например: type matr= array [ 1..16,1..8] of real; {тип - матрица 16х8}

       var mt1,mt2: matr; {переменные типа matr}

Доступ к элементам массива осуществляется посредством так называемых индексированных имен, имеющих вид:

<имя переменной-массива > [<индексное выражение > ];

где : <индексное выражение > - выражение типа индекса (в частности, индексным выражением может быть переменная).

В случае, когда массив многомерный (имеет несколько индексов), доступ к элементу массива осуществляется по списку индексных выражений в виде:

<имя переменной-массива >[<индексное выражение1 >,<индексное выражение2 >, ...];

Например: m1[ j ]  {значение j- элемента  массива m1}

       mt2[j+3, k]  {значение элемента (j+3)-строки, k-столбца матрицы mt2}

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

3. Обработка массивов.

Для массивов допустим оператор присваивания в форме:

<переменная1-массив> := < переменная2 -массив>;

где: левая и правая части содержат переменные массивов только одного типа.

Такие операторы присваивания могут использоваться для копирования одного массива в другой. Однако над массивами не определены отношения <,>,<=,>=,=.<>. Кроме того, в Турбо Паскале нельзя использовать выражения над массивами.

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

<переменная-массив> [<индексная переменная>] := < выражение >;

где: < выражение > должно быть согласовано по типу с типом элементов массива.
Индексированные имена могут входить в состав выражений соответствующего т
ипа также как простые имена.

Важным средством обработки массивов являются циклы. Хотя для обработки массивов можно использовать описанные ранее итерационные циклы, обычно более удобными являются циклы с параметром.

В Турбо Паскале имеются две разновидности циклов с параметром (циклов for):

for <параметр> := < нач.зн.> to <кон.зн.> do <оператор тела цикла>;

for <параметр> := <кон.зн.> downto <нач.зн.> do <оператор тела цикла>;

Параметром цикла for может быть переменная любого порядкового типа.

< нач.зн.> и  <кон.зн.> - выражения того же типа, что и параметр, определяющие границы изменения параметра в данном цикле.

<оператор тела цикла> - любой оператор Турбо Паскаля.

Цикл с параметром (первая его разновидность) выполняется следующим образом: вначале вычисляются < нач.зн.> и < кон.зн.> и осуществляется присваивание параметру цикла < нач.зн.>. Проверяется, не превышает ли параметр значения <кон.зн.> (т.е. выполняется сравнение <параметр> <  <кон.зн.>), и если не превышает, то выполняется тело цикла, после чего параметру присваивается следующее по порядку значение  (т.е. succ(< нач.зн.>)) и цикл повторяется. Если параметр превысил <кон.зн.>, цикл завершается (осуществляется переход к следующему за циклом оператору программы).

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

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

При использовании цикла for желательно, чтобы параметр цикла, выражения  <нач.зн.> и  <кон.зн.> не изменяли свои значения при выполнении тела цикла ( а также <нач.зн.> и  <кон.зн.> не имели зависимости от параметра цикла). Это гарантирует завершение цикла за конечное число шагов и ясную для понимания структуру цикла.

Хотя часто цикл for используют с целочисленным параметром, полезно помнить, что он может быть использован с параметром любого порядкового типа, что придает ему значительно большую гибкость, чем имеют циклы с параметром в других языках (например, в Фортране).  

Проиллюстрируем использование цикла for на примерах.

4. Примеры работы с массивом.

Приведём вначале простую программу на Турбо Паскале, иллюстрирующую обе разновидности цикла for , а также описание массива и создание массива.

program Lat_alphabet;

{Создание массива латинских букв и вывод лат. алфавита}

type m_let = array [1..26] of 'a'..'z';

var letters:m_let; let:char;j:byte;

begin writeln('Латинский алфавит:'); j:=1;

         for let:='a' to 'z' do begin letters[j]:=let; inc(j) end;

         for j:=1 to 26 do write(letters[j], upcase(letters[j]),' ');writeln;

         for j:=26 downto 1 do write(letters[j], upcase(letters[j]),' ');writeln;

end.

Следующая программа на Турбо Паскале иллюстрирует работу с одномерным и двумерным массивом, а также с функцией random (генератором псевдослучайных чисел):

          program test_random;{Тест распределения псевдослучайных чисел}

          uses CRT;

          type dec=0..9; {тип - десятичная цифра}

         var ms:array [dec] of integer; {измерительный массив} i,j:integer;

               matr:array [1..20,1..30] of dec;{генерируемая матрица цифр}

           begin TextBackground(cyan);TextColor(white);ClrScr;

                   writeln(' Матрица пс цифр:');randomize;

       for j:=0 to 9 do {инициация измерительного массива нулями}  ms[j]:=0;

       {заполнение матрицы пс цифрами}

                 for i:=1 to 20 do  for j:=1 to 30 do

             begin matr[i,j]:=random(10); write(matr[i,j],' ');

                   if j=30 then writeln;

         {коррекция элемента массива ms}

                   ms[matr[i,j]]:=ms[matr[i,j]]+1;

             end;  writeln(' Количество пс цифр по значениям:');

                       writeln('   0  1   2   3   4   5   6   7   8   9  ');

   { вывод массива ms}  for i:=0 to 9 do write(ms[i]:4);writeln;

         end { test_random}.


 

А также другие работы, которые могут Вас заинтересовать

48041. НОРМАЛЬНОЙ ФИЗИОЛОГИИ. МЕТОДИЧЕСКИЕ РАЗРАБОТКИ 342.5 KB
  Данное учебное пособие предназначено для студентов стоматологического факультета медицинских ВУЗов для самостоятельной работы на практических занятиях по нормальной физиологии. Задание для самостоятельной работы 1. Цель работы: познакомиться с принципами расчета параметров ПД при различных способах отведения. Ход работы: 1.
48045. Архитектура жилых и общественных зданий 157 KB
  Дипломный проект охватывает комплекс взаимосвязанных вопросов архитектурного проектирования. Постоянно увеличивающийся объем и широкий размах строительства в нашей стране требует очень большого числа специалистов в самых различных областях архитектурного творчества. Однако, как бы ни были разнообразны и актуальны задачи
48047. Методичні вказівки. Програмування 189.5 KB
  В ході самостійної підготовки, що передує курсовій роботі, вивчається лекційний та допоміжний матеріал, проводиться аналіз завдання, виконується розробка алгоритму його вирішення та підготовлюється вихідний текст програми на паперовому та електронному носії
48048. Генетика. Учебно-методическое пособие 505 KB
  Формы взаимодействия аллельных генов. Контролируются одной парой аллельных генов. Форма взаимодействия аллельных генов – полное доминирование. Определите генотипы и фенотипы потомства при условии что форма взаимодействия аллельных генов полное доминирование.
48049. Генетика. Задачник 3.79 MB
  перед генетикой ставятся все более сложные и важные задачи. Знание основных классических положений общей генетики становится потребностью все большего круга специалистов разного профиля. За период прошедший со времени выхода в свет первого издания Задачника 1976 теоретическая и практическая генетика шагнула далеко вперед. Обогатились понятия о сущности гена и его функциях.