Квадратная матрица и сумма отрицательных элементов строк
Для квадратной матрицы с M * M чисел определить сумму элементов, расположенных ниже главной диагонали, среди строк, начинающихся с отрицательного элемента.
Вот код, но он не правильно находит сумму. Что не так?
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
int main()
{
setlocale(0, "");
int i = 0, j = 0, M, sum = 1;
cout << "Введите кол-во строк в матрице: ";
cin >> M;
int** A = new int* [M];
for (int i = 0; i < M; i++)
A[i] = new int[j];
srand(time(NULL));
cout << "Матрица: " << endl;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < M; j++)
{
A[i][j] = (5 - rand() % 10);
cout << setw(3) << A[i][j];
}
cout << endl;
}
for (int i = 0; i < M; j++)
for (int j = 0; j < M; j++)
if ((A[i][j] < 0) && (i > j)) {
sum = sum + A[i][j];
}
cout << "Сумма элементов строки= " << sum << endl;
delete[]A;
}
Ответы (1 шт):
Автор решения: EOF
→ Ссылка
У Вас в коде несколько проблем:
- Переменные
iиjне нужны. Вы в циклах обьявляете свои локальные переменные. - Почему
sumинициализируется еденицей? Должна ведь быть нулём. - Строка
A[i] = new int[j];должна иметь видA[i] = new int[M];. Матрица ведь должна быть квадратная. Ещё йjв данной точке программы равно нулю. - В цикле суммирования Вы обходите всю матрицу, хотя этого можно и не делать. Да и с проверками беда. Вот возможная реализация:
for (int i = 1; i < M; i++) // Начинаем сразу со второй строки матрицы
{
if (A[i][0] >= 0) // Будем считать, только если первый элемент строки >= 0
{
for (int j = 0; j < i; j++) // Идет по строке до элемента диагонали
{
sum += A[i][j];
}
}
}
- Удалять двумерный динамический массив нужно в обратном порядке его создания:
// Удаляем каждую строку матрицы
for (int i = 0; i < M; i++)
{
delete[] A[i];
}
// Удаляем массив, который хранил указатели на строки матрицы
delete[] A;