Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка вторая.doc
Скачиваний:
88
Добавлен:
05.06.2015
Размер:
1.66 Mб
Скачать

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

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

Задача 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;

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

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

Заметим, что если массив является симметричным, то для него выполняется равенство 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? Можно ли без него обойтись и что при этом изменится?