Примеры решения задач в двумерном массиве
Циклический сдвиг столбцов. Как и в случае одномерного массива, циклическое смещение столбцов на г позиций заключается в повторении г раз (цикл по переменной ii) смещения на одну позицию. Если было введено число г, превышающее количество столбцов ш, то значение г уменьшается до остатка от деления на ш, так как при повторе смещения столбцов матрицы на одну позицию ровно m раз матрица становится… Читать ещё >
Примеры решения задач в двумерном массиве (реферат, курсовая, диплом, контрольная)
Пример 6.2
Пусть даны массивы MyDArray и MyDKvArray, соответствующие целочисленным матрицам размером п х т (п = 10, т = 8) и п х п (п = 10). Элементами матриц являются случайные числа от 1 до 20.
- 1. Поменять местами строки с номерами k и р матрицы MyDArray и столбцы с номерами q и s массива MyDKvArray.
- 2. Определить количество строк и столбцов матрицы MyDArray, содержащих элементы, кратные трем.
- 3. Определить номера столбцов матрицы MyDArray, в которых имеется хотя бы одна пара идущих подряд одинаковых чисел. В случае отсутствия таких столбцов вывести соответствующее сообщение.
- 4. Нс используя вспомогательных массивов, циклически сдвинуть столбцы матрицы MyDArray на г столбцов вправо.
- 5. Используя вспомогательный массив, упорядочить строки матрицы MyDKvArray по возрастанию количества элементов, больших 15.
- 6. Не используя вспомогательного массива, транспонировать матрицу MyDKvArray.
- 7. Вычислить суммы элементов выше и ниже вторичной диагонали матрицы MyDKvArray.
Программный код заполнения массивов и вывод их на экран приведены в листинге 6.14.
Листинг 6.14
{Заполнение массива MyDArray) for i: = 1 to n do
for j: =1 to m do MyDArray[i, j] :=random (1,20) ;
{Заполнение массива MyDKvArray) for i:=l to n do
for j: =1 to n do MyDKvArray[i, j]: =random (1,20) ;
{Вывод на экран массива MyDArray) for i:=l to n do begin
for j:=1 to m do write (MyDArray[i, j ]: 4); writeln; end;
writeln; writeln;
{Вывод на экран массива MyDKvArray) for i: =1 to n do begin
for j:=1 to n do write (MyDKvArray[i, j]: 4); writeln; end;
writeln; writeln;
1. Перестановка строк и столбцов квадратной матрицы. Для решения первой задачи необходимо запросить у пользователя номера переставляемых строк и столбцов, после чего поэлементно поменять их местами. Программный код решения первой задачи приведен в листинге 6.15.
Листинг 6.15
write ('Введите номер строки к: '); Readln (к);
write ('Введите номер строки р: '); Readln (р);
for j : =1 to ш do begin
tmp:=MyDArray[k, j];
MyDArray[к, j]: =MyDArray[p, j];
MyDArray[p, j]: =tmp; end;
writeln;
write ('Введите номер строки q: '); Read (q); write ('Введите номер строки s: '); Read (s);
for i:=l to n do begin
tmp:=MyDKvArray[i, q];
MyDKvArray[i, q]: =MyDKvArray[i, s]; MyDKvArray[i, s]: =tmp; end;
writeln;
2. Определение строк с элементами, кратными трем. Программный код решения второй задачи приведен в листинге 6.16. Блок-схема алгоритма определения количества строк, в которых есть элементы, кратные трем, приведена на рис. 6.5.
Листинг 6.16
k_str:=0; {Инициализация количества строк} for i:=l to n do for j:=l to m do
if MyDArray[i, j] mod 3 =0 then begin
inc (k_str);
break; {Если имеется хотя бы один элемент, кратный трем, дальше проверять нет смысла}.
end;
writeln ('B матрице MyDArray имеется ', k_str, ' строк, в которых есть числа, кратные 3. ') ;
k_stl:=0; {Инициализация количества столбцов} for j:=1 to m do for i:=1 to n do
if MyDArray[i, j] mod 3 =0 then begin
inc (k_stl);
break; {Если имеется хотя бы один элемент, кратный трем, дальше проверять нет смысла}.
end;
writeln ('B матрице MyDArray имеется ', k_stl, ' столбцов, в которых есть числа, кратные 3. '); writeln;
Рис. 6.5. Блок-схема решения алгоритма второй задачи примера 6.10.
3. Определение столбцов с подряд идущими элементами. При определении столбцов с подряд идущими одинаковыми элементами изначально предполагается, что таких столбцов нет (переменная flag булевского типа инициализируется значением false). Внешний цикл по j пробегает значения индексов столбцов, а внутренний цикл по i пробегает значения индексов строк для текущего столбца j. Если была найдена хотя бы одна пара подряд идущих одинаковых значений, то проверять далее смысла нет. Программный код решения третьей задачи представлен в листинге 6.17.
Листинг 6.17.
flag:=false; for j:=1 to m do
for i:=1 to n-1 do
if MyDArray[i, j] = MyDArray[i+1,j] then begin
writeln ('Подряд идущие одинаковые значения имеются в столбце ', j); flag:=true;
break; {Если имеется хотя бы одна искомая пара, дальше проверять нет смысла. Работа внутреннего цикла прерывается).
end;
if flag=false then writeln ('Столбцов с подряд идущими одинаковыми элементами нет.');
4. Циклический сдвиг столбцов. Как и в случае одномерного массива, циклическое смещение столбцов на г позиций заключается в повторении г раз (цикл по переменной ii) смещения на одну позицию. Если было введено число г, превышающее количество столбцов ш, то значение г уменьшается до остатка от деления на ш, так как при повторе смещения столбцов матрицы на одну позицию ровно m раз матрица становится исходной.
Смещение осуществляется поэлементно по строкам. Программная реализация приведена в листинге 6.18.
Листинг 6.18
write ('Введите количество столбцов смещения: ');
Readln (г);
r:=r mod m;{для случая, когда введенное число превышает число столбцов}.
for ii:=l to г do for i:=l to n do
for j:=m downto 2 do begin
tmp:=MyDArray[i, j];
MyDArray[i, j]: =MyDArray[ i, j -1 ];
MyDArray[i, j-1]: =tmp;
end;
5. Упорядочивание массива no столбцам. Для решения пятой задачи используется вспомогательный одномерный массив Vspom, элементы которого содержат количество элементов в каждой строке массива MyDKvArray, превышающих 15. Затем происходит упорядочивание массива Vspom, но возрастанию и одновременная перестановка строк матрицы MyDKvArray. Программная реализация пятой задачи приведена в листинге 6.19.
Листинг 6.19.
{Заполнение вспомогательного массива, содержащего количество элементов, больших 15}.
for i:=1 to п do begin k: = 0 ;
for j:=1 to n do
if MyDKvArray[i, j]>15 then inc (k);
Vspom[i]: =k;
end;
{Сортировка вспомогательного массива и одновременная перестановка строк исходного массива} for ii:=l to n-1 do for jj:=ii+l to n do begin.
if Vspom[jj].
tmp:=Vspom[j j]; {Перестановка элементов вспомогательного массива}.
Vspom[j j] :=Vspom[i i];
Vspom[ii]: =tmp; for j:=1 to n do.
begin {Перестановка ii-й и jj-й строки матрицы MyDKvArray} tmp:=MyDKvArray[j j, j];
MyDKvArray[j j, j] :=MyDKvArray[i i, j]; MyDKvArray[i i, j] :=tmp; end; end;
Рис. 6.6. Отношения между индексами элементов квадратной матрицы:
а — главная диагональ; 6 — вторичная диагональ.
6. Транспонирование матрицы. 1. Вычисление сумм по отношению к диагоналям. Программный код решения шестой задачи приведен в листинге 6.20, седьмой задачи — в листинге 6.21.
Листинг 6.20
for i:=l to n do for j:=1 to n do if j>i then begin
tmp:=MyDKvArray[i, j];
MyDKvArray[i, j]: =MyDKvArray[ j, i ]; MyDKvArray[j, i]: =tmp; end;
Листинг 6.21.
sl:=0;s2:=0; {Начальные значения сумм}.
for i:=1 to n do for j:=1 to n do begin
if in-j+l then s2:=s2+MyDKvArray[i, j]; end;
writeln ('Сумма элементов выше вторичной диагонали равна ', si);
writeln ('Сумма элементов ниже вторичной диагонали равна ', s2) ;
- [1] Для решения шестой и седьмой задач нужно использовать тот факт, что между индексами элементов, расположенных выше, ниже и непосредственно на главной и вторичной диагоналях матрицы, имеются определенные соотношения:
- [2] индексы элементов, находящихся на главной диагонали, равны, т. е.i=j. У элементов выше главной диагонали i>j. У элементов ниже главной диагонали in+l. В наглядной форме соотношения представлены на рис. 6.6.