1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
1

Сделать симметричную матрицу несимметричной. Где ошибка?

16.01.2014, 13:40. Показов 3814. Ответов 31
Метки нет (Все метки)

условие: условие: дана квадратичная матрица z[n][n]. составить программу, которая если матрица симметричная(транспонированная матрица равна исходной), сделает ее не симметричной, сдвинув строку, содержащую элемент с максимальным значением на 1 элемент вправо.
-------------------------------------------

не работает условие проверки матрицы.
не могу найти ошибку.
да и вообще она неправильная.
а найти ошибку не могу.

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
#include<iostream>
#include<iomanip>
 
using namespace std;
 
 
void transpose(int zt[3][3])
{
    int t;
    for(int i = 0; i < 3; i++)
    {
        for(int j = i; j < 3; j++)         //процедура транспонирования матрицы
        {
            t = zt[i][j];
            zt[i][j] = zt[j][i];
            zt[j][i] = t;
        }
    }
}
 
void main()
{
    setlocale(LC_ALL, "Russian");
 
    cout<<"fedor\n";
 
    int z[3][3] = {{1,1,3},
                   {2,5,6},
                   {3,6,9}};
 
    int z_new[3][3]; //транспонированная матрица
 
       for(int i = 0; i < 3; ++i)
    {
        for(int j = 0; j < 3; ++j)         
        {
            z_new[i][j]=z[i][j];
        }
       }
 
       transpose(z_new); //транспонируем матрицу
 
        for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)//выводим транспонированную матрицу
 
            cout << z_new[i][j];
            cout << '\n' ; 
       }
 
       for(int i=0;i<3;i++)
        {
                for(int j=0;j<3; j++) {
                
                        if (z[i][j]==z_new[i][j]) {
 
 
    int imax = -1;
    int jmax = -1;
    int max;
    max= z[0][0]; // считаем, что первый элемент массива - максимальный
 
       for(int i = 0; i < 3; ++i)
    {
        for(int j = 0; j < 3; ++j)         
        {
            if (z[i][j] >= max) {
                max=z[i][j];
                imax=i;
                jmax=j;
 
} 
        }
       }
                cout << "max = " << max << " pos = " << imax << " " << jmax<< endl;     
        
 
     
   
             // zz[3][3]; //выводимая матрица на консоль(конечная)
             int m=3;
             int n=3;
 
                for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++) {
            z[i][j]=z[i][j+1];
        }
               }
 
    
          // zz[2][0]=z[2][2];
           //  zz[2][1]=z[2][0];
            // zz[2][2]=z[2][1];
             
 
        for(int n = 0; n < 3; n++)
    {
        for(int m = 0; m < 3; m++)
            cout << z[n][m];
        cout << '\n';
       }
                        }
                }
       }
       system("pause");
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2014, 13:40
Ответы с готовыми решениями:

Как сделать подобную симметричную матрицу?
Добрый вечер. Забыл как делаются такие матрицы и гугл мне не помог. Вернее, симметричную я вроде...

Преобразовать матрицу в ее симметричную по строке M/2
Взять матрицу M x N, Преобразовать ее в симметричную по строке M/2. Вывести результат рядом с...

Как создать симметричную матрицу
Как создать симметричную матрицу.

Построить матрицу, симметричную относительно исходной
Задана матрица А вещественных чисел размера N*N(N&lt;=20, задается как параметр). Построить по ней...

31
101 / 102 / 31
Регистрация: 15.01.2014
Сообщений: 283
16.01.2014, 14:27 2
Цитата Сообщение от triish Посмотреть сообщение
условие: условие: дана квадратичная матрица z[n][n]. составить программу, которая если матрица симметричная(транспонированная матрица равна исходной), сделает ее не симметричной, сдвинув строку, содержащую элемент с максимальным значением на 1 элемент вправо.
-------------------------------------------
Если строку на один элемент она станет не эквивалентной предыдущей. Так и надо?
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,162
16.01.2014, 14:29 3
Сделал проверку на симметричность:
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
# include <iostream>
using namespace std;
 
bool func_simmetr(double **arr,const int &n);
 
int _tmain(int argc, _TCHAR* argv[])
{
int n,i,j;
double **mas;
cout<<"Vvedute n"<<endl;
cin>>n;
mas=new double*[n];
 
for(i=0;i<n;i++)
{
mas[i]=new double[n];
}
 
for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    cin>>mas[i][j]; 
}
 
if(!func_simmetr(mas,n)) cout<<"Matrica  ne simmetru4na"<<endl;
else cout<<"Simmetru4na";
 
cin.get();
cin.get();
 
}
 
bool func_simmetr(double **arr,const int &n)
{
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if(arr[i][j]!=arr[j][i]) return false;
    return true;
}
0
Заблокирован
16.01.2014, 14:30 4
C++
1
2
3
4
5
6
  for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++) {
            z[i][j]=z[i][j+1];
        }
               }
обращение к элементу с индексом z[i][3]
0
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 14:44  [ТС] 5
Цитата Сообщение от Enotniy Посмотреть сообщение
Если строку на один элемент она станет не эквивалентной предыдущей. Так и надо?
строку то надо только одну сдвинуть.
ну например, если матрица
123
256
369
то должно получиться
123
256
936

Добавлено через 2 минуты
спасибо.
Цитата Сообщение от S_el Посмотреть сообщение
Сделал проверку на симметричность:
а из моей ничего нельзя уже сделать что бы норм работала?

Добавлено через 1 минуту
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
обращение к элементу с индексом z[i][3]
спасибо, но почему именно с этим индексом?
0
101 / 102 / 31
Регистрация: 15.01.2014
Сообщений: 283
16.01.2014, 15:07 6
вот ваш код по правленный

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
#include<iostream>
#include<iomanip>
 
using namespace std;
 
 
void transpose(int zt[3][3])
{
    int t;
    for(int i = 0; i < 3; i++)
    {
        for(int j = i; j < 3; j++)         //процедура транспонирования матрицы
        {
            t = zt[i][j];
            zt[i][j] = zt[j][i];
            zt[j][i] = t;
        }
    }
}
 
bool func_simmetr(double **arr,const int &n)
{
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if(arr[i][j]!=arr[j][i]) return false;
    return true;
}
 
void main()
{
    int n,i,j;
    double **mas;
    cout<<"Vvedute n"<<endl;
    cin>>n;
    mas=new double*[n];
 
    for(i=0;i<n;i++)
    {
        mas[i]=new double[n];
    }
 
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            cin>>mas[i][j]; 
    }
 
    if(!func_simmetr(mas,n)) cout<<"Matrica  ne simmetru4na"<<endl;
    else 
        {
            cout<<"Simmetru4na";
 
 
        int imax = -1;
        int jmax = -1;
        int max= mas[0][0];
 
 
        for(int i = 0; i < n; ++i)
        {
            for(int j = 0; j < n; ++j)         
            {
                if (mas[i][j] >= max)
                {
                    max=mas[i][j];
                    imax=i;
                    jmax=j;
 
                } 
            }
        }
 
        cout << "max = " << max << " pos = " << imax << " " << jmax<< endl;     
 
 
 
        int tmp =mas[imax][0];
        for (int j = 0; j < n-1; j++) 
        {
            mas[imax][j]=mas[imax][j+1];
        }
        mas[imax][n-1] = tmp;
 
 
        // zz[2][0]=z[2][2];
        //  zz[2][1]=z[2][0];
        // zz[2][2]=z[2][1];
 
 
        for(int i = 0; i < n; i++)
        {
            for(int j= 0; j < n; j++)
                cout << mas[i][j];
            cout << '\n';
        }
    }
    system("pause");
}
0
Заблокирован
16.01.2014, 15:29 7
Цитата Сообщение от triish Посмотреть сообщение
спасибо, но почему именно с этим индексом?
потому, что у вас максимальный объявленный индекс - 2
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,162
16.01.2014, 15:30 8
Цитата Сообщение от triish Посмотреть сообщение
а из моей ничего нельзя уже сделать что бы норм работала?
Можно,но зачем?

Цитата Сообщение от Enotniy Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void transpose(int zt[3][3])
{
    int t;
    for(int i = 0; i < 3; i++)
    {
        for(int j = i; j < 3; j++)         //процедура транспонирования матрицы
        {
            t = zt[i][j];
            zt[i][j] = zt[j][i];
            zt[j][i] = t;
        }
    }
}
Это лишнее.
0
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 16:54  [ТС] 9
Цитата Сообщение от Enotniy Посмотреть сообщение
вот ваш код по правленный
выводит, что матрица симметрична.
выводит максимальное значение и индекс(неправильно выводит)
и после этого не выводит больше ничего.
а должен после всего этого еще и матрицу вывести, где строка сдвинута с максимальным значением.

(все равно спасибо)

Добавлено через 45 секунд
Цитата Сообщение от S_el Посмотреть сообщение
Это лишнее.
ну так а почему лишнее?
(просто интересно)
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.01.2014, 16:59 10
Для проверки на симметричность, транспонировать целиком не надо, достаточно сравнить элементы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool cheack(int zt[3][3])
{
 int i, j;
 for (i=1; i<3; ++i)
 {
  for (j=0; j<i; +j)
  {
   if (zt[i][j]!=zt[j][i])
   {
    return false;
   }
  }
 }
 return true;
}
0
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 17:04  [ТС] 11
Цитата Сообщение от taras atavin Посмотреть сообщение
Для проверки на симметричность, транспонировать целиком не надо, достаточно сравнить элементы.
препод требует, что бы не было никаких отдельных функций что бы их потом вызывать в мэйне.
он говорит, что программа вообще должна быть в два цикла.
(ну и естественно все это надо будет делать в мэйне.а не отдельно функциями)



спасибо.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.01.2014, 17:05 12
Цитата Сообщение от triish Посмотреть сообщение
препод требует, что бы не было никаких отдельных функций что бы их потом вызывать в мэйне.
он говорит, что программа вообще должна быть в два цикла.
(ну и естественно все это надо будет делать в мэйне.а не отдельно функциями)
В два цикла и проверку, и поиск, и ещё сдвиг не сделаешь, надо минимум 5.
0
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 17:07  [ТС] 13
я тоже это прекрасно знаю.
но он идиот.
я все равно сделаю по-своему.
но хотя бы расписать все это в мэйне.

Цитата Сообщение от taras atavin Посмотреть сообщение
В два цикла и проверку, и поиск, и ещё сдвиг не сделаешь, надо минимум 5.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.01.2014, 17:13 14
Цитата Сообщение от triish Посмотреть сообщение
но хотя бы расписать все это в мэйне.
А это не сложно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i, j;
bool flag;
for (i=1, flag=true; i<3; ++i)
{
 for (j=0; j<i; +j)
 {
  if (zt[i][j]!=zt[j][i])
  {
   flag=false;
   i=3;
   break;
  }
 }
}
Добавлено через 2 минуты
Даже если вложенные не считать, три циклические подзадачи, три цикла.
0
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 17:18  [ТС] 15
так у меня, получается, почти вся программа, будет в этом цикле.
потому что если матрица симметрична, то мы совершаем действие из условия.
а если нет, то ничего.

Цитата Сообщение от taras atavin Посмотреть сообщение
А это не сложно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i, j;
bool flag;
for (i=1, flag=true; i<3; ++i)
{
 for (j=0; j<i; +j)
 {
  if (zt[i][j]!=zt[j][i])
  {
   flag=false;
   i=3;
   break;
  }
 }
}
Добавлено через 2 минуты
Даже если вложенные не считать, три циклические подзадачи, три цикла.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.01.2014, 18:04 16
Цитата Сообщение от triish Посмотреть сообщение
так у меня, получается, почти вся программа, будет в этом цикле.
потому что если матрица симметрична, то мы совершаем действие из условия.
а если нет, то ничего.
Проверить надо всю матрицу, не совпадать могут zt[2][1] и zt[1][2], пока вся не проверена двигать нельзя. Но при этом первое же обнаруженное неравенство даже zt[1][0] и zt[0][1] - и матрица проверена вся. Не все элементы, а именно матрица, как целое.
0
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 19:39  [ТС] 17
почему?


Цитата Сообщение от taras atavin Посмотреть сообщение
Проверить надо всю матрицу, не совпадать могут zt[2][1] и zt[1][2], пока вся не проверена двигать нельзя. Но при этом первое же обнаруженное неравенство даже zt[1][0] и zt[0][1] - и матрица проверена вся. Не все элементы, а именно матрица, как целое.
0
101 / 102 / 31
Регистрация: 15.01.2014
Сообщений: 283
16.01.2014, 21:46 18
triish, Чем вам моё решение не нравится? по моему всё по условию. Сдвигает если симметричная. М/б я не понял, что-то в условии. по моему всё работает
0
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 22:00  [ТС] 19
да нет, мне все нравится.
спасибо большое, что вообще взялись помогать.
мне просто надо очень срочно. а я сижу уже который день, не получается.

только я начала ее проверять.
условие симметричности не работает до конца.
даже если матрица не симметрична, он пишет, что она симметрична.

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

Цитата Сообщение от Enotniy Посмотреть сообщение
triish, Чем вам моё решение не нравится? по моему всё по условию. Сдвигает если симметричная. М/б я не понял, что-то в условии. по моему всё работает
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,162
16.01.2014, 22:23 20
Цитата Сообщение от triish Посмотреть сообщение
только я начала ее проверять.
условие симметричности не работает до конца.
даже если матрица не симметрична, он пишет, что она симметрична.
Пример,где моя функция не сработала?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2014, 22:23
Помогаю со студенческими работами здесь

Построить симметричную матрицу и упорядочить ее по возрастанию
заданы два целых массивы чисел A(n), n&lt;=300 B(m), m&lt;=300. Разработать программу, которая строит...

Создать программу выводящую симметричную матрицу на экран
Помогите пожалуйста !

Составить матрицу, симметричную данной относительно побочной диагонали
Дана квадратная матрица А. Как составить матрицу, симметричную данной относительно побочной...

Создать симметричную матрицу которая хранится в одномерном массиве
Хочу создать симметричную матрицу которая хранится в одномерном массиве, где построчно записаны...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru