Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
20.02.2017
Размер:
342.53 Кб
Скачать

Лабораторная работа № 4. Обработка массивов

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

4.1 Массивы и их обработка с помощью циклов

Массив – это структурированный тип данных, состоящий фиксированного числа элементов одного типа.

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

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

Двумерный массив иначе называется матрицей. Элемент двумерного массива имеет два индекса: первый индекс соответствует номеру строки, второй – номеру столбца, в которых находится элемент.

В таблице 4.1 приводятся характеристики вектора Х(4) и матрицы А(3,3).

Таблица 4.1 - Примеры одномерного и двумерного массивов

Имя

Размерность

Номера элементов

Значения элементов

Х

4 (в массиве 4 элемента)

1, х2, х 3, х 4)

(-3.8, 7.6, 2, 4.3),

т.е. х1 = -3.8, х4 = 4.3

А

А(3,3)

(в массиве 9 элементов: 3 строки, 3 столбца)

т.е. а23 = 0; а32 = 4.2

Как и любой другой объект программы, массив должен быть объявлен. Существует два способа описания массива:

- явный - в разделе Type описания типов данных (между Const и Var) задается размерность массива и тип его элементов, затем в разделе Var сформированному типу массива присваивается имя. Например,

Type T = array [1..4] of real;

Var A: T;

{Объявлен массив А, состоящий из}

{четырех вещественных элементов}

Type Z = array[1..3,1..4] of real;

Var В:Z;

{Объявлен вещественный массив B,}

{состоящий из трех строк и четырех столбцов}

- неявный - минуя раздел Type. Например,

Var A: array [1..4] of real;

{Объявлен массив A(4)}

Var B: array [1..3, 1..4] of real;

{Объявлен массив B(3,4)}

Так в языке Паскаль нет возможности вводить и выводить массивы как единый объект, для обработки массивов используются операторы циклов. Ввод и вывод одномерных массивов возможен только поэлементно с помощью оператора цикла:

For i:=1 to 10 do

Read (a[i]);

{ввод вектора А(10) в строку,}

{значения вводятся через пробел}

For i:=1 to 10 do

Readln (a[i]);

{ввод вектора А(10) в столбец, ввод каждого}

{элемента подтверждается клавишей Enter}

For i:=1 to 10 do

Write (a[i]);

{вывод вектора А(10) в одну строку}

For i:=1 to 10 do

Writeln (a[i]);

{вывод вектора А(10) в один столбец}

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

{поэлементный ввод массива А(5,5)}

{поэлементный вывод массива А(5,5)}

For i:=1 to 5 do

For j:=1 to 5 do

Read (a[i,j]);

For i:=1 to 5 do

For j:=1 to 5 do

Write (a[i,j]);

При таком способе организации вывода двумерный массив будет выведен на экране в одну строку. Если же в цикле использовать оператор Writeln (а[i,j]), то массив будет выведен в один столбец. Для того чтобы получить на экране матрицу в ее общепринятом виде, используется следующая организация вывода двумерного массива:

For i:=1 to 4 do

Begin

For j:=1 to 5 do

Write (а[i,j]);

Writeln

End;

Пустой оператор Writeln в данном случае используется для перевода курсора на следующую строку.

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

Как правило, характерные приемы программирования применяют к определенным элементам массивов, а именно: к элементам между заданными номерами строк и столбцов; при выполнении действий с элементами строк и столбцов; к элементам главной диагонали или параллельных ей; элементам побочной диагонали; элементам, расположенным выше и ниже главной диагонали.

Для того чтобы алгоритм был составлен правильно, необходимо хорошо представлять взаимосвязь индексов элементов матрицы (таблица 4.2).

Таблица 4.2 - Взаимосвязь индексов элементов матрицы

Расположение элементов в массиве

Взаимосвязь индексов

строк (i) и столбцов (j)

Примеры организации циклов

для перебора элементов

главная

диагональ

i = j

S:=0;

For i:=1 to n do S:=S+a[i i];

побочная диагональ

(n - порядок матрицы)

i + j = n + 1

P:=1;

For i:=1 to n do P:=P*a[i, n+1-i];

выше

главной диагонали

i < j

k:=0;

For i:=1 to n do

For j:=1 to n do

If i<j {или i>j} then k:=k+1;

ниже

главной диагонали

i > j

Если обработка массива идет построчно, то внешний цикл организуют по i, а внутренний по j, и, наоборот, при переборе элементов матрицы по столбцам внешний цикл организуют по j, а внутренний по i. Кроме того, если работа производится с элементами строк или столбцов, то между операторами открытия вложенных циклов или операторами их закрытия обычно стоит какой-либо оператор, осуществляющий действие со строкой или столбцом.

4.2 Примеры алгоритмов и программ обработки массивов

4.2.1 Найти наибольшее значение вектора Х(5) и его порядковый номер.

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

- задание некоторой промежуточной переменной значения равного значению одного из элементов массива;

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

- если элемент оказывается больше переменной, то ей присваивается значение этого элемента и при необходимости запоминается и его номер;

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

program primer4_1;

type T = array [1..5] of real;

var X:T; max:real;

i, n: integer;

begin

for i :=1 to 5 do

begin

write (’введи x (’, i:2,’)’);

readln (x[i])

end;

max := x[1]; n := 1;

for i :=2 to 5 do

if x[i]>max then

begin

max := x[i]; n := i

end;

writeln(’Наибольший элемент-’, max);

writeln (’его номер-’, n)

end.

Контрольная развертка

Пусть введен массив Х(3, 7, -4, 8, 2). Согласно алгоритму max:=3; n:=1.

i=2 x(2) > max 7 > 3 да max = x(2) = 7; n = i = 2

i=3 x(3) > max -4 > 7 нет max = x(2) = 7; n = i = 2

i=4 x(4) > max 8 > 7 да max = x(4) = 8; n = i = 4

i=5 x(5) > max 2 > 8 нет max = x(4) = 8; n = i = 4

по окончании цикла вывод полученных значений max = 8 и n = 4

Рисунок 4.1 - Нахождение наибольшего элемента в одномерном массиве

4.2.2 Найти среднее арифметическое элементов вектора А(10). Блок-схема и программа решения задачи представлены на рисунке 4.2.

Program primer4_2;

type T = array [1..5] of real;

var A:T; S, SA:real;

i, K: integer;

begin

for i := 1 to 10 do

read (a[i]);

S:=0; K:=0;

for i := 1 to 10 do

if a[i] > 0 then

begin

S:=S + a[i]; K:=K+1

end;

SA=S/K;

writeln (’SA=’, SA:10:2)

end.

Рисунок 4.2 – Пример обработки одномерного массива

      1. Найти количество положительных элементов матрицы А(4,5) среди элементов, расположенных выше главной диагонали.

Блок-схема и программа решения задачи представлены на рисунке 4.3. При решении данной задачи перед открытием циклов, в которых будет осуществляться накапливание количества, необходимо обнулить начальное значение переменной К. Отбор элементов выполняется с использованием сложного условия, т.е. условие выбора положительных элементов массива и условие отбора элементов, расположенных выше главной диагонали, заключены в круглые скобки и объединены с помощью конъюнкции (аnd).

program primer4_3;

type T = array [1..4,1..5]of real;

var A:T; i, j, K: integer;

begin

for i:=1 to 4 do

for j:=1 to 5 do

read (a[i,j]);

K:=0;

for i:=1 to 4 do

for j:=1 to 5 do

if (a[i,j]>0) and (i < j)

then K:=K+1;

writeln (’K=’, K)

end.

Рисунок 4.3 – Пример обработки двумерного массива