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


 

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

84384. «Художник-осень» по И. Соколову-Микитову 30 KB
  Золотая осень вырезанные из бумаги листья осины дуба клена; краски Ход урока I Организация класса II Проверка домашнего задания III Мотивация учебной деятельности учащихся Мозговой штурм Прочитайте слова. Кем предстала Осень у поэтессы Маргариты Алигер Осень только взялась за работу...
84385. Де гурт – там і сила. (Німецька народна казка «Бременські музиканти») 48.5 KB
  Мета: удосконалювати навички правильного і виразного читання та навички літературного аналізу твору; вчити дітей працювати в парах; збагачувати словниковий запас учнів; розвивати уміння самостійно працювати з текстом; виховувати почуття товариськості уміння цінувати дружбу.
84386. Невмирущий Кобзар. Тарас Григорович Шевченко – великий народний поет і художник 62 KB
  Ознайомити учнів із творчістю Т. Г. Шевченка, викликати бажання розповідати, слухати вірші, вчити, сприймати зміст поезії на слух та знаходити її відображення в малюнках; розвивати зв’язне мовлення, пам’ять, увагу, вміння виразно читати вірші, збагачувати словниковий запас.
84387. Theatre of the 20th century and beyond 22.06 KB
  The achievements of realism at the end of the 19th century continued to resonate through the turn of the 21st century, but the most influential innovations in early 20th-century theatre came from a vigorous reaction against realism.
84388. Post-modern literature 13.7 KB
  The term Postmodern literature is used to describe certain tendencies in post-World War II literature. It is both a continuation of the experimentation championed by writers of the modernist period (relying heavily, for example, on fragmentation, paradox, questionable narrators, etc.)...
84389. XX Century Literature 22.69 KB
  The lecture introduces the student to British modernism, beginning in the late nineteenth century, and ending with the third decade of the twentieth. We do this by reading fiction, poetry, and some manifestos. Second, we will focus on embodiment: how are body, self, and psyche distinguished for these authors?
84390. 1901-1939 Modernism 17.25 KB
  The movement known as English literary modernism grew out of a general sense of disillusionment with Victorian era attitudes of certainty, conservatism, and objective truth. The movement was greatly influenced by the ideas of Romanticism...
84391. 1940 to the 21st Century 14.67 KB
  Among British writers in the 1940s and 1950s were novelist Graham Greene whose works span the 1930s to the 1980s and poet Dylan Thomas, while Evelyn Waugh, W.H. Auden and T. S. Eliot continued publishing significant work.
84392. Samarkand, near to ruins of ancient capital of Sogdiana (modern Afrasiab) 30.18 KB
  Having united and subordinated the lands between Amu Darya and Syr-Darya, and also Fergana and Shash viloyat, Amir Temur began aggressive campaigns. For 35 years had lasted board of A.Temur (1370 - 1405) in Central Asia.