ТЕМА: ОБРАБОТКА МНОГОМЕРНЫХ МАССИВОВ

  • docx
  • 26.12.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л3-0025382.docx

ТЕМА: ОБРАБОТКА МНОГОМЕРНЫХ МАССИВОВ

 

Цель работы:

Изучить принципы работы с многомерными массивами на языке программирования Pascal. Получение навыков применения основных алгоритмов для решения задач с использованием массивов.

Оборудование: ПК, ИСР Pascal ABC

 

ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

 

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

 

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

Zavod1:array[1..4] of integer; Zavod2:array[1..4] of integer; Zavod3:array[1..4] of integer;

 

Каждый из приведенных массивов может хранить информацию о количестве продукции, выпущенной одним заводом.

 

Возможно и такое представление: product1:array[1..3] of integer; product2:array[1..3] of integer; product3:array[1..3] of integer; product4:array[1..3] of integer;

Таблица 1

 

Продукт1

Продукт2

Продукт3

Продукт4

Завод1

1500

14000

15

125

Завод2

1380

15600

25

140

Завод3

2500

13000

8

165

 

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

 

Имя:array[нижняя_граница_индекса1..верхняя_граница_индекса1,нижняя_граница_индекса 2..верхняя_граница_индекса2] of тип

где Имя имя массива;

array ключевое слово, показывающее, что объявляемый элемент данных является массивом;


нижняя_граница_индекса1, верхняя_граница_индекса1, нижняя_граница_индекса2, верхняя_граница_индекса2 целые константы, определяющие диапазоны изменения индексов и, следовательно, число элементов массива;

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

Приведенная выше таблица (см. Таблица 1) может быть представлена в виде двумерного массива следующим образом:

Product:array[1..3,1..4] of integer;

 

Чтобы использовать элемент массива, нужно указать имя массива и индексы элемента. Первый индекс обычно соответствует номеру строки таблицы, второй – номеру колонки. Так, элемент product[2,3] содержит число продуктов третьего наименования, выпущенных вторым заводом.

 

Двумерные массивы, в которых диапазоны индексов начинаются с 1, также называются иногда матрицами. Размерность матрицы определяется как M*N, где M – число строк в матрице, N – число столбцов. Если число строк матрицы равняется числу столбцов, то матрицы такого вида называются квадратными.

 

Элементы квадратной матрицы вида B[1,1], B[2,2]< B[3,3] составляют главную диагональ матрицы. Иногда вводят понятие побочной диагонали квадратной матрицы, которую составляют элементы B[1,N], B[2,N-1], B[3,N-2], .. B[N,1], где N – число строк (столбцов) матрицы.

 

Приведем еще примеры описания двумерных массивов в Pascal-программах:

Type MATR=array[1..4,1..5] of integer; Type B= array[2..9,0..6] of real;

Type C= array[-1..4,-1..4] of char.

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

Type VEC= array[1..4] of real; MAS= array[1..5] of vec.

 

В результате приведенного выше описания тип массива MAS будет объявлен как тип двумерного массива, первый индекс которого будет меняться от 1 до 5, а второй индекс – от 1 до 4, т.е. размерность массива составит 5*4 элементов.

 

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

 

 

ПРИМЕРЫ ЗАДАЧ

 

1.     Нахождение наибольшего элемента в заданной строке.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

Рис. 1. Блок-схема программы Пусть задана матрица А из

действительных чисел размера 3х4. Найти наибольший элемент во второй строке данной матрицы. Блок-схема алгоритма


решения данной задачи представлена на Рис. 1

 

 

Program Max_str; Uses crt;

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

Var max:real; a:Matr; i,j:integer; begin

for i:=1 to 3 do for j:=1 to 4 do begin

writeln(‘Введите элемент а[‘,i,’,’,j,’]’);

readln(a[i,j]); end; max:=a[2,1]; for j:=2 to 4 do

if max<a[2,j] then max:=a[2,j]; writeln(‘Наибольший элемент второй строки=’,max:8:2);

end.

 

 

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


2.   Нахождение элементов массива, удовлетворяющих заданному условию.

Известны результаты 5 студентов по итогам экзаменов по химии и информатике. Найти фамилии студентов, сдавших оба экзамена на отлично. Для решения поставленной задачи может быть использована следующая программа (ее блок-схема представлена на рис. 2.

 

 

 


Рис. 2. Блок-схема программы


Program Sessia;

type PR=array [1..5,1..2]of integer; Fam=array[1..5]of string[10];

var r:pr; st:fam; i,j:integer; begin

for i:=1 to 5 do begin

writeln('Введите фамилию ',i,'-го студента');

readln(st[i]);

writeln('Введите        оценку    данного    студента    по химии (от 2 до 5)');

readln(r[i,1]);

writeln('Введите        оценку    данного    студента    по информатике (от 2 до 5)');

readln(r[i,2]); end;

for i:=1 to 5 do

if (r[i,1]=5) and (r[i,2]=5) then writeln('Студент-отличник - ',st[i]); end.

 

В данной программе для хранения фамилий студентов используется одномерный строковый массив st типа Fam, для хранения оценок студентов двумерный целочисленный массив r типа PR, причем первый столбец матрицы r используется для хранения результатов экзамена по химии, второй

столбец экзамена по информатике. Если у некоторого студента оценки за оба экзамена составили 5 баллов, то его фамилия будет выведена на экран с сообщением «Студент- отличник».


3.   Нахождение сумм элементов строк матриц

Рассмотрим задачу нахождения сумм элементов строк матрицы на примере задачи подсчета итогов футбольного чемпионата. Пусть задана таблица результатов игр 5 команд футбольного чемпионата размером 5х5. На диагонали таблицы стоят значения 0, другие элементы таблицы равны 0, 1 или 2, где 0 баллов соответствует проигрышу команды в игре,

1 балл ничьей, 2 балла выигрышу. Определить сумму баллов каждой команды по результатам чемпионата.

Легко заметить, что для построения матрицы R результатов игр достаточно ввести лишь стоящую выше (или ниже) главной диагонали половину матрицы, т.к. результаты остальных игр могут быть рассчитаны из известного соотношения: если, например, первая команда обыграла вторую, то элемент R[1,2]=2, а элемент R[2,1]=2-R[1,2]=0; аналогично, если вторая команда сыграла в ничью с третьей, то R[2,3]=1, R[3,2]=2-R[2,3]=1. Таким образом, нетрудно получить вид взаимосвязи элементов матрицы: R[i,j]+R[j,i]=2, где i и j меняются от 1 до 5 (кроме элементов главной диагонали). На главной диагонали матрицы R по условию задачи всегда стоят числа 0.

Program foot;

Type tab=array[1..5,1..5] of integer;

Var r:tab; i,j,s:integer;

begin

{ввод стоящих выше диагонали элементов матрицы}

for i:=1 to 4 do for j:=i+1 to 5 do begin


 

 

end;


writeln (‘Введите результат игры ‘,i,’–й команды с ’,j,’ –й: 0, 1 или 2 балла’);

readln(r[i,j]);


{заполнение стоящих на диагонали элементов нулями}

for i:=1 to 5 do r[i,i]:=0;

{вычисление стоящих ниже диагонали элементов матрицы}

for i:=2 to 5 do

for j:=1 to i-1 do r[i,j]:=2-r[j,i];

{вывод на экран матрицы результатов игр}

writeln(‘Таблица чемпионата’);

for i:=1 to 5 do begin


 

 

end;


for j:=1 to 5 do write(r[i,j]:4); writeln;


{вычисление сумм элементов строк матрицы}

for i:=1 to 5 do begin


 

 

end; end.


s:=0;

for j:=1 to 5 do s:=s+r[i,j];

writeln(i,‘-ая команда набрала ’,s:3,’ очков’);


ЗАДАНИЯ

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

1.      Известен план выпуска компьютеров и количество выпущенных компьютеров тремя фирмами за шесть месяцев. Определить для каждой фирмы, был ли выполнен план по итогам шести месяцев.

2.      Известно количество сделанных столов тремя фабриками за два квартала. Определить максимальное количество выпущенных столов. В качестве результата вывести месяц, в котором это было, и название фабрики.

3.      Известен план выпуска компьютеров и количество выпущенных компьютеров тремя фирмами за три месяца. Определить, в каком месяце не был выполнен план третьей фирмой.

4.      Известен план выпуска компьютеров и количество выпущенных компьютеров тремя фирмами за шесть месяцев. Определить для каждой фирмы количество месяцев, когда план был перевыполнен.

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

6.      Известно количество выпущенной продукции тремя заводами за первый квартал (помесячно). Найти среднемесячное количество выпущенной продукции для каждого завода.

7.      Известно количество выпущенной продукции тремя заводами за первый квартал (помесячно). Найти среднемесячное количество выпущенной продукции по всем заводам.

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

9.      Известно количество сделанных столов тремя фабриками за два квартала. Определить, какая фабрика выпустила максимальное количество столов по итогам шести месяцев.

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

11.  Известны результаты сдачи двух экзаменов семью студентами. Найти фамилии студентов, не сдавших хотя бы один экзамен.

12.  Известно количество сделанных столов тремя фабриками за два квартала. Определить, какая фабрика выпустила минимальное количество столов по итогам первых трех месяцев.

13.  Известны результаты сдачи трех экзаменов десятью студентами. Найти средний балл каждого студента и общий средний балл. Точность среднего балла два знака после запятой.

14.  Известно количество сделанных столов тремя фабриками за два квартала. Определить, какая фабрика выпустила максимальное количество столов по итогам второго квартала.

15.  Известны результаты сдачи двух экзаменов десятью студентами. Определить фамилии студентов, сдавших экзамены без троек.

 

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

 

 

1.      Что понимают под массивом данных?

2.      Что называют размерностью массива?

3.      Что понимают под индексом элемента массива?

4.      Какой массив называется одномерным?


5.      Приведите примеры одномерных массивов.

6.      Как описываются одномерные массивы на языке PASCAL?

7.      Как задается диапазон изменения индексов массива?

8.      Как обозначаются индексы массивов на языке PASCAL?

9.      Какие стандартные алгоритмы по работе с одномерными массивами Вы

10.  знаете?

11.  Поясните понятия двумерного массива, матрицы.

12.  Что обозначают индексы матрицы?

13.  Сколько элементов в матрице из 7 строк и 9 столбцов?

14.  Дайте понятие квадратной матрицы, диагоналей квадратной матрицы.

15.  Приведите пример описания двумерных массивов на языке PASCAL.

16.  Поясните порядок использования вложенных циклов при вводе элементов

17.  двумерного массива.