Элементы матрицы ниже побочной диагонали

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
KentavR
Сообщения: 2
Зарегистрирован: 27 ноя 2014, 18:48

4 2 3 4
0 7 5 -2
-4 3 2 8
4 -2 8 3

Получить новую матрицу, элементы которой есть сумма элементов данной матрицы с наименьшим элементом среди расположенных ниже побочной диагонали

Код: Выделить всё

#include "stdafx.h"
#include <math.h>
#include <iomanip>
#include <iostream>
#include <fstream>
using namespace std;

int main ()
{double a[4][4];
//... ввод матрицы
}
не понимаю как сделать сам цикл по задаче
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Проблема в том, как оббежать элементы матрицы, расположенные ниже побочной диагонали, верно?

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

Код: Выделить всё

for (int i = 1; i < N; ++i)
А вот внутренний цикл по j, который будет оббегать необходимые элементы внутри i-ой строки, очевидно уже будет зависеть от значения i. Для i равного 1, мы должны взять всего один элемент с индексом [1][3]. Для i равного 2, мы должны взять уже два элемента с индексами [2][2] и [2][3]. И так далее. То есть чем больше i, тем больше элементов из строки мы должны взять. Следует заметить, что последний элемент строки в любом случае входит в искомые, значит правая граница цикла по j нами известна - это N-1. Левая же граница, очевидно, зависит от i. Чем i больше, тем граница меньше, а значит в интервал попадает больше элементов. Не сложно сообразить, что левая граница должна быть N-1-(i-1), иными словами N-i.

Код: Выделить всё

for (int j = N-i; j < N; ++j)
Всё вышесказанное выливается в следующую простенькую программу, которая выводит все элементы, расположенные ниже главной диагонали матрицы:

Код: Выделить всё

#include <iostream>

const int N = 4;

const int a[N][N] =
{
   { 4,  2,  3,  4 },
   { 0,  7,  5, -2 },
   {-4,  3,  2,  8 },
   { 4, -2,  8,  3 }
};

int main()
{
   for (int i = 1; i < N; ++i)
      for (int j = N-i; j < N; ++j)
         std::cout << a[i][j] << " ";

   return 0;
}
Результат работы:
-2 2 8 -2 8 3
P.S. Ты уже второй раз создаёшь тему с неинформативным названием. В этот раз я её переименовал. Спешу напомнить, что подобные темы могут быть удалены основываясь на соглашении, которое ты подписал при регистрации. Уважай труд людей, которые тебе помогают - делай понятные темы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить