Работа с одномерными и двумерными массивами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Работа с одномерными и двумерными массивами



 

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

Краткие теоретические сведения

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

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

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

 

Общая форма записи описания массива:

 

Type

<имя типа> = Array [< тип индекса >] of < тип компонента >;

Var

< идентификатор,... >: < имя типа >;

 

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

Var

< идентификатор,... >: Array [< тип индекса> ] of < тип компонента >;

 

Пример:

Type

Klass = (K1, K2, K3, K4);

Znak = Array [1..255] of char;

Var

M1: Znak; {тип Znak предварительно описан в разделе типов}

M2: Array [1..60] of Integer; { прямое описание массива M2 }

M3: Array [1..4] of Klass;

Mas: Array [1..4] of Integer;

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

 

Пример:

Type

Vector = Array[ 1..4] of Integer;

Massiv = Array [1..4] of Vector;

Var

Matr: Massiv;

 

Ту же структуру можно получить, используя другую форму записи:

 

Var

Matr: Array [1..4,1..4] of Integer;

 

Если в такой форме описания массива задан индекс, массив называется одномерным, если два индекса – двумерным, если n индексов – n-мерным. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный – понятию прямоугольной таблицы (матрицы, набору векторов). Размерность ограничена только объемом памяти конкретного компьютера. Одномерные массивы обычно используются для представления векторов, а двумерные – для представления матриц.

 

Пример:

Var

VectorZ: array [1..40] of real; {Одномерный массив из 40 элементов}

MatrU: array [ 1..8, 1..8] of byte; { Двумерный массив 8´8 элементов} Trilf: array [1..4, 1..5, 1..8] of integer; { Трехмерный массив}

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

Const

G1 = 4; G2 = 6;

Var

MasY: Array [1..G1, 1..G2] of real;

 

Элементы массива располагаются в памяти последовательно. Элементы с меньшими значениями индекса хранятся в более низких адресах памяти. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает самым первым.

Например, если имеется массив A: Array [1..5,1..5] of Integer; то в памяти элементы массива будут размещены по возрастанию адресов:

A[1,1]

A[1,2]

...

A[1,5]

A[2,1]

A[2,2]

...

A[5,5]

 

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

Действия над массивами

Для работы с массивом как с единым целым используется идентификатор массива без указания индекса в квадратных скобках. Массив может участвовать только в отношениях “ равно “, “ не равно “ и в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т.е. иметь одинаковые типы индексов и одинаковые типы компонентов. Например, если массивы A и B описаны как

Var

A, B: Array [1..20] of Integer;

 

то применение к ним допустимых операций даст следующий результат:

 

Выражение Результат

A=B Trye, если значение каждого элемента массива А равно соответствующему значению элемента массива В

A<>B True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В

A:=В Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.

Действия над элементами массива.

 

После объявления массива каждый его элемент можно обработать, указав идентификатор (имя) массива и индекс элемента в квадратных скобках. Например, запись Mas[2], Vector[10] позволяет обратиться ко второму элементу массива Mas и десятому элементу массива Vector. При работе с двумерным массивом указываются два индекса, с n-мерным массивом – n индексов. Например, запись Matr[4,4] делает доступным для обработки значение элемента, находящегося в четвертой строке четвертого столбца массива Matr.

Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах for, while, repeat, входить в качестве параметров в операторы Read, Readln, Write, Writeln; им можно присваивать любые значения, соответствующие их типу.

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

 

Var

A, D: array [1..4] of real;

B: array [1..10, 1..15] of integer;

I, J, K: integer;

S: real;

 

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

For I := To 4 Do

A[I]:=0;

Для инициализации двумерного массива обычно используется вложенный оператор For, например:

For I:=1 To 10 Do

For J:=1 To 15 Do

B[I,J]:=0;

В Паскале ввод и вывод элементов массива производится поэлементно. Значения элементам массива можно присвоить с помощью оператора присваивания, однако чаще всего они вводятся с экрана с помощью процедур ввода Read или Readln с использованием оператора организации цикла For:

 

For I:=1 To 4 Do

Readln (A[I]);

 

Аналогично значения двумерного массива вводятся с помощью вложенного оператора For:

For I:=1 To 10 Do

For J:=1 To 15 Do

Readln (B[I,J]);

 

В связи с тем, что использовалась процедура Readln, каждое значение будет вводиться с новой строки. Можно ввести и значения отдельных элементов, а не всего массива. Так, процедурами Read (A[3]); Readln (B[6,9]); вводится значение третьего элемента вектора А и значение элемента, расположенного в шестой строке девятого столбца матрицы В. Оба значения набираются на одной строке экрана, начиная с текущей позиции расположения курсора.

Вывод значений элементов массива выполняется аналогичным образом, но используются процедуры Write или Writeln:

 

For I:=1 To 4 Do

Writeln (A[I]); {вывод значений массива А}

 

или

For I:=1 To 10 Do

For J:=1 To 15 Do

Writeln (B[I,J]); {вывод значений массива В}

 

Копированием массивов называется присваивание значений всех элементов одного массива всем соответствующим элементам другого массива. Копирование можно выполнить одним оператором присваивания, например A:= D; или с помощью оператора For:

For I:=1 To 4 Do

A [I]:= D [I];

В обоих случаях значение элементов массива D не изменяется, а значения элементов массива А становится равными значениями соответствующих элементов массив D. Оба массива должны быть идентичны по структуре.

Иногда требуется осуществить поиск в массиве каких-либо элементов, удовлетворяющих некоторым известным условиям. Пусть, например, надо выяснить, сколько элементов массива А имеют нулевое значение. Введем дополнительную переменную К, которая будет счетчиком таких элементов:

 

К:=0;

For I:=1 To 4 Do

If A[I]=0 Then K:=K+1;

 

После выполнения цикла переменная К будет содержать количество элементов массива А с нулевым значением.

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

 

R:= A[5]; {R – вспомогательная переменная }

A[5]:= A[1];

A[1]:= R;

 

Пример:

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

 

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

 

Var

Massiv: Array [1..10] of Real;

I: Integer;

 

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

 

For I:=1 To 10 Do

Massiv [ I ]:= I*3;

 

Во второй части программы формирование одномерного массива выполним, задавая значение каждого элемента результатом случайной функции Random(I). Для использования этой функции подключим в программу стандартный модуль Crt командой: Uses Crt. Эта часть программы также выполняется циклически, поэтому инициализацию массива зададим циклическим оператором For, в теле которого выполняется получение случайного числа функцией Random(Count), после чего это значение присваивается очередному I-му элементу массива.

 

Randomize;

For I:=1 To 10 Do

Massiv [ I ]:= Random (I);

 

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

 

For I:=1 To 10 Do

Begin

Write (‘ Введите ‘, I, ‘- й элемент массива ‘);

Readln (Massiv [ I ]);

End;

Для того, чтобы просмотреть значения созданного массива, необходимо выводить их на экран. Поскольку это требуется делать три раза, то оформим вывод значений элементов массива в виде отдельной процедуры, которая получает из точки вызова основой программы фактическое значение локальной переменной Msg – сообщение о том, каким способом сформированы значения элементов массива, печатает его на экране и выводит значения всех элементов массива. Текст процедуры может быть записан так:

Procedure Out_Massiv (Msg: String);

Var J: Integer;

Begin

Writeln (Msg);

For J:=1 To 10 Do

Writeln (J, ‘-й элемент массива =’, Massiv [ J ]: 5);

Writeln;

End;

Для вызова процедуры после каждой самостоятельной части программы запишем ее имя, а в качестве фактического параметра-значения укажем текст сообщения, выводимого ею перед печатью значений массива, напрмер:

Out_Massiv (‘ одномерный массив, элементы которого = I*3 ‘).

В целом текст программы будет выглядеть следующим образом:

Program Exp_1;

Uses Crt;

Var Massiv: Array [1..10 ] of Real;

I: Integer;

Procedure Out_Massiv (Msg: String);

Var J: Integer;

Begin Writeln (Msg);

For J:=1 To 10 Do

Writeln (J, ‘-й элемент массива =’, Massiv [ J ]: 5); Writeln;

End;

Begin For I:=1 To 10 Do

Masssiv [ I ]:= I*3;

Out_Massiv (‘ одномерный массив, элементы которого = I*3 ‘);

Randomize;

For I:=1 To 10 Do

Massiv [ I ]:= Random (I);

Out_Massiv (‘ одномерный массив случайных значений функции Random (10) ‘);

For I:=1 To 10 Do

Begin

Write (‘ Введите ‘, I, ‘- й элемент массива ‘);

Readln (Massiv [ I ]);

End;

Out_Massiv (‘ одномерный массив, введенный с клавиатуры ‘);

End.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-09; просмотров: 335; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.240.142 (0.069 с.)