Глава 6. Статические и динамические матрицы
Рис. 6.6: Блок-схема задачи 6.1 (ал-
горитм 1).
Рис. 6.7: Блок-схема задачи 6.1 (ал-
горитм 2).
Текст программы:
#include
using namespace s t d ;
i n t main ( )
{
i n t s , i , j , n ,m, a [ 2 0 ] [ 2 0 ] ;
cout<<" N = " ;
c i n >>n ;
cout<<" M = " ;
c i n >>m;
cout<<"Ввод матрицы A "<f o r ( i =0; i f o r ( j =0; j c i n >>a [ i ] [ j ] ;
f o r ( s=i =0; i f o r ( j =0; j //Если элемент лежит выше главной диагонали, то наращиваем сумму.
i f ( j >i ) s+=a [ i ] [ j ] ;
cout<<" S = "<}
На рис. 6.7 изображён ещё один алгоритм решения данной задачи. В нём про-
верка условия i < j не выполняется, но, тем не менее, в нём так же суммируются
элементы матрицы, находящиеся выше главной диагонали. В нулевой строке за-
данной матрицы необходимо сложить все элементы, начиная с первого. В первой
— все, начиная со второго, в i–й строке процесс начнётся с (i + 1)–го элемента
и так далее. Таким образом, внешний цикл работает от 0 до N − 1, а второй от
i + 1 до M . Авторы надеются, что читатель самостоятельно составит программу,
соответствующую описанному алгоритму.
Задача 6.2.
Вычислить количество положительных элементов квадратной мат-
рицы, расположенных по её периметру и на диагоналях. Напомним, что в квад-
ратной матрице число строк равно числу столбцов.
Прежде чем приступить к решению задачи, рассмотрим рисунок 6.8, на ко-
тором изображена схема квадратных матриц различной размерности.
Из условия задачи понятно, что не нужно рассматривать все элементы за-
данной матрицы. Достаточно просмотреть первую и последнюю строки, первый
Программирование на языке С++ в среде Qt Creator
6.3. Обработка матриц в С(С++)
191
Рис. 6.8: Рисунок к задаче 6.2.
и последний столбцы, а так же диагонали. Все эти элементы отмечены на схеме,
причём чёрным цветом выделены элементы, обращение к которым может про-
изойти дважды. Например, элемент с номером (0, 0) принадлежит как к нулевой
строке, так и к нулевому столбцу, а элемент с номером (N − 1, N − 1) находится
в последней строке и последнем столбце одновременно. Кроме того, если N —
число нечётное (на рисунке 6.8 эта матрица расположена слева), то существу-
ет элемент с номером (N/2, N/2), который находится на пересечении главной и
побочной диагоналей. При нечётном значении N (матрица справа на рис. 6.8)
диагонали не пересекаются.
Итак, разобрав подробно постановку задачи, рассмотрим алгоритм её реше-
ния. Для обращения к элементам главной диагонали вспомним, что номера строк
этих элементов всегда равны номерам столбцов. Поэтому, если параметр i изме-
няется циклически от 0 до N − 1, то A[i][i] — элемент главной диагонали.
Воспользовавшись свойством, характерным для элементов побочной диагонали,
получим:
i + j + 1 = N −→ j = N − i − 1,
следовательно, для i = 0, 1, . . . , N − 1 элемент А[i][N-i-1] — элемент побочной
диагонали. Элементы, находящиеся по периметру матрицы записываются сле-
дующим образом: А[0][i] — нулевая строка, А[N-1][i] — последняя строка и
соответственно А[i][0] — нулевой столбец, А[i][N-1] — последний столбец.
Текст программы решения задачи с пояснениями приведён далее.
#include
using namespace s t d ;
i n t main ( )
{
i n t k , i , j , N, a [ 2 0 ] [ 2 0 ] ;
cout<<" N = " ;
c i n >>N;
cout<<"Ввод матрицы A "<© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
192
Do'stlaringiz bilan baham: |