Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие_С++.docx
Скачиваний:
88
Добавлен:
11.04.2015
Размер:
842.63 Кб
Скачать

Обработка матриц

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

  1. Алгоритмы реализуются для всех элементов матрицы (просмотр может быть с условием). Начальная установка искомых параметров выполняется перед двойным циклом. В этом случае запись операторов цикла для индексов i и j осуществляется последовательно друг за другом и имеет вид:

<начальная установка искомых параметров>

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

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

<тело цикла>;

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

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

{

<начальная установка искомых параметров>

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

<тело цикла>;

}

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

Реализация алгоритмов задач первого типа

Задача 1. Дана матрица вещественных чисел А = {аij}4х6. Вычислить значение Z = Р1/|Р2|, где Р1 и Р2 – произведения положительных и отрицательных элементов матрицы соответственно.

Решение

Эта задача относится к первому типу, так как для вычисления P1 и P2 следует просмотреть всю матрицу. В этой задаче инициализацию переменных P1 и P2 следует сделать один раз перед циклами по индексам элементов матрицы.

Текст программы:

#include "stdafx.h"

#include<math.h>

int main()

{ float A [4][6] ; // описание матрицы А

int i;

int j;

float P1, P2;

float Z;

printf("Введите матрицу А\n");

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

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

scanf("%f",&A[i][j]);

P1=1; P2=1; // установка начальных значений произведений

for ( i = 0; i<4; i++) //цикл по строкам

for ( j =0; j<6 ;j++) //цикл по столбцам

{

if (A[i][j]>0) P1= P1*A[i][j]; // произведение +

if ( A[i][j]<0) P2 = P2*A[i][j];// произведение -

}

Z=P1/abs(P2);

printf("Z=%10.2f \n",Z);

return 0;

}

Задача 2. В квадратной целочисленной матрице В= {bij}5х5 вычислить модуль разности между числом нулевых элементов, стоящих ниже главной диагонали, и числом нулевых элементов, стоящих выше главной диагонали.

Введем обозначения:

L1 – счетчик нулевых элементов ниже главной диагонали;

L2 – счетчик нулевых элементов выше главной диагонали;

Требуется найти L = | L1 -L2 |.

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

Да

Да

Текст программы:

#include "stdafx.h"

#include<math.h>

#include<stdlib.h>

#include<iostream>

int main()

{

int B[5][5] ; // описание матрицы B

int i, j, L1, L2, L;

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

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

B[i][j]= floor(rand()/1000.0);

L1 = 0; // инициализация счетчиков L1 и L2

L2 = 0;

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

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

if (B[i][j]==0 ) // поиск элементов, равных нулю

{

if ( i>j) L1=L1+1; // выше главной диагонали

if ( i<j) L2=L2+1; // ниже главной диагонали

}

L = abs(L1 - L2);

std::cout<<"L="<<L<<"\n";

return 0;

}

Реализация алгоритмов задач второго типа

Задача 1. В матрице X ={хij}3х6 вещественных чисел первый элемент каждой строки поменять местами с минимальным элементом этой строки. Вывести матрицу X после обмена. ( Для заполнения матрицы воспользуемся датчиком случайных чисел).

НАЧАЛО

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

i = 0, 3

min=106

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

Да

Х[i][j]<min

J = 0, 6

i = 0, 3

min=106

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

Да

Х[i][j]<min

J = 0, 6

i = 0, 3

min=106

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

min=X[i][j]

jmin=j

Да

Х[i][j]<min

J = 0, 6

i = 0, 3

min=106

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

min=X[i][j]

jmin=j

Да

Х[i][j]<min

J = 0, 6

i = 0, 3

min=106

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

min=X[i][j]

jmin=j

Да

Х[i][j]<min

J = 0, 6

i = 0, 3

min=106

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

X[i][jmin]=X[i][0]

X[i][0]=min

min=X[i][j]

jmin=j

Да

Х[i][j]<min

J = 0, 6

i = 0, 3

min=106

НАЧАЛО

Вывод

Матрицы Х

Инициализация матрицы Х

Инициализация матрицы Х

Вывод

Матрицы Х

i = 0, 3

min=106

J = 0, 6

Да

X[i][jmin]=X[i][0]

X[i][0]=min

Х[i][j]<min

Текст программы:

#include "stdafx.h"

#include<math.h>

int main()

{

float X[3][6]; // описание матрицы X

int i,j,jmin;

float min;

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

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

X[i][j]=rand()/100; /* заполнение элемента матрицы случайным числом*/

printf(" матрица X\n");

for(i=0; i<3; i++) //вывод матрицы до перестановки

{

for (j=0; j<6; j++) printf("%8.2f",X[i][j]);

printf("\n");

}

for(i=0; i<3; i++) //цикл по строкам

{

min=+1E6; // установка начального значения min

for (j=0; j<6; j++) //цикл по столбцам

if (X[i][j]<min) // поиск минимума

{

min=X[i][j];

jmin=j;

}

X[i][jmin]=X[i][0];// перестановка первого элемента

X[i][0]=min; // матрицы с наименьшим

}

for(i=0; i<3; i++) //вывод матрицы после перестановки

{

for (j=0; j<6; j++) printf("%8.2f",X[i][j]);

printf("\n");

}

return 0;

}

Задача 2. Дана матрица вещественных чисел С = {сij}8х4. Вычислить среднее арифметическое каждого столбца. Результат оформить в виде одномерного массива S = {sj};j = .

Данная задача

#include "stdafx.h"

int main()

{ float C[8][4];

float S[4];

int i, j;

printf("Введите матрицу С:\n");

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

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

scanf("%f",&C[i][j]);

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

{

S[j]=0; //начальная установка элемента массива для сумм

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

S[j]= S[j] + C[i][j]; //накопление суммы j-го столбца

S[j]=S[j]/8; //вычисление среднего значения суммы j-го столбца

}

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

printf("%8.2f",S[j]); // вывод всех сумм

printf("\n");

return 0;

}

В приведенной выше программе для вычисления каждого элемента S[j] организован двойной цикл, в котором индекс j является внешним параметром цикла, а индекс i - внутренним.

Приведем вариант программы без использования одномерного массива S.

#include "stdafx.h"

#include <iostream>

using namespace std;

int main()

{ float C[8][4];

float S;

int i, j;

printf("Введите матрицу С:\n");

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

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

scanf("%f",&C[i][j]);

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

{

S=0;

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

S= S + C[i][j];

S = S/8;

cout<<"Среднее арифметическое "<<j<<" столбца="<<S<<endln;

}

return 0;

}