Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 14
1

Найти сумму каждой диагонали матрицы выше главной диагонали

25.09.2016, 20:04. Просмотров 3924. Ответов 36
Метки нет (Все метки)

Дана матрица n*m, найти сумму каждой диагонали отдельно, выше главной диагонали. Не могу понять задачу помогите пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2016, 20:04
Ответы с готовыми решениями:

Найти сумму элементов матрицы, расположенных выше главной диагонали и ниже побочной диагонали
не соображу В среде MS Visual C++ разработать программу, которая формирует матрицу размером n х n...

Найти сумму элементов матрицы, лежащих выше главной диагонали
#include <iostream> #include <conio.h> #include <math.h> using namespace std; int...

Найти сумму модулей элементов, расположенных выше главной диагонали матрицы
for( int i = 0; i < n; i++ ) for( int j = i+1; j < n; j++ ) s += abs(array); Так он находит...

Найти сумму модулей элементов матрицы, находящихся выше главной диагонали
Помогите сделать программу. Дано целочисленная матрица. Определить: - сумму модулей элементов,...

36
Любитель чаепитий
3527 / 1639 / 506
Регистрация: 24.08.2014
Сообщений: 5,576
Записей в блоге: 1
25.09.2016, 20:54 2
Цитата Сообщение от alixan500 Посмотреть сообщение
Дана матрица n*m, найти сумму каждой диагонали отдельно, выше главной диагонали. Не могу понять задачу помогите пожалуйста.
Давайте разбираться вместе? Вот смотрите, гугол говорит, что главная диагональ в матрице это та, которая с верхнего левого угла идёт до нижнего правого, то есть в матрице 3x3 будет как-то так( красным отмечена как раз главная диагональ ).
[ 1 0 0 ],
[ 0 1 0 ],
[ 0 0 1 ];
То есть Вам надо найти всё, что выше этой диагонали, например, для матрицы 8x8 надо найти всё, что ниже выделено синим цветом:
[ 1 0 0 0 0 0 0 0 ],
[ 0 1 0 0 0 0 0 0 ],
[ 0 0 1 0 0 0 0 0 ],
[ 0 0 0 1 0 0 0 0 ],
[ 0 0 0 0 1 0 0 0 ],
[ 0 0 0 0 0 1 0 0 ],
[ 0 0 0 0 0 0 1 0 ],
[ 0 0 0 0 0 0 0 1 ];

Надеюсь, что теперь Вам стало понятно, что от тебя требуется. Удачи!
0
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 14
25.09.2016, 21:34  [ТС] 3
Спасибо за быстрый отзыв, вот нарисовал. Выше главной диагонали, найти сумму каждой из этих диагоналей Все еще не могу понять как это реализовать
0
Миниатюры
Найти сумму каждой диагонали матрицы выше главной диагонали  
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
26.09.2016, 07:34 4
C++
1
2
3
4
5
6
7
8
9
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <ctime>
#include <cstdlib>
#include <vector>
#include <iostream>
 
using namespace std;
 
#define N 10
 
int main(int argc, char* argv[])
{
    vector<vector<int>> matrix;
 
    for (int i = 0; i < N; i++)
    {
        vector<int> row;
        for (int j = 0; j < N; j++)
            row.push_back(std::rand() % N);
 
        matrix.push_back(row);
    }
 
    vector<int> v;
    vector<vector<int>>::iterator it;
    for (it = matrix.begin(); it != matrix.end(); it++)
    {
        vector<int> row = *it;
        vector<int>::iterator r_it;
        for (r_it = row.begin(); r_it != row.end(); r_it++)
            if ((r_it - row.begin()) > (it - matrix.begin()))
                v.push_back(*r_it);
    }
 
    for (it = matrix.begin(); it != matrix.end(); it++)
    {
        vector<int> row = *it;
        vector<int>::iterator r_it;
        for (r_it = row.begin(); r_it != row.end(); r_it++)
            std::cout << *r_it << " ";
 
        std::cout << endl;
    }
 
    std::cout << endl;
 
    vector<int>::iterator iter;
    for (iter = v.begin(); iter != v.end(); iter++)
        std::cout << *iter << " ";
 
    std::cout << endl;
 
    
    std::cin.get();
    std::cin.get();
 
    return 0;
}
1
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
26.09.2016, 12:59 5
Invader0x7F, зря спасибку поставил. Сперва показалось, что код неплох, пока не присмотрелся. А уж когда в IDE запустил, так и вовсе стало понятно - код поставленную задачу не выполняет.
1
Любитель чаепитий
3527 / 1639 / 506
Регистрация: 24.08.2014
Сообщений: 5,576
Записей в блоге: 1
26.09.2016, 13:02 6
Цитата Сообщение от alixan500 Посмотреть сообщение
вот нарисовал
Вам не надо главную диагональ брать, Вам надо только то, что выше неё.
1
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
26.09.2016, 13:33 7
gru74ik, исправлю код и потом посмотрите. Данный код выполняет поиск элементов выше главной диагонали и все. Доделаю и напишу.
1
Любитель чаепитий
3527 / 1639 / 506
Регистрация: 24.08.2014
Сообщений: 5,576
Записей в блоге: 1
26.09.2016, 13:51 8
В общем-то вот навалял я код.
Не очень смотрится, зато работает. Никогда с матрицами не работал так, чтобы там что-то с диагоналями было.
Это код:
C++
1
2
3
4
5
6
7
8
9
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
///////////////////////////////////////////////////////////
#include <iostream>
#include <ctime>
#include <random>
///////////////////////////////////////////////////////////
int main()
{
    const int n{8};
    const int m{8};
    int arr[n][m]{};
    int sum[n - 1]{};
    std::mt19937 gen( std::time( nullptr ) );
    std::uniform_int_distribution<> dist( 1, 9 );
    
    for( int i{}; i < n; ++i )
    {
        for( int j{}; j < m; ++j )
        {
            arr[i][j] = dist( gen );
            std::cout << arr[i][j] << ' ';
        }
        std::cout << std::endl;
    }
    
    std::cout << std::endl;
    
    int k_{7};
    int x_{1};
    
    for( int i{}; i < n - 1; ++i, --k_, ++x_ )
    {
        for( int j{}; j < k_; ++j )
        {
            sum[i] += arr[j][j + x_];
        }
        std::cout << sum[i] << ' ';
    }
}
А вот это всё то, что я начертил во время работы, может пригодится кому-нибудь для понимания работы в будущем:
Код
    0   1   2   3   4   5   6   7

0   4   7   5   2   3   2   3   5

1   8   1   9   3   5   9   7   3

2   2   1   4   8   1   8   3   4

3   1   8   3   2   7   7   6   9

4   5   2   6   2   2   2   8   7

5   8   8   5   2   6   9   3   5

6   7   5   9   9   4   2   6   2

7   9   4   2   2   5   7   1   9

Ответ:

0   1   2   3   4   5   6

38  29  28  24  13  6   5

[0][1] + [1][2] + [2][3] + [3][4] + [4][5] + [5][6] + [6][7]
[0][2] + [1][3] + [2][4] + [3][5] + [4][6] + [5][7]
[0][3] + [1][4] + [2][5] + [3][6] + [4][7]
[0][4] + [1][5] + [2][6] + [3][7]
[0][5] + [1][6] + [2][7]
[0][6] + [1][7]
[0][7]
2
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
26.09.2016, 14:10 9
Invader0x7F, используйте range-based for, ключевое слово auto и код станет на порядок опрятнее:
C++
1
2
3
4
5
6
7
    for (const auto & m : matrix)
    {
        for (const auto & r : m)
            cout << r << " ";
        
        cout << "\n";
    }
И с дефайнами завязывайте.
В плюсах константы так объявляются:
C++
1
const int N = 10;
А уж если мы говорим о размере вектора, то так:
C++
1
const size_t N = 10;
Собственно, вот Ваш код, с некоторым количеством улучшений:
Несколько косметических улучшений

C++
1
2
3
4
5
6
7
8
9
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
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <ctime>
#include <cstdlib>
#include <vector>
#include <iostream>
 
using std::vector;
using std::cout;
//using std::cin;
//using std::endl;
 
int main()
{
    const size_t N = 10;
 
    vector<vector<int>> matrix;
    vector<int> row(N);
 
    for (size_t i = 0; i < N; i++)
    {
        for (size_t j = 0; j < N; j++)
            row[j] = std::rand() % N;
 
        matrix.push_back(row);
    }
 
    vector<int> v;
 
    for (auto it = matrix.begin(); it != matrix.end(); it++)
    {
        row = *it;
        for (auto r_it = row.begin(); r_it != row.end(); r_it++)
            if ((r_it - row.begin()) > (it - matrix.begin()))
                v.push_back(*r_it);
    }
 
    for (const auto & m : matrix)
    {
        for (const auto & r : m)
            cout << r << " ";
 
        cout << "\n";
    }
 
    cout << "\n\n";
 
    for (const auto & elem : v)
        cout << elem << " ";
 
    cout << "\n";
 
    return 0;
}


P.S. Логически завершённые блоки кода, выполняющие определённое действие (вывод текста на консоль, например) имеет смысл выносить в отдельную функцию.

Добавлено через 14 минут
GbaLog-, размер массива делай const unsigned int или const size_t. Избегай использования магических чисел.
2
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
26.09.2016, 15:13 10
Лучший ответ Сообщение было отмечено alixan500 как решение

Решение

Вот, gru74ik, переделал программу:
C++
1
2
3
4
5
6
7
8
9
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
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <ctime>
#include <cstdlib>
#include <vector>
#include <iostream>
 
using namespace std;
 
#define N 10
 
int main(int argc, char* argv[])
{
    vector<vector<int>> matrix;
 
    for (int i = 0; i < N; i++)
    {
        vector<int> row;
        for (int j = 0; j < N; j++)
            row.push_back(std::rand() % N);
 
        matrix.push_back(row);
    }
 
    vector<vector<int>>::iterator it;
    for (it = matrix.begin(); it != matrix.end(); it++)
    {
        vector<int> row = *it;
        vector<int>::iterator r_it;
        for (r_it = row.begin(); r_it != row.end(); r_it++)
            std::cout << *r_it << " ";
 
        std::cout << endl;
    }
 
    std::cout << endl;
 
    for (std::size_t d = 0; d < matrix[0].size() - 1; d++)
    {
        std::size_t i = 0, sum = 0;
        for (std::size_t j = d + 1; j < matrix[0].size(); i++, j++)
        {
            int n = *((matrix.begin() + i)->begin() + j);
            sum += n; std::cout << n << " ";
        }
 
        std::cout << "sum = " << sum << endl;
    }
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
1
Миниатюры
Найти сумму каждой диагонали матрицы выше главной диагонали  
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
26.09.2016, 16:05 11
Invader0x7F, да, она работает. Но советов Вы, к сожалению, не учли.
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
26.09.2016, 16:12 12
То есть "не учел советов" ?? Читал Ваши предыдущие посты в данной теме, но "советов" не обнаружил !!!
0
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
26.09.2016, 16:16 13
Invader0x7F, по порядку:
  1. зачем Вы используете одновременно директиву using и квалификатор std::?
    ...
  2. зачем define, если хорошим тоном считается const и Вам об этом сказали?
    ...
  3. зачем аргументы командной строки, если Вы их не используете в своей программе?
    ...
  4. зачем использовать старый rand(), а не новые средства из заголовочного файла <random>?
    ...
  5. зачем 10 раз заново переобъявлять row в 16-й и 26-й строках Вашего кода?
    ...
  6. то же самое касательно итератора r_it в 27-й строке кода: зачем?
    ...
  7. то же самое, касательно переменных в 38-й строке кода: зачем?
    ...
  8. почему Вы не используете range-based for там, где он уместен?
    ...
  9. почему не используете ключевое слово auto там, где оно уместно?
    ...
  10. почему не хотите вынести логически связанные куски кода в отдельные функции?
0
Любитель чаепитий
3527 / 1639 / 506
Регистрация: 24.08.2014
Сообщений: 5,576
Записей в блоге: 1
26.09.2016, 16:16 14
Цитата Сообщение от gru74ik Посмотреть сообщение
используйте range-based for, ключевое слово auto и код станет на порядок опрятнее:
Цитата Сообщение от gru74ik Посмотреть сообщение
И с дефайнами завязывайте.
В плюсах константы так объявляются:
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Читал Ваши предыдущие посты в данной теме, но "советов" не обнаружил !!!
Плохо читали, видимо.
1
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
26.09.2016, 16:33 15
gru74ik, может быть это вы имели ввиду ?!
C++
1
2
3
4
5
6
7
8
9
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <ctime>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <random>
 
using namespace std;
 
const int N = 10;
 
int main()
{
    vector<vector<int>> matrix;
    mt19937 mt((unsigned)time(NULL));
    std::uniform_int_distribution<int> dist(0, N - 1);
 
    for (int i = 0; i < N; i++)
    {
        vector<int> row;
        for (int j = 0; j < N; j++)
            row.push_back(dist(mt));
 
        matrix.push_back(row);
    }
 
    for (vector<int> row : matrix)
    {
        for (int n_item : row)
        {
            cout << n_item << " ";
        }
 
        cout << endl;
    }
 
    std::cout << endl;
 
    for (size_t d = 0; d < matrix[0].size() - 1; d++)
    {
        size_t i = 0, sum = 0;
        for (size_t j = d + 1; j < matrix[0].size(); i++, j++)
        {
            int n = *((matrix.begin() + i)->begin() + j);
            sum += n; cout << n << " ";
        }
 
        cout << "sum = " << sum << endl;
    }
 
    cin.get();
    cin.get();
 
    return 0;
}
1
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
26.09.2016, 16:53 16
Invader0x7F, уже лучше
На повестке дня остались вопросы №1, №5 (строка 19 теперь), №7 (строка 40). Конечно, можно проигнорировать советы № 8 и 9, так как это уже больше вкусовщина, но, вот насчёт функций я бы подумал.
А так же теперь появились новые вопросы.
...
Список вопросов № 2:
  1. Зачем старинный NULL, когда есть современный правильный nullptr?
    ...
  2. Зачем размер матрицы в глобальном скоупе (9 строка кода), когда разумнее её внутрь мэйна поместить?
    ...
  3. Почему размер матрицы - знаковый int? Разве может быть размер строки или столбца равен, скажем, -3?
    ...
  4. Зачем магические числа (15 строка кода)? Почему бы не сделать так, например:
    C++
    1
    2
    3
    4
    
    std::mt19937 mt((unsigned)time(nullptr));
    const int fromNum = 0;
    const int toNum = 9;
    std::uniform_int_distribution<int> dist(fromNum, toNum);
  5. Зачем два оператора (statements) на одной строке (44-я строка)?
    ...
  6. Зачем 10 раз вызывать matrix[0].size() (38-я строка) и ещё 10 раз (41-я строка)?
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
26.09.2016, 17:03 17
C++
1
2
3
4
5
6
7
8
9
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <ctime>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <random>
 
using namespace std;
 
const int N = 10;
 
mt19937 mt((unsigned)time(nullptr));
const int fromNum = 0, toNum = 9;
std::uniform_int_distribution<int> dist(fromNum, toNum);
 
void InitMatrix(vector<vector<int>>& matrix)
{
    for (int i = 0; i < N; i++)
    {
        vector<int> row;
        for (int j = 0; j < N; j++)
            row.push_back(dist(mt));
 
        matrix.push_back(row);
    }
}
 
void DisplayMatrix(vector<vector<int>>& matrix)
{
    for (vector<int> row : matrix)
    {
        for (int n_item : row)
        {
            cout << n_item << " ";
        }
 
        cout << endl;
    }
 
    std::cout << endl;
}
 
void Compute(vector<vector<int>>& matrix)
{
    for (size_t d = 0; d < matrix[0].size() - 1; d++)
    {
        int sum = 0;
        for (size_t i = 0, j = d + 1; j < matrix[0].size(); i++, j++)
        {
            int n = *((matrix.begin() + i)->begin() + j);
            sum += n; cout << n << " ";
        }
 
        cout << "sum = " << sum << endl;
    }
}
 
int main()
{
    vector<vector<int>> matrix;
 
    InitMatrix(matrix);
    DisplayMatrix(matrix);
 
    Compute(matrix);
 
    cin.get();
    cin.get();
 
    return 0;
}
Добавлено через 1 минуту
У меня тоже возникло несколько замечаний по-поводу вышесказанного:

зачем Вы используете одновременно директиву using и квалификатор std::?
... Ответ: Использую его для "красоты" и правильного оформления кода
зачем define, если хорошим тоном считается const и Вам об этом сказали?
... Ответ: В данном случае не имеет значение что, на самом деле, использовать макро препроцессора #define или const
зачем аргументы командной строки, если Вы их не используете в своей программе?
... Ответ: Аргументы командной строки используются только для соответствия формату функции main(...)
Если заметили многие IDE генерируют функцию main(int argc, char* argv[]) при создании консольного проекта.
зачем использовать старый rand(), а не новые средства из заголовочного файла <random>?
... Ответ: Для данного примера достаточно старого std::rand(). Использование, к примеру, mt19937 необходимо там,
где требуется генерация более равномерной выборки, как правило в "сложных" задачах.
зачем 10 раз заново переобъявлять row в 16-й и 26-й строках Вашего кода?
... Ответ: Так как объекты row объявлены в разных операторных блоках { }, то компилятор интерпретирует их
как разные объекты, а не один и тот же самый.
то же самое касательно итератора r_it в 27-й строке кода: зачем?
... Ответ: (см. выше)
то же самое, касательно переменных в 38-й строке кода: зачем?
... Ответ: Переменные нужны, поскольку все переменные внутри оператора for объявить не возможно.
Кроме того если переменная sum будет объявлена внутри оператора for, то не будет доступна извне.
почему Вы не используете range-based for там, где он уместен?
... Ответ: range-based for появился только в стандарте C++14. Его использование, на данный момент, является экспериментальным. Во многих примерах его использование является невозможным.
почему не используете ключевое слово auto там, где оно уместно?
... Ответ: Использование ключевого слова auto вместо объявления объекта итератора появилось только в
стандарте C++14. Я не думаю, что форумчанам задающим вопрос на форуме нужен код в соответствии с
последним стандартном языка. Это же касается и предыдущего пункта с range-based for.
почему не хотите вынести логически связанные куски кода в отдельные функции?
Разбить программу на функции я согласен. Это правильно.
__________________
1
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
26.09.2016, 17:10 18
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Использую его для "красоты" и правильного оформления кода
Использование директивы using в глобальном скоупе - дурной тон и плохая привычка. Лучше использовать либо квалификаторы std::, либо объявление using.

Цитата Сообщение от Invader0x7F Посмотреть сообщение
range-based for появился только в стандарте C++14
Появился в С++11. Не является экспериментальным. Это уже стандарт и устоявшаяся практика.

Цитата Сообщение от Invader0x7F Посмотреть сообщение
Использование ключевого слова auto вместо объявления объекта итератора появилось только в
стандарте C++14.
То же самое. Появился в С++11. Не является экспериментальным. Это уже стандарт и устоявшаяся практика.

По остальному не буду спорить. Сделали, как сделали. Для учебного проекта на 70 строк - пойдёт. Вы - молодец
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
26.09.2016, 17:11 19
Вы смотрели последний version кода ?? Что скажите ? Вроди-бы я все исправил ?!
1
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
26.09.2016, 17:16 20
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Вы смотрели последний version кода ?? Что скажите ?
Самая красивая из всех. Если убрать из глобального скоупа директиву using, будет почти идеально, на мой взгляд. Более опытные коллеги, возможно, добавят что-то ещё.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2016, 17:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Найти сумму элементов выше главной диагонали, а также минимальных элемент матрицы
Дана квадратная матрица. Найти сумму элементов выше главной диагонали, а также минимальных элемент...

Найти число и сумму положительных элементов, стоящих выше главной диагонали матрицы
Нужна помощь с этим заданием: Даны матрицы А(5х5) и В(7х7). Для матрицы А найти число и сумму...

Найти сумму положительных элементов матрицы, которые находятся выше главной диагонали
Задан динамический двумерный массив размерности n х n, нужно найти сумму положительных элементов,...

Подсчитать количество локальных минимумов матрицы, найти сумму модулей элементов выше главной диагонали
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.