Решение задачи вариант Б:
Б. В заданной квадратной матрице размера 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;
}
}Скриншот результатов выполнения программы (вариант Б)