Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
#1

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

16.01.2014, 13:40. Просмотров 1139. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2014, 13:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сделать симметричную матрицу несимметричной. Где ошибка? (C++):

КАК СОСТАВИТЬ МАТРИЦУ, СИММЕТРИЧНУЮ ДАННОЙ!!! - C++
Дана квадратная матрица А. Как составить матрицу, симметричную данной относительно побочной диагонали, и записать на месте данной? Язык С....

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

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

Сформировать симметричную матрицу из элементов, лежащих выше главной диагонали исходной - C++
Сформировать из элементов А, лежащих на главной диагонали и над ней, симметричную матрицу С (квадратная матрица С -симметричная, если Сij =...

Отсортировать матрицу и снова сделать из нее начальную матрицу - C++
значит условие таково: с клавиатуры вводится ряд чисел, его нужно занести в матрицу 6х6, потом отсортировать матрицу и снова сделать из нее...

Смоделировать на компьютере последовательность бросаний несимметричной монеты - C++
Смоделировать на компьютере последовательность бросаний несимметричной монеты. Смещение центра тяжести монеты задается величиной p, 0&lt;p&lt;1,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
16.01.2014, 14:27 #2
Цитата Сообщение от triish Посмотреть сообщение
условие: условие: дана квадратичная матрица z[n][n]. составить программу, которая если матрица симметричная(транспонированная матрица равна исходной), сделает ее не симметричной, сдвинув строку, содержащую элемент с максимальным значением на 1 элемент вправо.
-------------------------------------------
Если строку на один элемент она станет не эквивалентной предыдущей. Так и надо?
0
S_el
2100 / 1611 / 308
Регистрация: 15.12.2013
Сообщений: 6,451
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
Ev_Hyper
Заблокирован
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
triish
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
Enotniy
96 / 95 / 14
Регистрация: 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
Ev_Hyper
Заблокирован
16.01.2014, 15:29 #7
Цитата Сообщение от triish Посмотреть сообщение
спасибо, но почему именно с этим индексом?
потому, что у вас максимальный объявленный индекс - 2
0
S_el
2100 / 1611 / 308
Регистрация: 15.12.2013
Сообщений: 6,451
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
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 16:54  [ТС] #9
Цитата Сообщение от Enotniy Посмотреть сообщение
вот ваш код по правленный
выводит, что матрица симметрична.
выводит максимальное значение и индекс(неправильно выводит)
и после этого не выводит больше ничего.
а должен после всего этого еще и матрицу вывести, где строка сдвинута с максимальным значением.

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

Добавлено через 45 секунд
Цитата Сообщение от S_el Посмотреть сообщение
Это лишнее.
ну так а почему лишнее?
(просто интересно)
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 17:04  [ТС] #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Для проверки на симметричность, транспонировать целиком не надо, достаточно сравнить элементы.
препод требует, что бы не было никаких отдельных функций что бы их потом вызывать в мэйне.
он говорит, что программа вообще должна быть в два цикла.
(ну и естественно все это надо будет делать в мэйне.а не отдельно функциями)



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

Цитата Сообщение от taras atavin Посмотреть сообщение
В два цикла и проверку, и поиск, и ещё сдвиг не сделаешь, надо минимум 5.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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
triish
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 17:18
Привет! Вот еще темы с ответами:

Вывести на экран количество слов где первая и последняя буквы одинаковы (не понимаю где ошибка) - C++
задан текст нужно вывести на экран количество слов где первая и последняя буквы одинаковы #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Подскажите, где может быть ошибка (структуры)? (скорее всего где-то амперсенд нужен, все вроде проверил) - C++
написать универсальный тип, который представляет точку на плоскости в координатах (х, у) и в полярных координатах. Написать функцию для...

Получить действительную матрицу С{c[i][j]} где i=1,2,...,20; j=1,2,...,10 по правилу: c[i][j]=a[j]/(1+|b[i]|). - C++
В общем у меня огромная проблема- я совсем не могу вникнуть в Си. Учусь на 1 курсе и вроде учат нормально, но все равно ничего понять не...

Вычислить матрицу А в n-степени, где n - натуральное число - C++
Вычислить матрицу А в n-степени, где n - натуральное число. Запутался, что писал дальше, помогите, пожалуйста. #include&lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.01.2014, 17:18
Ответ Создать тему
Опции темы

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