Консультация № 189281
27.04.2016, 18:36
0.00 руб.
28.04.2016, 12:47
0 9 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Задание: Найти среднее арифметическое положительных элементов главной и побочной
диагоналей матрицы действительных чисел А(5Х5).


Код:
#define n 5 
#define m 5
int main()
{
setlocale(LC_ALL, "Russian");
int arr[n][m];
float sum = 0;
int count = 0;
for (int i = 0; i<n; i++)
{
for (int j = 0; j<m; j++)
{
arr[i][j] = -1 + rand() % 3;
cout << setw(4) << arr[i][j];
if (((i == j) || (i + j == 2)) && (arr[i][j]>0)) sum = sum + arr[i][j];
if (j == 4) cout << endl;
}
cout << endl;
}
sum = (sum - arr[2][2]) / 9;
cout << "Среднее ариф. эл-в: " << sum << endl;
system("pause");
return 0;
}





что мы тут делаем: if (((i == j) || (i + j == 2)) && (arr[i][j]>0)) sum = sum + arr[i][j]; ????

и тут, почему диапазон arr[2][2] именно такой: sum = (sum - arr[2][2]) / 9; ???

Обсуждение

давно
Посетитель
7438
7205
28.04.2016, 16:31
общий
это ответ
Здравствуйте, Посетитель - 399158!
Программа ошибочная.
Посмотрите, как я сделал
[code h=200]
#include <windows.h>
#include <iostream>
#include <iomanip>
#include <locale>
#include <time.h>

using namespace std;

#define n 5

int main()
{
setlocale(LC_ALL, "Russian");
int arr[n][n];
float sum[2] = {0,0};
int count[2] = {0,0};

srand(time(NULL));
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{
arr[i][j] = -100 + rand() % 200;
cout << setw(4) << arr[i][j];
if ((i == j) && (arr[i][j]>0))
{
sum[0] = sum[0] + arr[i][j];
count[0]++;
}
if ((i == n-j-1) && (arr[i][j]>0))
{
sum[1] = sum[1] + arr[i][j];
count[1]++;
}
}
cout << endl << endl;
}
if (count[0])
cout << "Среднее ариф. эл-в на главной диагонали: " << sum[0]/count[0] << endl;
else
cout << "На главной диагонали нет положительных элементов!" << endl;

if (count[1])
cout << "Среднее ариф. эл-в на побочной диагонали: " << sum[1]/count[1] << endl;
else
cout << "На побочной диагонали нет положительных элементов!" << endl;
system("pause");
return 0;
}[/code]
Вот поиск среднего арифметического положительных элементов на обеих диагоналях вместе
[code h=200]
#include <windows.h>
#include <iostream>
#include <iomanip>
#include <locale>
#include <time.h>

using namespace std;

#define n 5

int main()
{
setlocale(LC_ALL, "Russian");
int arr[n][n];
float sum = 0;
int count = 0;

srand(time(NULL));
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
{
arr[i][j] = -100 + rand() % 200;
cout << setw(4) << arr[i][j];
if (((i == j) || (i == n-j-1)) && (arr[i][j]>0))
{
sum = sum + arr[i][j];
count++;
}
}
cout << endl << endl;
}
if (count)
cout << "Среднее ариф. эл-в на диагоналях: " << sum/count << endl;
else
cout << "На диагоналях нет положительных элементов!" << endl;

system("pause");
return 0;
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399158
228
28.04.2016, 18:34
общий
можете объяснить, что у вас это: (i == n-j-1)???
давно
Посетитель
7438
7205
28.04.2016, 18:45
общий
Адресаты:
Охотно :)
Это проверка попадания на побочную диагональ.
Например, если n = 5, i = 1, то элемент при i =1 попадет на боковую диагональ при j = 3, т.е. элемент [1;3] (счет с 0!)
Имеем равенство 1 == 5-3-1 :)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
28.04.2016, 18:48
общий
28.04.2016, 18:48
Адресаты:
Впрочем, возможно, надо было искать общее среднее арифметическое положительных значений обеих диагоналей вместе?
Я нашел по отдельности...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399158
228
28.04.2016, 18:50
общий
понял. спасибо
давно
Посетитель
7438
7205
28.04.2016, 18:53
общий
Адресаты:
Добавил и такой вариант в ответ
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
28.04.2016, 19:05
общий
Если интересен смысл следующих строк в исходной программе...
что мы тут делаем: if (((i == j) || (i + j == 2)) && (arr[i][j]>0)) sum = sum + arr[i][j]; ????

Предполагалась проверка на попадание на диагонали.
Если главная проверяется правильно, то побочная нет!
и тут, почему диапазон arr[2][2] именно такой: sum = (sum - arr[2][2]) / 9; ???

1) отнимание от суммы центрального элемента (что неверно по двум причинам: по нему проходится всего раз, а не два!
и он может быть и отрицательным!)
2) нахождение среднего делением на их количество(что неверно тоже по двум причинам: их всего 9, а нам нужны только положительные и их надо было считать!)
Сравните, как у меня...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
28.04.2016, 19:16
общий
Адресаты:
И увеличил диапазон чисел до [-100;99], а то [-1;1] как-то неинтересно, среднее всегда было равно 1
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399158
228
04.05.2016, 14:09
общий
Спасбо
Форма ответа