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


 

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

26693. Неогей 78 KB
  В течение обоих циклов в погружение вовлекались преимущественно северозападные и югозападные зоны Русской плиты которые либо простирались грубо параллельно СевероАтлантическому Грампианскому геосинклинальному поясу отделяясь от него Балтийским щитом обширная палеоБалтийская синеклиза либо примыкали к Средиземноморскому поясу ЛьвовскоКишиневский перикратонный прогиб. В кембрии осушилась его северовосточная часть район Мезенской синеклизы а на западе он распространился в пределы западной части Советской...
26694. Геологическая характеристика и палеогеографические условия осадконакопления отложений девона, карбона и перми Восточно-Европейской платформы. Полезные ископаемые 126 KB
  В пределах ВолгоУральской области с нижневизейскими песчаными толщами связаны месторождения нефти. Месторождения нефти и газа ВЕП связаны как с палеозойскими так и мезозойскими отложениями. Месторождения бурых углей находятся в Подмосковье где они приурочены к низам визейского яруса. В ВолгоУральской антеклизе с отложениями нижнего карбона связаны крупные месторождения углей.
26695. Сибирская платформа: границы и основные структурные элементы. Геологическое строение фундамента. Полезные ископаемые 109 KB
  Некоторая часть пород принадлежит к первичноосадочным компонентам продукты переотложения первичных кор выветривания. Оленёкский выступ представлен нижнепротерозойскими терригенными отложениями метаморфизированными смятыми в пологие складки. В отложениях архея много обломочного кварцевого и глиноземистого материала – источник магматические породы кислого и среднего состава. Главные результаты: впервые вскрыт и детально изучен наиболее полный разрез триасовых и юрских отложений; опровергнуты представления о непрерывном уплотнении...
26696. Алтае-Саянская область: геологическое строение и история развития. Полезные ископаемые 81 KB
  АлтаеСаянская область: геологическое строение и история развития. АлтаеСаянская горная страна охватывает горные сооружения Восточного и Западного Саян Кузнецкого Алатау Горной Шорин и Горного Алтая. Восточный Саян – сложная морфоструктура сформированная на древнейших образованиях АлтаеСаянского региона. Стратиграфия и тектоника Горные породы представлены комплексами скальных вулканогенных образований сосредоточенных в восточной части Алтае – Саянского региона и нескальных осадочных несцементированных грунтов в составе которых по...
26697. Основные тектонические элементы северо-западной части Тихоокеанского подвижного пояса 387 KB
  Основные тектонические элементы северозападной части Тихоокеанского подвижного пояса. Формирование ОхотскоЧукотского вулканоплутонического пояса происходило в раннем мелупалеогене. С вулканитами тесно пространственно и генетически связаны интрузии гранитоидов и более основных пород занимающие до 20 площади пояса. СРЕДИЗЕМНОМОРСКИЙ ПОДВИЖНЫЙ ПОЯС В состав Средиземномосркого подвижного пояса в пределах бывшего Советского Союза входят складчатые сооружения Карпат Горного Крыма Большого и Малого Кавказа Копетдага так называемая...
26698. Кавказское складчатое сооружение 52.5 KB
  Месторождения нефти сосредоточены в основном в Башкортостане Пермской и Оренбургской областях и в Удмуртии природного газа – в Оренбургском газоконденсатном месторождении. Месторождения осадочных сидеритов и связанные c ними бурые железняки Бакальское распространены в западной мегазоне Южного Урала. Для TагильскоMагнитогорской зоны Восточной мегазоны характерны полигенные скарновомагнетитовые месторождения железных руд TагилоKушвинская гуппа Mагнитогорское и др. Kрупные месторождения хромитов Kемпирсайское PайИзское и др.
26699. Кредитный договор 62.49 KB
  Общая характеристика кредитного договора. Заключение кредитного договора и исполнение обязательств по нему. Расторжение кредитного договора...
26700. Строение фундамента ВЕП 119 KB
  Строение фундамента ВЕП Архейские и частично нижнепротерозойские отложения представляют собой толщи первичноосадочных вулканогенноосадочных и вулканогенных пород метаморфизованных в различной степени. Для расчленения пород фундамента важны данные определения абсолютного возраста. Выходы фундамента на поверхность. Рельеф фундамента и современная структура платформы В пределах ВЕП структуры первого порядка выделяются Балтийский и Украинский щиты и Русская плита.
26701. Сибирские траппы 1.13 MB
  Отложения нижнего рифея распространены на востоке платформы в КамскоБельском Пачелмском Ладожском Среднерусском и Московском авлакогенах. Местами в нижнем рифее известны вулканогенные породы: горизонты базальтовых пеплов туфов и покровы базальтов а в западных районах платформы в это время внедрялись габбродиабазовые интрузии. Возможно что первоначально эти отложения имели более широкое площадное распространение а позднее они были частично размыты и сохранились лишь в наиболее прогнутых участках платформы. На западе и в...