Материал: z9411_КафкаРС_лр_9_fixed3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Решение задачи вариант Б:

Б. В заданной квадратной матрице размера 2n*2n найти среднее арифметическое значений отрицательных элементов области 6 (см. рисунок).

Математическая модель решения

Решение задачи начинается с ввода исходных данных. Из формулировки задачи понятно, что исходная матрица квадратная с чётным числом (2n) строк и столбцов. Следовательно, прежде всего, необходимо ввести значение (n) половины размера квадратной матрицы.

После этого необходимо задать значения всех элементов матрицы. Доступ к элементам двумерного массива (матрицы) осуществляется по двум индексам: номеру строки и номеру столбца, на пересечении которых находится данный элемент массива (нумерация строк и столбцов начинается с 0). Поэтому перебираем все строки (с 0-ой до 2n-1). Внутри каждой строки перебираем все столбцы (с 0-ого до 2n-1) и задаём значения элементов, лежащих на пересечении строки и столбца с текущими номерами.

Пусть в качестве примера исходная матрица имеет вид (n=5):

0

1

n-1

n

2n-2

2n-1

0

-0

-1

-2

-3

-4

-5

-6

-7

-8

-9

1

-10

-11

-12

-13

-14

-15

-16

-17

-18

-19

-20

-21

-22

-23

-24

-25

-26

-27

-28

-29

-30

-31

-32

-33

-34

-35

-36

-37

-38

-39

n-1

-40

-41

-42

-43

-44

-45

-46

-47

-48

-49

n

-50

-51

-52

-53

-54

-55

-56

-57

-58

-59

-60

-61

-62

-63

-64

-65

-66

-67

-68

-69

-70

-71

-72

-73

-74

-75

-76

-77

-78

-79

2n-2

-80

-81

-82

-83

-84

-85

-86

-87

-88

-89

2n-1

-90

-91

-92

-93

-94

-95

-96

-97

-98

-99

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

Поэтому в нахождении участвуют значения элементов строк с 0 до n-1 и элементы столбцов ниже побочной диагонали с n до 2n-2. Если значение элемента попадает в нужную область, то мы прибавляем его в общее значение суммы (sum) и увеличиваем счётчик элементов (count) на 1. Таким образом у нас получится общая сумма (sum), которую нужно поделить на количество (счётчик) этих элементов (count) и получится среднее значение (avg).

Задача решена.

Схема алгоритма нахождения среднего арифметическое значений отрицательных элементов области 6

Текст программы (вариант Б)

/*Массивы динамические двумерные.

В заданной квадратной матрице размера 2n*2n

найти среднее арифметическое значений

отрицательных элементов области 6 (см. рисунок).*/

#include<iostream>

#include<locale.h>

using namespace std;

typedef int telem; //определение типа элементов массива

typedef telem *tstr; //определение типа "указатель на telem"

typedef tstr *tmatr; //тип "указатель на указатель на telem"

void fillArray(tmatr, int);

void showArray(tmatr, int);

double calcArithmeticMean(tmatr arr, int n);

int main()

{

int n; //число строк (столбцов) матрицы

double avg;

tmatr arr; //переменная-указатель на указатель на telem

setlocale(LC_ALL, "Russian");

cout << " В заданной квадратной матрице размера 2n*2n \n";

cout << " найти среднее арифметическое значений \n";

cout << " отрицательных элементов области 6. \n";

cout << " Введите половину размера матрицы: n = ";

cin >> n;

arr = new tstr[2 * n]; /*выделение динамической памяти под массив

указателей на строки массива*/

for (int i = 0; i < 2 * n; i++) //выделение памяти под каждую строку:

*(arr + i) = new telem[2 * n]; /*каждому элементу массива указателей

на строки присваивается адрес начала

области памяти, выделяемой под строку*/

fillArray(arr, 2 * n);

cout << " Исходная матрица:\n";

showArray(arr, 2 * n);

avg = calcArithmeticMean(arr, n);

cout << " Среднее арифметическое значений отрицательных элементов:\n";

cout << avg << endl;

cout << endl << " Для завершения нажмите <Enter>";

//Освобождение динамической памяти

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

delete *(arr + i);

delete[]arr;

return 0;

}

void fillArray(tmatr arr, int n)

{

cout << " Значения элементов";

cout << " массива размера " << n << "x" << n;

cout << "\n при тестировании вводятся автоматически:" << endl;

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

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

*(*(arr + i) + j) = -(10 * i + j);

}

void showArray(tmatr arr, int n)

{

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

{

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

{

cout.width(3); //ширина поля выводимого параметра

cout << *(*(arr + i) + j) << ' ';

}

cout << '\n';

}

}

double calcArithmeticMean(tmatr arr, int n)

{

telem sum = 0;

double avg;

int count = 0;

for (int i = n; i < n * 2; i++)

{

for (int j = (n * 2) - i; j < n; j++)

{

if (*(*(arr + i) + j) < 0) {

count++; //Счётчик увеличиваем на 1

sum += *(*(arr + i) + j); //Сумму увеличиваем на значение элемента

}

}

}

avg = sum * 1. / count;

return avg;

}

}Скриншот результатов выполнения программы (вариант Б)

Источник: https://studfile.net/preview/16575267/