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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 13:40     Сделать симметричную матрицу несимметричной. Где ошибка? #1
условие: условие: дана квадратичная матрица 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");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2014, 13:40     Сделать симметричную матрицу несимметричной. Где ошибка?
Посмотрите здесь:

C++ КАК СОСТАВИТЬ МАТРИЦУ, СИММЕТРИЧНУЮ ДАННОЙ!!!
C++ Получить действительную матрицу С{c[i][j]} где i=1,2,...,20; j=1,2,...,10 по правилу: c[i][j]=a[j]/(1+|b[i]|).
C++ Отсортировать матрицу и снова сделать из нее начальную матрицу
C++ Вывести на экран количество слов где первая и последняя буквы одинаковы (не понимаю где ошибка)
C++ Получить матрицу A(B-E)+C, где Е-единичная матрица порядка n, а элементы матрицы C вычисляются по формуле
C++ Подскажите, где может быть ошибка (структуры)? (скорее всего где-то амперсенд нужен, все вроде проверил)
Создать программу выводящую симметричную матрицу на экран C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
16.01.2014, 23:22  [ТС]     Сделать симметричную матрицу несимметричной. Где ошибка? #21
матрицу ввожу, я знаю, что она не семмитрична.
он пишет, что она симметрична.

или тебе скрин сделать?

Цитата Сообщение от S_el Посмотреть сообщение
Пример,где моя функция не сработала?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S_el
Нарушитель
2042 / 1549 / 298
Регистрация: 15.12.2013
Сообщений: 6,100
16.01.2014, 23:26     Сделать симметричную матрицу несимметричной. Где ошибка? #22
Цитата Сообщение от triish Посмотреть сообщение
или тебе скрин сделать?
Зачем,набери здесь.
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
17.01.2014, 00:15  [ТС]     Сделать симметричную матрицу несимметричной. Где ошибка? #23
ввожу матрицу:
1 1 3
2 5 6
3 6 9

выводит: симметрична
max- 1
pos - 0 0
1

========
это ведь неправильно
Цитата Сообщение от S_el Посмотреть сообщение
Зачем,набери здесь.
S_el
Нарушитель
2042 / 1549 / 298
Регистрация: 15.12.2013
Сообщений: 6,100
17.01.2014, 00:40     Сделать симметричную матрицу несимметричной. Где ошибка? #24
Цитата Сообщение от triish Посмотреть сообщение
ввожу матрицу:
1 1 3
2 5 6
3 6 9
выводит: симметрична
Мой вариант выводит:
Кликните здесь для просмотра всего текста
Vvedute n
3
1
1
3
2
5
6
3
6
9
Matrica ne simmetru4na
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
17.01.2014, 00:43  [ТС]     Сделать симметричную матрицу несимметричной. Где ошибка? #25
почему тогда у меня не работает???
и почему там 10 элементов, когда если 3х3, то 9?


Цитата Сообщение от S_el Посмотреть сообщение
Мой вариант выводит:
Кликните здесь для просмотра всего текста

Matrica ne simmetru4na
S_el
Нарушитель
2042 / 1549 / 298
Регистрация: 15.12.2013
Сообщений: 6,100
17.01.2014, 00:45     Сделать симметричную матрицу несимметричной. Где ошибка? #26
Цитата Сообщение от triish Посмотреть сообщение
и почему там 10 элементов, когда если 3х3, то 9?
Первое число размерность.Смотрите на код.
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
17.01.2014, 01:21  [ТС]     Сделать симметричную матрицу несимметричной. Где ошибка? #27
извиняюсь, туплю.

а сдвиг строки точно верный?
ввела:
1 2 3
2 5 6
3 6 9

вывел:
1 2 3
2 5 6
6 3 9

хотя по идеи должен был вывести
1 2 3
2 5 6
9 3 6


Цитата Сообщение от S_el Посмотреть сообщение
Первое число размерность.Смотрите на код.
Enotniy
 Аватар для Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
17.01.2014, 08:46     Сделать симметричную матрицу несимметричной. Где ошибка? #28
Цитата Сообщение от triish Посмотреть сообщение

потом он должен найти максимальное значение.
он его находит, но неправильное. и индекс неправильный..
а по-моему правильно, просто индекс 2 2 значит, что элемент в третьем столбце и третьей строке ( индекс с нуля идёт)
S_el
Нарушитель
2042 / 1549 / 298
Регистрация: 15.12.2013
Сообщений: 6,100
17.01.2014, 10:36     Сделать симметричную матрицу несимметричной. Где ошибка? #29
Цитата Сообщение от triish Посмотреть сообщение
вывел:
1 2 3
2 5 6
6 3 9
Неправильно вывел,ищите ошибку.

Добавлено через 42 минуты
Попробуйте так:

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
#include "stdafx.h"
# include <iostream>
using namespace std;
 
bool func_simmetr(double **arr,const int &n);
void func_sdvig(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 func_sdvig(mas,n);
 
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;
}
void func_sdvig(double **arr,const int &n)
{
    int i,j,max_index1=0;
    double temp=arr[0][0];
    cout<<" Do"<<endl;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            cout<<arr[i][j]<<"  ";
        }
    cout<<endl;
    }
 
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if(arr[i][j]>temp)
            {
                temp=arr[i][j];
                max_index1=i;
            }
 
    for(int i=0;i<n;i++)
    {
        if(i==0)
        {
        temp=arr[max_index1][i+1];
        arr[max_index1][i+1]=arr[max_index1][i];
        }
        else if(i!=0 && i!=n-1)
        {
            arr[max_index1][0]=arr[max_index1][i+1];
            arr[max_index1][i+1]=temp;
            temp=arr[max_index1][0];
        }
        if(n==2)
        {
            arr[max_index1][0]=temp;
        }
        
    }
        cout<<endl<<" Posle "<<endl;
    for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        cout<<arr[i][j]<<"  ";
    }
    cout<<endl;
}
 
 
}
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
17.01.2014, 22:58  [ТС]     Сделать симметричную матрицу несимметричной. Где ошибка? #30
индекс да, правильный.
это у меня вчера все лагало жутко.

а вот сдвиг действительно делает неправильно.
Цитата Сообщение от Enotniy Посмотреть сообщение
а по-моему правильно, просто индекс 2 2 значит, что элемент в третьем столбце и третьей строке ( индекс с нуля идёт)
ldenush
1 / 1 / 2
Регистрация: 17.02.2013
Сообщений: 12
18.01.2014, 11:45     Сделать симметричную матрицу несимметричной. Где ошибка? #31
Заинтересовался вашей задачей. Захотелось решить. Никаких премудростей здесь нет,
так как изучаю с++ всего несколько недель, может где-то можно программу сократить или улучшить.
Код может выглядит и не очень, но для введенных мною нескольких значений выдает верные результаты.

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
#include <iostream>
using namespace std;
 
const int N = 4;           //объявляем константу, выражающую количество строк и столбцов
void outM(int [N][N]);      //объявляем функцию вывода матрицы на экран
void sdvig(int [N][N]);     //объявляем функция сдвига строки с максимальным элементом
bool compareSim(int [N][N]);    //объявляем функцию, сравнивающую исходную матрицу и транспонированную
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int a[N][N] = {{1, 9, 3, 3},    //инициализация матрицы
                   {9, 7, 6, 5},    //
                   {3, 6, 7, 1},    //
                   {3, 5, 1, 2}};   //
    bool comp;          //переменная, которая скажет нам, симметрична матрица или нет
 
    cout << "Дана исходная матрица: " << endl;
    outM(a);            // вызов функции(вывод матрицы на экран)
 
    comp = compareSim(a);       //вызов ф-ции(сравнение обычной матрицы и транспонированной)
    if ( comp == 1)
        cout << "Матрица симметрична" << endl;
    else
        cout << "Матрица не симметрична" << endl;
 
    if (comp == 1)
    sdvig(a);     //вызов ф-ции(если матрица симметрична, сдвигает строку с максимальным значением)
 
    system("pause");
    return 0;
}
 
void outM(int mas[N][N])       // обычный вывод на экран
{
    for (int i = 0; i < N; i ++)
    {
        for (int j = 0; j < N; j++)
            cout << mas[i][j] << ' ';
        cout << endl << endl;
    }
}
 
 
bool compareSim(int A[N][N])            
{                                       // сравниваем каждый элемент обычной
    for (int i = 0; i < N; i++)         // матрицы c  симметричным ему элементом 
        for (int j = 0; j < N; j++)     // транспонированной матрицы
        {                               
            if (A[i][j] != A[j][i])     // возвращаем 0, если хотя бы 2 симметричных 
                return 0;               // элемента не равны
        }
    return 1;               
}
 
void sdvig(int A[N][N])             //ф-ция, сдвигающая строки с максимальным элементом
{                                   //выглядит ужасно, но работает 
    int temp;
    int max = A[0][0];      
    int imax[N], n = 0, M;  // объявляем массив(если будет несколько макс. значений),
    imax[0] = 0;            // где будет храниться номер строки с макс. элементом
 
    for (int i = 0; i < N; i++)         // просто ищем макс. элемент и 
        for (int j = 0; j < N; j++)     // запоминаем номер строки
            if (max < A[i][j])
            {
                max = A[i][j];
                imax[n] = i;
            }
 
    for (int i = 0; i < N; i++)         // тут снова перебираем все элементы 
        for (int j = 0; j < N; j++)     // и запоминаем все строки, в которых
            if (max == A[i][j])         // встречается макс. значение
                if (imax[n] != i)
                {
                    n++;
                    imax[n] = i;
                }
 
    M = n + 1;   // количество строк с макс. элементом
    for (n = 0; n < M; n++)  // сдвигаем поочередно нужные строки
    {
    temp = A[imax[n]][N - 1];  // запоминаем значение последнего элемента в строке, чтобы не потерять его
    for (int j = N - 1; j >= 0; j--)    // сам сдвиг( начинается с конца строки)
        A[imax[n]][j] = A[imax[n]][j-1];
    A[imax[n]][0] = temp;
    }
 
    cout << "Матрица со сдвинутой строкой:" << endl;
    outM(A);
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2014, 16:08     Сделать симметричную матрицу несимметричной. Где ошибка?
Еще ссылки по теме:

C++ Смоделировать на компьютере последовательность бросаний несимметричной монеты
C++ Сформировать новую матрицу В, изъяв из матрицы А строки, где находится минимальное значение
C++ Построить симметричную матрицу и упорядочить ее по возрастанию
C++ Сформировать симметричную матрицу из элементов, лежащих выше главной диагонали исходной
C++ Вычислить матрицу А в n-степени, где n - натуральное число

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

Или воспользуйтесь поиском по форуму:
triish
1 / 1 / 0
Регистрация: 16.01.2014
Сообщений: 44
18.01.2014, 16:08  [ТС]     Сделать симметричную матрицу несимметричной. Где ошибка? #32
Цитата Сообщение от S_el Посмотреть сообщение
Неправильно вывел,ищите ошибку.
спасибо большое, все работает.

Добавлено через 1 минуту
Цитата Сообщение от ldenush Посмотреть сообщение
Заинтересовался вашей задачей. Захотелось решить. Никаких премудростей здесь нет,
так как изучаю с++ всего несколько недель, может где-то можно программу сократить или улучшить.
Код может выглядит и не очень, но для введенных мною нескольких значений выдает верные результаты.
о.спасибо большое
может быть воспользуюсь вашим кодом, подправив его немного.
Yandex
Объявления
18.01.2014, 16:08     Сделать симметричную матрицу несимметричной. Где ошибка?
Ответ Создать тему
Опции темы

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