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}.


 

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

35817. Аналоговые вольтметры 2.35 MB
  Если сопротивление ключа=0 когда он замкнут и = бесконечности когда разомкнут то на выходе модулятора будет последовательность прямоугольных импульсов с амплитудой входного сигнала при условии что переключение мгновенное. Развертывающий АЦП Сначала ожидание прихода импульса Старт затем обнуляется счетчик импульсов Сч и взводится триггер Т. Максимальное время преобразования tnp mx =T0 2n 1 где Т0 период импульсов генератора; n разрядность АЦП. Следящий АЦП Схема сравнения СС управляет пропуском тактовых импульсов с...
35818. Экономическая теория (микроэкономика, макроэкономика) 1.42 MB
  Функция индивидуального спроса и предложения. Функция спроса и предложения определяет общее направление их изменения в зависимости от цены на товар но индивидуальные различия в характере и форме этого изменения могут быть весьма существенными. Чем более полого выглядит кривая спроса тем сильнее зависимость объема спроса от изменения цены. В случае если кривая спроса занимает горизонтальное положение d4 эта зависимость становится бесконечно большой.
35819. Макроэкономические показатели, их статистические и функциональные взаимосвязи 4.84 MB
  Так как ВВП измеряет объем национального годового производства он служит источником роста национального богатства страны которое представляет собой совокупную стоимость имущества активов принадлежащего частным физическим юридическим лицам а также государству. капитала D косвенные налоги Ткосв Метод добавленной стоимости ДС = В С В выручка С сырье и материалы Поскольку ВВП представляет собой денежную оценку произведенного годового объема производства получатся разные данные в...
35820. Строительные конструкции 4.1 MB
  ; незавершенное производство заготовки полуфабрикаты детали изделия не прошедшие все стадии производства; расходы будущих периодов стоимость расходов производимых в данный период но подлежащих оплате в будущем. Вопрос №1: Вопрос №2: Вариант с длинномерными настилами позволяет при заданной высоте помещения уменьшить общую высоту и объем здания площадь ограждающих конструкций уменьшить расходы на отопление и вентиляцию здания. Расходы на организацию и управление включают накладные расходы. Строительным организациям в качестве типовой...
35823. Будівельні робітники, їх професії, спеціальність, кваліфікація 2.5 MB
  З метою раціонального використання праці будівельників потрібно щоб кожен із них виконував лише ті роботи які властиві його фаху спеціальності та кваліфікації.Калькуляція трудових витрат її призначення методи розрахунку де Нв п норма витрат праці; V обсяг виконаних робіт. Норми витрат праці встановлюють у вигляді норм часу і виробітку. Норма часу Нч це час який встановлено на виготовлення одиниці продукції робітником відповідного фаху і кваліфікації за умов правильної організації праці й виробництва.
35824. Дискретная математика. Тестовые вопросы к экзамену 2.41 MB
  Функции алгебры логики. Булевы функции одной и двух переменных. Функциями алгебры логики или булевыми функциями называются а где б в Множество всех булевых функций от n переменных обозначают а б в г Булева функция существенно зависит от переменной xi если существует такой набор значений...
35825. Економічний аналіз 709.5 KB
  Зміст експлуатаційної фази життєвого циклу проекту. Концепція беззбитковості інвестиційного проекту. Мета завдання та зміст технічного аналізу проекту. Методологія аналізу динамічності проекту.