Как составить блок схему для матрицы

В С++ определены и двумерные массивы (матрицы), например матрица A, состоящая из 4 строк и 5 столбцов..

A=

6

−9

7

13

19

5

8

3

8

22

553

777

8888

3733

6171

Двумерный массив (матрицу) можно объявить так:

тип имя_переменной [n][m];

где n – количество строк в матрице(строки нумеруются от 0 до n-1), m – количество столбцов (столбцы нумеруются от 0 до m-1).

Например,

int x[10][15];

Описана матрица x, состоящая из 10 строк и 15 столбцов (строки

нумеруются от 0 до 9, столбцы от 0 до 14).

Для обращения к элементу матрицы необходимо указать ее имя, и в квадратных скобках номер строки, а затем в квадратных скобках – номер столбца. Например, x[2][4] – элемент матрицы x, находящийся в третьей строке и

пятом столбце.

В С++ можно описать многомерные массивы, которые можно объявить с

помощью оператора следующей структуры:

тип имя_переменной [n1][n2]…[nk];

6.1. Блок-схемы основных алгоритмов обработки матриц

Блок-схема ввода матрицы представлена на рис. 6.1

i=0,N-1

j=0,M-1

Ввод Аij

Рис 6.1. Ввод матрицы

C использованием функций printf и scanf ввод матрицы можно

реализовать следующим образом.

printf(«N=»); scanf(«%d»,&N); printf(«M=»); scanf(«%d»,&M); printf(«n Vvedite A n»); for(i=0;i<N;i++)

1

for(j=0;j<M;j++)

{

scanf(«%f»,&b);

a[i][j]=b;

}

C использованием cin и cout ввод матрицы можно реализовать следующим

образом.

cout<<«N=»; cin>>N; cout<<«M=»; cin>>M; cout<<«n Vvedite A n»; for(i=0;i<N;i++)

for(j=0;j<M;j++)

cin>>a[i][j];

Блок-схема вывода матрицы представлена на рис. 6.2

i=0,N-1

j=0,M-1

Вывод

Аij

Вывод

(“n”)

Рис 6.2. Вывод матрицы

C использованием функций printf и scanf построчный вывод матрицы

можно реализовать следующим образом. printf(«n Matrica An»);

for(i=0;i<N;i++)

{for(j=0;j<M;j++)

printf(«%ft»,a[i][j]);

printf(«n»);}

C использованием cin и cout построчный вывод матрицы можно реализовать

следующим образом. cout<<«n Matrica An»;

for(i=0;i<N;cout<<endl,i++)

for(j=0;j<M;j++)

cout<<«t»<<a[i][j]);

2

На рис. 6.3 представлена программа ввода-вывода матрицы т результаты ее работы.

Рис 6.3. Результаты работы программы ввода матрицы и ее вывода

Вначале в качестве максимального элемента запоминается первый элемент матрицы A[0][0], номер строки imaх=0, jmax=0. Затем организуется цикл прохода по матрице, где каждый элемент сравнивается со значением max, и если

3

оказывается больше, то его значение запоминается как новое значение max, и

также запоминаются его индексы. Блок-схема алгоритма представлена на рис. 6.4.

max=A[0][0]

imax=0

jmax=0

i=0;i<n;i++

j=0;j<m;j++

max, imax,

jmax

A[i][j]>max

+

max=A[i][j]

imax=i

jmax=j

Рис 6.4. Поиск максимального элемента матрицы и его индексов

Программа поиска максимального элемента и его номера представлена

ниже.

float a[20][20];

int i,j,n,m, imax, jmax; float max;

// ввод матрицы

max=a[0][0]; imax=0; jmax=0; for(i=0;i<n;i++)

for(j=0;j<m;j++)

if (a[i][j]<max)

{

max=a[i][j];

imax=i;

jmax=j;

}

printf(«nmax=%fn»,max);

printf(«nimax=%dn»,imax);

printf(«njmax=%dn»,jmax);

4

Перед рассмотрением других алгоритмов, давайте вспомним некоторые свойства матриц (см. рис. 6.5):

если номер строки элемента совпадает с номером столбца (i = j), это означает что элемент лежит на главной диагонали матрицы;

если номер строки превышает номер столбца (i > j), то элемент находится ниже главной диагонали;

если номер столбца больше номера строки (i < j), то элемент находится выше главной диагонали.

элемент лежит на побочной диагонали квадратной матрицы , если его

индексы удовлетворяют равенству i + j +1 = n;

неравенство i + j + 1 < n характерно для элемента находящегося выше побочной диагонали квадратной матрицы;

соответственно, элементу квадратной матрицы, лежащему ниже

побочной диагонали соответствует выражение i + j + 1 > n.

Рис 6.5. Соотношение индексов у квадратной матрицы Вспомним из курса высшей математики некоторые типы квадратных матриц:

матрица называется единичной, если все элементы нули, а на главной диагонали единицы;

матрица называется диагональной, если все элементы нули, кроме

главной диагонали;

матрица нулевая, если все элементы нули;

матрица называется верхнетреугольной, если все элементы ниже

главной диагонали нули; матрица называется нижнетреугольной, если все элементы выше

главной диагонали нули;

матрица называется симметричной, если A= AT .

Для проверки, что матрица В является обратной матрице А, нужно проверить условие А× В=Е (Е – единичная матрица).

Дальнейшие алгоритмы работы с матрицами рассмотрим на примерах решения задач.

ЗАДАЧА 6.1. Найти сумму элементов матрицы, лежащих выше главной диагонали.

5

Блок-схема решения задачи представлена на рис. 6.6.

S=0, i=0;i<N;i++

j=0;i<M;j++

Вывод S

i < j

+

S += A[i][j]

Рис.6.6. Блок-схема задачи 6.1.

int main()

{int S,i,j,N,M,a[20][20];

cout<<«N=»;cin>>N;

cout<<«M=»;cin>>M;

cout<<«Input Matrix A»<<endl;

6

for(i=0;i<N;i++)

for(j=0;j<M;j++)

cin>>a[i][j];

for(S=i=0;i<N;i++)

for(j=0;j<M;j++)

if (j>i) S+=a[i][j]; cout<<«S=»<<S<<endl;}

На рис.6.7 приведен второй алгоритм решения задачи.

S=0, i=0;i<N;i++

j=i+1;j<M;j++

ВыводS

S += A[i][j]

Рис 6.7. Второй вариант решения задачи 7.1 ЗАДАЧА 6.2. Вычислить количество положительных элементов квадратной

матрицы, расположенных по ее периметру и на диагоналях. Блок-схема решения приведена на рис.6.7.

Матрица из N строк и N столбцов

Из соотношения индексов на побочной диагонали i + j+ 1= n находим j = n- i-1

7

Рис 6.7. Блок-схема к примеру 6.2

8

#include <iostream> using namespace std; int main()

{int k,i,j,N,a[20][20]; cout<<«N=»;cin>>N; cout<<«Input Matrix A»<<endl; for(i=0;i<N;i++) for(j=0;j<N;j++) cin>>a[i][j];

//цикл прохода по главной и побочной диагоналям for(i=k=0;i<N;i++)

{ if(a[i][i]>0)k++; if(a[i][N-i-1]>0)k++;}

//цикл прохода по первой и последней строках матрицы, //по первому и последнему столбцам, //за исключением крайних элементов for(i=1;i<N-1;i++)

{if(a[0][i]>0)k++; if(a[N-1][i]>0)k++; if(a[i][0]>0)k++; if(a[i][N-1]>0)k++;}

//проверка, пересекаются ли диагонали, когда размерность //матрицы – нечетное число

if ((N%2!=0)&&(a[N/2][N/2]>0))k—; cout<<«k=»<<k<<endl;}

ЗАДАЧА 6.3. Проверить, является ли заданная квадратная матрица единичной. Единичной называют матрицу, у которой элементы главной диагонали –

единицы, а все остальные – нули.

#include <iostream> using namespace std; int main()

{int pr,i,j,N,a[20][20]; cout<<«N=»;cin>>N;cout<<«Input Matrix A»<<endl; for(i=0;i<N;i++)

for(j=0;j<N;j++)

cin>>a[i][j];

//Предполаем, что матрица — единичная, pr=1. for(pr=1,i=0;i<N;i++)

for(j=0;j<N;j++)

//Если элемент лежит на главной диагонали и это не 1, //или элемент вне главной диагонали и это не 0, то // матрица не единичная, pr=0.

if (((i==j) && (a[i][j]!=1)) || ((i!=j) && (a[i][j]!=0))) { pr=0; break; }

if (pr) cout<<«Единичная матрицаn»;

else cout<<«Матрица не является единичнойn»;}

9

ЗАДАЧА 6.4. Поменять местами элементы главной и побочной диагонали матрицы A(k,k). Алгоритм сводится к обмену элементов на главной и побочной

диагоналях в каждой строке, его блок-схема приведена на рис.6.8.

#include <iostream> using namespace std; int main()

{

int i,j,k;

double b,a[20][20]; cout<<«k=»; cin>>k;

cout<<«Input Matrix A»<<endl; for(i=0;i<k;i++)

for(j=0;j<k;j++)

cin>>a[i][j];

for(i=0;i<k;i++)

{

b=a[i][i]; a[i][i]=a[i][k-1-i]; a[i][k-1-i]=b;}

cout<<«Output Matrix A»<<endl; for(i=0;i<k;cout<<endl,i++)

for(j=0;j<k;j++)

cout<<a[i][j]<<«t»;

}

i = 0; i<k; i++

b = a[i][i] a[i][i]=a[i][k-i-1] a[i][k-i-1]=b

Рис 6.8. Блок-схема к примеру 6.4

ЗАДАЧА 6.5. Преобразовать исходную матрицу A(N,M) так, чтобы нулевой элемент каждой строки был заменен средним арифметическим элементов этой

10

строки. Необходимо в каждой строке матрицы найти сумму элементов, разделить на количество элементов в строке и полученный результат записать в первый элемент строки. Блок-схема изображена на рис.6.9.

i = 0; i<N; i++

S = 0

j =0; j<M;j++

S = S + A[i][j]

Рис 6.9. Блок-схема к примеру 6.5

#include <iostream> using namespace std; int main()

{int i,j,N,M; double S,a[20][20];

cout<<«N=»; cin>>N; cout<<«M=»; cin>>M; cout<<«Input Matrix A»<<endl; for(i=0;i<N;i++)

for(j=0;j<M;j++)

cin>>a[i][j];

for(i=0;i<N;a[i][0]=S/M,i++) for(S=j=0;j<M;j++) S+=a[i][j];

cout<<«Output Matrix A»<<endl; for(i=0;i<N;cout<<endl,i++) for(j=0;j<M;j++) cout<<a[i][j]<<«t»;}

ЗАДАЧА 6.6. Преобразовать матрицу A(m,n) так, чтобы строки с нечетными индексами были упорядочены по убыванию, c четными – по возрастанию. Перебираем все строки, если номер строки четный, то то упорядочиваем эту

11

строку по возрастанию методом пузырька, иначе — по убыванию методом

пузырька. Блок-схема решения задачи приведена на рис.6.10.

i =0; i<M; i++

+

i % 2 = 0

k=1; k<N; k++

k = 1; k< N ;k++

j =0; j<N–k; j++

j =0; j<N–k; j++

A[i][j]>A[i][j+1]

A[i][j]<A[i][j+1]

+

+

B = A[i][j]

B = A[i][j]

A[i][j] = A[i][j+1]

A[i][j] = A[i][j+1]

A[i][j+1] = B

A[i][j+1] = B

Рис 6.10. Блок-схема к примеру 6.6

#include <iostream>

using namespace std;

int main()

{int i,j,k,N,M;

double b,a[20][20];

cout<<«M=»;cin>>M;

cout<<«N=»;cin>>N;

12

Соседние файлы в папке C++

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Студворк — интернет-сервис помощи студентам

C++
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
#include <iostream>
#include <ctime>
using namespace std;
 
int Determinant(int array[3][3], int size)
{
     return array[0][0] * (array[1][1] * array[2][2] - array[1][2] * array[2][1])  //нахождение определителя по минорам квадратичной матрицы
     - array[0][1] * (array[1][0] * array[2][2] - array[1][2] * array[2][0]) 
     + array[0][2] * (array[1][0] * array[2][1] - array[1][1] * array[2][0]);
}
 
int main()
{
    srand(time(0));                                                                //для генерации новых матриц
    int array[3][3];
    int size = 3;
    for(int i=0; i<size; i++)                                                      //перебираем элементы строк i
        for(int j=0; j<size; j++)                                                  //перебираем элементы столбцов j
            array[i][j] = rand() % 10;                                             //генерируем случайные числа в матрице
    for(int i=0; i<size; i++)
    {
        for(int j=0; j<size; j++)
        {
            cout << "    " << array[i][j];
        }
        cout << endl;
    }
    cout << "Determinant: " << Determinant(array, size);
    cout << endl;
    system("pause");                                                               //для открытого консольного окна
    return 0;
}

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

Задача 6.12. Найти определитель квадратной матрицы A(N,N).

Блок-схема алгоритма вычисления обратной матрицы

Рис.
6.15.
Блок-схема алгоритма вычисления обратной матрицы

Пусть задана матрица (6.2), необходимо вычислить её определитель. Для этого матрицу необходимо преобразовать к треугольному виду (6.3), а затем воспользоваться свойством, известным из курса линейной алгебры, которое гласит, что определитель треугольной матрицы равен произведению её диагональных элементов: det A=prodlimits_{i=0}^{n-1}a_{ii}.

Преобразование матрицы (6.2) к виду (6.3) можно осуществить с помощью прямого хода метода Гаусса. Алгоритм вычисления определителя матрицы, изображённый в виде блок-схемы на рис. 6.16, представляет собой алгоритм прямого хода метода Гаусса, в процессе выполнения которого проводится перестановка строк матрицы. Эта операция приводит к смене знака определителя. В блок- схеме момент смены знака отражён в блоках 8–9. В блоке 8 определяется, будут ли строки меняться местами, и если ответ утвердительный, то в блоке 9 происходит смена знака определителя. В блоках 15–16 выполняется непосредственное вычисление определителя путём перемножения диагональных элементов преобразованной матрицы.

На листинге приведён текст программы решения задачи 6.12 с комментариями.

#include <iostream>
#include <math.h>
using namespace std;
//Функция вычисления определителя.
double determinant ( double ** matrica_a, int n )
//Формальные параметры: matrica_a — исходная матрица, n — размер матрицы,
//функция возвращает значение определителя (тип double.)
{
	int i, j, k, r;
	double c,M, max, s, det =1;
	//a — копия исходной матрицы.
	double **a;
	//Выделение памяти для матрицы a .
	a=new double * [ n ];
	for ( i =0; i<n; i++)
		a [ i ]=new double [ n ];
	//В a записываем копию исходной матрицы.
	for ( i =0; i<n; i++)
		for ( j =0; j<n; j++)
			a [ i ] [ j ]=matrica_a [ i ] [ j ];
	//Прямой ход метода Гаусса.
	for ( k=0;k<n; k++)
	{
		max=fabs ( a [ k ] [ k ] );
		r=k;
		for ( i=k+1; i<n; i++)
			if ( fabs ( a [ i ] [ k ] )>max)
			{
				max=fabs ( a [ i ] [ k ] );
				r= i;
			}
		//Если строки менялись местами, то смена знака определителя.
		if ( r !=k ) det=-det;
		for ( j =0; j<n; j++)
		{
			c=a [ k ] [ j ];
			a [ k ] [ j ]=a [ r ] [ j ];
			a [ r ] [ j ]= c;
		}
		for ( i=k+1; i<n; i++)
			for (M=a [ i ] [ k ] / a [ k ] [ k ], j=k; j<n; j++)
				a [ i ] [ j ]-=M*a [ k ] [ j ];
	}
	//Вычисление определителя.
	for ( i =0; i<n; i++)
		det*=a [ i ] [ i ];
	//Возврат определителя в качестве результата функции
	for ( i =0; i<n; i++)
		delete [ ] a [ i ];
	delete [ ] a;
	return det;
}
int main ( )
{
	int result, i, j,N;
	double **a, b;
	cout<<" N = ";
	cin>>N;
	a=new double _ [N ];
	for ( i =0; i<N; i++)
		a [ i ]=new double [N ];
	//Ввод значений исходной матрицы.
	cout<<"Ввод матрицы A "<<endl;
	for ( i =0; i<N; i++)
		for ( j =0; j<N; j++)
			cin>>a [ i ] [ j ];
	//Обращение к функции вычисления определителя.
	cout<<"определитель= "<<determinant ( a,N)<<endl;
}

Блок-схема алгоритма вычисления определителя

Рис.
6.16.
Блок-схема алгоритма вычисления определителя

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

Матрица — это двумерный массив, каждый элемент которого имеет два индекса: номер строки и номер столбца, поэтому для работы с элементами матрицы необходимо использовать два цикла. Если значениями параметра первого цикла будут номера строк матрицы, то значениями параметрами второго — столбцы (или наоборот). Обработка матрицы заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т.д. до последней.

Перед тем, как приступить к изучению алгоритмов обработки матриц, давайте рассмотрим, как описываются матрицы в C++. Двумерный массив можно объявить так:

тип имя_переменной [n] [m];

Здесь тип определяет тип элементов массива, имя_переменной — имя матрицы, n — количество строк, m — количество столбцов. Строки нумеруются от 0 до n-1, столбцы от 0 до m-1.

Например int h[10] [15];

Выше матрица целых чисел h, состоящая из 10 строк и 15 столбцов (строки нумеруются от 0 до 9, столбцы от 0 до 14).

Для обращения к элементу матрицы необходимо указать ее имя и в квадратных скобках номер строки, затем номер столбца. Например, h[2] [5].

Ввод-вывод матриц

Матрицы, как и одномерные массивы, нужно вводить (выводить) поэлементно. Блок-схема ввода элементов матрицы A[n] [m] изображена ниже:

Ввод элементов матрицы

Код программы на Visual C++ вода-вывода матрицы будет иметь примерно такой вид:

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int i,j,N,M,a[20][20];
cout<<"N="; //ввод количества строк
cin>>N;
cout<<"M="; //ввод количества столбцов
cin>>M;
cout<<"Input matrix A n";
//цикл по переменной i, в которой перебираем строки матрицы
for (i=0; i<N; i++)
//цикл по переменной j, в котором перебираем элементы внутри строки
for (j=0; j<M; j++)
cin>>a[i][j]; //ввод очередного элемента матрицы
cout<<"matrix A n";
for (i=0; i<N; i++)
{
//цикл по переменной i, в котором перебираем строки матрицы
for (j=0; j<M; j++)
cout<<a[i][j]<<"t"; //вывод очередного элемента матрицы
cout<<endl; //переход на новую строку после вывода всех элементов строки
}
system("pause");
return 0;
}

Результат работы программы:

Теперь, давайте рассмотрим некоторые свойства матриц:

  • если номер строки элемента совпадает с номером столбца (i = j), это означает , что элемент лежит на главной диагонали матрицы;
  • если номер строки превышает номер столбца (i > j), то элемент находиться ниже главной диагонали;
  • если номер столбца больше номера строки (i < j), то элемент находиться выше главной диагонали;
  • элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i+j+1=n;
  • неравенство i+j+1<n характерно для элемента, находящегося выше побочной диагонали;
  • соответственно, элементу, лежащему ниже побочной диагонали, соответствует выражение i+j+1>n.

Примеры задач обработки матриц

Задача 1

Найти сумму элементов матрицы, лежащих выше главной диагонали (рис. ниже)

Элементы матрицы выше главной диагонали

Алгоритм решения данной задачи можно построить следующим образом: обнулить ячейку для накапливания суммы (переменная S). Затем с помощью двух циклов просмотреть каждый элемент матрицы, суммировать элементы при условии, что элемент находиться выше главной диагонали. Текст решения задачи:

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int S, i, j, N, M, a[20][20];
cout<<"N="; cin>>N;
cout<<"M="; cin>>M;
cout<<"Введите матрицу А n";
for (i=0; i<N; i++)
for (j=0; j<M; j++)
cin>>a[i][j];
for (S=i=0; i<N; i++)
for (j=0; j<M; j++)
//если элемент лежит выше главной диагонали, то наращиваем сумму
if (j>i) S+=a[i][j];
cout<<"S="<<S<<endl;
system("pause");
return 0;
}
Задача 2

Проверить, является ли заданная квадратная матрица единичной. Единичной называют матрицу, у которой элементы главной диагонали — единицы, а все остальные — нули. Например:

Единицы на главной диагонали

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

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int pr, i, j, N, a[20][20];
cout<<"N="; cin>>N;
cout<<"Введите матрицу А n";
for (i=0; i<N; i++)
for (j=0; j<N; j++)
cin>>a[i][j];
//предположим, что матрица единичная, и присвоем переменной pr значение 1
//если значение этой переменной при выходе из цикла не измениться,
//это будет означать, что матрица действительно единичная
for (pr=1, i=0; i<N; i++)
for (j=0; j<N; j++)
if (((i==j) && (a[i][j]!=1)) || ((i!=j) && (a[i][j]!=0)))
//если элемент лежит на главной диагонали и не равен единице или
//элемент лежит вне главной диагонали и не равен нулю, то
{
//переменной pr присвоить значение 0, это будет означать, что
//матрица единичной не является, и выйти из цикла.
pr=0;
break;
}
//проверка значения переменной pr и вывод соответствующего сообщения
if (pr) cout<<"Single matrix"<<endl;
else cout<<"No single matrix"<<endl;
system("pause");
return 0;
}
Задача 3

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

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

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
setlocale (LC_ALL, "RUS");
int i, j, N, M;
double S, a[20][20];
cout<<"N="; cin>>N;
cout<<"M="; cin>>M;
cout<<"Введите матрицу А n";
for (i=0; i<N; i++)
for (j=0; j<M; j++)
cin>>a[i][j];
for (i=0; i<N; a[i][0]=S/M, i++)
//цикл по i завершается записью среднего значения в нулевой элемент
//строки и наращиванием i
for (S=j=0; j<M; j++)
//вычисление суммы жлементов строки
S+=a[i][j];
cout<<"выход матрицы A"<<endl;
for (i=0; i<N; cout<<endl, i++)
for (j=0; j<M; j++)
cout<<a[i][j]<<endl;
system("pause");
return 0;
}

( 2 оценки, среднее 5 из 5 )

Понравилась статья? Поделить с друзьями:
  • Как исправить декларацию в личном кабинете налогоплательщика для физических лиц
  • Как найти мумию в террарии
  • Как правильно составить формулу в excel для подсчета
  • Как найти школу по номеру телефона
  • Как найти свой забытый пароль