Рассмотрите процедуру, решающую следующую задачу.

Задача. Дана таблица действительных чисел. Сосчитайте сумму всех чисел в таблице.

Procedure Summa(A : MyArray; n, m: integer; Var S: real);

Var

i, j : integer;

Var

i, j, Summa : integer;

Begin

S:= 0;

for i := 1 to n do

for j := 1 to m do

S := S+A[i, j];

End.

Обратите внимание, что внутри цикла со счетчиком i организован цикл со счетчиком j. В результате суммируются в начале числа 1-й строки (i=1, при j=1, 2, ..., m), затем суммируются числа 2-й строки (i=2, при j=1, 2, ..., m) и т. д.

В данной программе в теле одного цикла содержится другой цикл. Такие циклы, как Вы уже знаете, называются вложенными. Причем цикл со счетчиком i является внешним, а цикл со счетчиком j – внутренним. Не забывайте основное правило при написании вложенных циклов: последний оператор внутреннего цикла должен либо предшествовать, либо совпадать с последним оператором внешнего цикла. Вложенные циклы напоминают матрешек, вложенных одна в другую.

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

Задание. Ниже приведен фрагмент решения некоторой задачи. Внимательно рассмотрев решение, сформулируйте решаемую задачу и оформите по всем правилам, применив знания текущего занятия. Файл и листинг решенной задачи покажите учителю для оценки.

НЕ нашли? Не то? Что вы ищете?

. . .

for i := 1 to N do

Begin

M := a[i,1];

S := a[i, 1];

for j := 2 to N do

begin

if M>a[i, j]

Then

M := a[i, j];

S := S+a[i, j];

end;

writeln (i:7, M:6, S:6:3);

End;

. . .

Занятие 2. Работа с элементами массива.

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

Нахождение количества элементов с данным свойством

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

Задача 1. Найти максимальный элемент массива и его индексы.

Так как элементы могут повторяться, то договоримся, что будем запоминать только индексы первого максимального элемента. Опишем процедуру, которой передается массив, и ее результатом является значение максимального элемента и индексы первой встречи такого значения.

Procedure Maximum(X : MyArray; n, m : integer; Var Max, Maxi, Maxj : integer);

Var

i, j : integer;

Begin

Max := X[1, 1]; {Предположим, что максимумом является первый элемент}

Maxi := 1; {в этом случае запомним первую строку}

Maxj := 1; {и первый столбец}

for i := 1 to n do

for j := 1 to m do

if X[i, j] > Max {если среди элементов массива нашелся больший элемент, то}

then

begin

Max := X[i, j];{внесем новое найденное значение в переменную Мах}

Maxi := i; {и не забудем запомнить индексы строки}

Maxj := j; {и столбца этого элемента}

end;

End;

Задача 2. Найти количество отрицательных элементов в каждой строке.

Рассмотрим несколько способов решения этой задачи.

Способ 1 – количество элементов каждой строки хранить в одномерном массиве (Y) соответствующей размерности. Тогда можно описать такую процедуру:

Procedure KolOtr1(X : MyArray2; n, m : integer; Var Y : MyArray1);

Var

i, j : integer;

Begin

for i := 1 to n do

begin

Y[i] := 0; {записываем начальное значение количества элементов в соответствующую столбцу ячейку}

for j := 1 to m do

if X[i, j] < 0 {если отрицательный элемент найден}

then

Inc(Y[i]); {то увеличиваем текущее значение на единицу}

end;

End;

Способ 2 – использовать счетчик, находить количество элементов строки и выводить значение на экран.

Procedure KolOtr2(X : MyArray2; n, m : integer);

Var

i, j, k : integer;

Begin

for i := 1 to n do

begin

k := 0;

for j := 1 to m do

if X[i, j] < 0

then

Inc(k);

writeln(i,' – ', k);

end;

End;

Вопрос. Сравните предложенные способы решения задачи. Какой способ Вам понравился больше и почему?

Определить, отвечает ли заданный массив некоторым требованиям

Задача. Определить, есть ли в заданном массиве элемент, равный 0.

Опишем логическую функцию, значение которой равно истине, если такой элемент есть, и ложь в противном случае. Самый простой способ – это просматривать элементы и, если найден искомый элемент, то присвоить функции значение True, иначе – False.

Function Check1(X : MyArray; n, m : integer) : Boolean;

Var

i, j : integer;

Flag : Boolean;

Begin

Flag := False; {Предполагаем, что искомого элемента в массиве нет}

i := 1;

while not(Flag) and (i<=n) do {элемент не найден и строки не закончились}

begin

j := 1;

while (j<=m) and (X[i, j]<>0) do {перебираем все элементы текущей строки, пропуская ненулевые элементы}

Inc(j);

Flag := not(j=m+1);{если искомый элемент найден, то переменной Flag присваиваем значение True}

Inc(i);

end;

Check1 := Flag;

End;

Задача. Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали.

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

а11

а 12

а 13

а 14

а 15

а 16

а 17

а 21

а 22

а 23

а 24

а 25

а 26

а 27

а 31

а 32

а 33

а 34

а 35

а 36

а 37

а 41

а 42

а 43

а 44

а 45

а 46

а 47

а 51

а 52

а 53

а 54

а 55

а 56

а 57

а 61

а 62

а 63

а 64

а 65

а 66

а 67

а 71

а 72

а 73

а 74

а 75

а 76

а 77

Заметим, что если массив является симметричным, то для него выполняется равенство A[i, j]=A[j, i] для всех i=1, ..., n и j=1, ..., n. Поэтому можно составить следующую функцию:

Function Check2(X : MyArray; n, m : integer) : Boolean;

Var

i, j : integer;

Flag : Boolean;

Begin

Flag := True; {Предполагаем, что матрица симметрична}

i := 2;

while Flag and (i<n) do

begin

j := 1;

while (j<i) and (X[i, j]=X[j, i]) do

Inc(j);

Flag := (j=i);

Inc(i);

end;

Check2 := Flag;

End;

Вопрос. Почему в функции употребляется условие i>j? Можно ли без него обойтись и что при этом изменится?

Изменение значений некоторых элементов, удовлетворяющих заданному свойству

Задача. В массиве размерностью NxM к элементам четных столбцов прибавить элемент первого столбца соответствующей строки.

Procedure Izmenenie1(Var X : MyArray2; n, m : integer);

Var

i, j : integer;

Begin

for i := 1 to n do

for j := 1 to m div 2 do

Inc(X[i, 2*j], X[i, 1]);

End;

Вопрос. Какой смысл вложен в оператор цикла for j := 1 to m div 2 do?

Задача. Заменить все отрицательные элементы на противоположные.

Procedure Izmenenie2(Var X : MyArray2; n, m : integer);

Var

i, j : integer;

Begin

for i := 1 to n do

for j := 1 to m do

X[i, j] := Abs(X[i, j]);

End;

Заполнение массива по правилу

Задача. Заполнить массив А размером NxM "змейкой" следующим образом:

1 2 3 4 5 6 7

8 9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

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

если ряд нечетный, то A[i, j]=(i-1)*m+j;

если ряд четный, то A[i, j]=i*m-j+1.

По этому правилу и составляем процедуру заполнения:

Procedure FillArray(Var X : MyArray2; n, m : integer);

Var

i, j : integer;

Begin

for i := 1 to n do

for j := 1 to m do

if i mod 2 =1

then

A[i, j]=(i-1)*m+j

else

X[i, j]=i*m-j+1;

End;

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

Задачи для самостоятельного решения

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

1. Найти сумму и количество элементов с заданным условием (хранить эти значения в массивах):

1)  элементы каждого столбца, кратные k1 или k2;

2)  элементы каждого столбца, попадающие в промежуток [А..В];

3)  элементы каждого столбца, которые являются простыми числами;

4)  элементы каждого столбца положительны и лежат выше главной диагонали;

5)  отрицательные элементы каждого столбца, меньшие заданного числа а;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70