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

Обнулить все элементы, лежащие выше главной диагонали матрицы

03.06.2019, 10:31. Просмотров 926. Ответов 5
Метки нет (Все метки)

Задача:Если Целочисленная квадратная матрица симметрична относительно главной диагонали - обнулить все элементы, лежащие выше главной диагонали и найти сумму всех элементов лежащих ниже главной диагонали.

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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void Set (double **a, int n, int m)
{
    for (int i = 0; i < n; i++)
        for (int j=0; j < m; j++)
        a[i][j]=rand()%9 + 1;
}
 
void Top (double **a, int n, int m)
{
for (int i=0; i<n/2; i++)
        for (int j=n-1; j>n-i-1; j--)
            a[i][j] = 0;
}
 
void Bottom (double **a, int n, int m, int &isum)
{
    double sum=0.0;
    for (int i=0; i<n/2; i++)
        for(int j = 0; j < m; j++)
            sum+=a[i][j];
}
 
void Print (double **a, int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j=0; j < m; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }
}
 
int main()
{
    int n, m, sum=0;
    cout << "n="; cin >> n;
    cout << "m="; cin >> m;
 
      double **a = new double*[n];
    for (int i = 0; i < n; i++)
       a[i]=new double[m];
 
    Set(a,n,m);
    cout << "Matrix:\n";
    Print(a,n,m);
    Top(a,n,m);
    Bottom(a,n,m,sum);
    cout << "Modified matrix:\n";
    Print(a,n,m);
    cout << "Summ\n"<<sum;
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
system("pause");
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2019, 10:31
Ответы с готовыми решениями:

Обнулить элементы матрицы, лежащие одновременно выше главной диагонали и выше побочной диаго-нали.
Matrix92. Дана квадратная матрица порядка M. Обнулить элементы матрицы, лежащие одновременно выше...

Обнулить элементы матрицы, лежащие одновременно выше главной диагонали и ниже побочной диагонали
Дана квадратная матрица порядка M. Обнулить элементы матрицы, лежащие одновременно выше главной...

Обнулить элементы матрицы, лежащие на главной диагонали и выше нее (без использования условного оператора)
дана квадратная матрица порядка m обнулить элементы матрицы лежищие на главной диагонали и выше...

Обнулить в квадратной матрице элементы, лежащие выше главной и ниже побочной диагонали
Как обнулить в квадратной матрице элементы, лежащие выше главной и ниже побочной диагонали....

5
Модератор
Эксперт С++
9580 / 8214 / 5015
Регистрация: 18.12.2011
Сообщений: 21,955
03.06.2019, 13:51 2
C++
1
2
3
4
5
6
7
void Bottom (double **a, int n, int m, int &isum)
{
    isum=0.0;
    for (int i=0; i<n/2; i++)
        for(int j = 0; j < m; j++)
            isum+=(int)a[i][j];
}
То, что Вы решили искать целочисленную сумму - это на Вашей совести.
0
1197 / 709 / 220
Регистрация: 26.05.2012
Сообщений: 2,238
03.06.2019, 14:02 3
Edantes,
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
 
using namespace std;
 
void Set(double **a,int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<"a["<<i<<"]["<<j<<"]=";
            cin>>a[i][j];
        }
    }
}
 
bool ChkSym(double **a,int n)
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            if(a[i][j]!=a[j][i])
            {
                return false;
            }
        }
    }
 
    return true;
}
 
void Top(double **a,int n)
{
    for(int i=0;i<n-1;i++)
    {
        for (int j=i+1;j<n;j++)
        {
            a[i][j]=0;
        }
    }
}
 
void Bottom(double **a,int n,double &isum)
{
    for(int i=1;i<n;i++)
    {
        for(int j=0;j<i;j++)
        {
            isum+=a[i][j];
        }
    }
}
 
void Print(double **a,int n)
{
    for (int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<setw(3)<<a[i][j]<<" ";
        }
 
        cout << "\n";
    }
}
 
int main()
{
    int n;
    double sum=0;
 
    cout<<"n=";
    cin>>n;
 
    double **a=new double *[n];
    for(int i=0;i<n;i++)
    {
        a[i]=new double[n];
    }
 
    Set(a,n);
 
    cout<<"\nMatrix:\n";
 
    Print(a,n);
 
    if(ChkSym(a,n))
    {
        cout<<"\nMatrix is symmetrical!";
 
        Top(a,n);
        Bottom(a,n,sum);
 
        cout<<"\n\nModified matrix:\n";
 
        Print(a,n);
 
        cout<<"\nsum: "<<sum;
    }
    else
    {
        cout<<"\nMatrix is not symmetrical!";
    }
 
    for(int i=0;i<n;i++)
    {
        delete [] a[i];
    }
    delete [] a;
 
    return 0;
}
0
4215 / 2885 / 1778
Регистрация: 18.12.2017
Сообщений: 9,015
03.06.2019, 14:15 4
Цитата Сообщение от Edantes Посмотреть сообщение
Не понимаю в чем проблема
в том, что код не предназначен для решения этой задачи - нет проверки матрицы на симметричность, рандом для этих целей не подходит - не очень реально получить симметричную матрицу и целый ряд других ошибок. исправил:
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 <iostream>
using namespace std;
 
void Set (int **a, int n)
{
    cout << "Enter " << n*n << " matrix elements:\n";
    for (int i = 0; i < n; i++)
       for (int j = 0; j < n; j++)
       cin >> a[i][j];
}
 
bool Symmetrical (int **a, int n)
{
    for (int i = 0; i < n; i++)
        for (int j=i+1; j<n; j++)
           if (a[i][j]!=a[j][i]) return false;
    return true;       
}           
 
void NullsUpMainDiag (int **a, int n)
{
    for (int i = 0; i < n; i++)
       for (int j = 0; j < n; j++)
            if (i<j) a[i][j]=0;
}
 
int SumDownMainDiag (int **a, int n)
{
    int sum=0;
    for (int i = 0; i < n; i++)
       for (int j = 0; j < n; j++)
            if (i>j) sum+=a[i][j];
    return sum;        
}
 
void Print (int **a, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }
}
 
int main()
{
    int n;
    cout << "n="; cin >> n;    
 
      int **a = new int*[n];
    for (int i = 0; i < n; i++)
       a[i]=new int[n];
 
    Set(a,n);    
    if (Symmetrical(a,n))
    {
    NullsUpMainDiag(a,n);    
    cout << "Modified matrix:\n";
    Print(a,n);
    cout << "local sum=" << SumDownMainDiag(a,n) << "\n";
    }
    else cout << "No symmetrical\n";
    
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
system("pause");
return 0;
}
Edantes, выше уже proc3nt сбросил свой вариант, но всё же лучше для целочисленной матрицы использовать тип int и тип функции нахождения суммы тоже сделать int.
0
1197 / 709 / 220
Регистрация: 26.05.2012
Сообщений: 2,238
03.06.2019, 14:26 5
Yetty, по-моему в твоем коде в некоторых местах будут лишние ненужные итерации цикла.. просто сравни мой код со своим..
0
4215 / 2885 / 1778
Регистрация: 18.12.2017
Сообщений: 9,015
03.06.2019, 14:52 6
proc3nt, можно и так как в твоём варианте, но цикл в котором не меняется диапазон для переменной работает быстрее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2019, 14:52

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

Обнулить элементы матрицы, лежащие одновременно выше главной и побочной диагоналей
Дана квадратная матрица порядка n. Обнулить элементы матрицы,лежащие одновременно выше главной и...

Обнулить элементы матрицы, лежащие на главной диагонали
Может кто-нибудь подсказать алгоритм обнуления элементов матрицы, лежащие на главной диагонали, не...

Обнулить элементы матрицы, лежащие выше побочной диагонали. Условный оператор не использовать
Доброго времени суток.Прошу помощи в решении следующей задачи. Дана квадратная матрица порядка...

Заменить нулями отрицательные элементы матрицы, лежащие выше главной диагонали
Дана квадратная матрица порядка M. Заменить нулями отрицательные элементы матрицы, лежащие выше...

Заменить нулями отрицательные элементы матрицы, лежащие выше главной диагонали
Дана квадратная матрица порядка M. Заменить нулями отрицательные элементы матрицы, лежащие выше...

Заменить нулями элементы матрицы лежащие одновременно выше и ниже главной диагонали
Дана квадратная матрица порядка M. Заменить нулями элементы, лежащие одновременно выше ниже...


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

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

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