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

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

Войти
Регистрация
Восстановить пароль
 
Njkzy
29 / 29 / 14
Регистрация: 29.04.2011
Сообщений: 149
Завершенные тесты: 1
#1

Транспонирование матрицы - C++

21.05.2016, 16:54. Просмотров 163. Ответов 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
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
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
    int n, m;
    cout << "Ввести колличество строк: ";
    cin >> n;
    cout << "Ввести колличество столбцов: ";
    cin >> m;
    int **a = new int*[n];  //колличество строк
    for (int i = 0; i < n; i++) // колличество столбцов
        a[i] = new int[m];
     
    //заполняем матрицу
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << "a[" << i << "][" << j << "]: ";
            cin >> a[i][j];
        }
    }
 
    //Вывод матрицы
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << a[i][j] << " ";         
        }
        cout << endl;
    }
    //Должно получиться
    cout << "Должно получиться\n1 4\n2 5\n3 6\n";
 
    //Транспонируем матрицу
    int **b = new int*[n];
    for (int i = 0; i < n; i++)
        b[i] = new int[m];
//  int buff;
    if(n==m)
    {   
        cout << "Матрица квадратная:\n";
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                b[j][i] = a[i][j];  //Транспонируем матрицу
            }
        }
        
    }
    else
    {   
        cout << "Матрица не квадратная\n";
        //Удаление матрицы
        for (int i = 0; i < n; i++)
            delete[]b[i];
        //Заново инициализируем матрицу
        int **b = new int*[m];
        for (int i = 0; i < m; i++)
            b[i] = new int[n];
        //Транспонируем
        for (int i = 1; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (j < n && i < n)
                    b[i][j] = a[j][i];
                if (j >= n && i < n)
                    b[j][i] = a[i][j];
                if (i >= n &&j >= n)
                    b[i][j - 1] = a[i-1][j];
            }
        }
 
        //Снова удаляем уже за ненадобностью
        
    }
 
 
    cout <<"Транспонированная матрица"<< endl;
    //Вывод транспонированной матрицы
 
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << b[i][j] << " ";
        }
        cout << endl;
    }
 
 
    for (int i = 0; i < n; i++)
        delete[]a[i];
    for (int i = 0; i < n; i++)
        delete[]b[i];
 
    system("pause");
    return 0;
}
Проверка алгоритма
i=0 j=0
b-0-0 = a-0-0 _=_ 1
i=0 j=1
b-0-1 = a-1-0 _=_ 4
i=0 j=2
b-2-0 = a-0-2 _=_ 3
i=1 j=0
b-1-0 = a-0-1 _=_ 2
i=1 j=1
b-1-1 = a-1-1 _=_ 5
i=1 j=2
b-2-1 = a-1-2 _=_ 6
i=2 j=0
b-2-0 = a-0-2 _=_ 3
i=2 j=1
b-2-1 = a-1-2 _=_ 6
i=2 j=2
b-2-1 = a-1-2 _=_ 6

Результат работы программы
Миниатюры
Транспонирование матрицы  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2016, 16:54     Транспонирование матрицы
Посмотрите здесь:

Транспонирование матрицы - C++
Есть матрица M*N, её требуется транспонировать относительно побочной диагонали. Использую дополнительную матрицу N*M для...

Транспонирование матрицы. - C++
Помогите с простенькой задачей!! ПОЖАЛУЙСТА Нужно написать программу на С++, которая осуществляет: 1. Консольный ввод/вывод...

Транспонирование матрицы - C++
Всем доброй ночи, пытаясь решить тривиальную задачу - столкнулся с трудностями : квадратные матрицы мой код транспонирует, а с...

Транспонирование матрицы - C++
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void transponirovanie(int**mass1, int stolb, int str) {int **mass2; int i,j; ...

Транспонирование матрицы - C++
Здравствуйте, не могу разобраться в чем у меня ошибка. Валится на 3 итерации при входных данных 3,2 Восклицательными знаками выделил...

Транспонирование матрицы - C++
int _tmain(int argc, _TCHAR* argv) { const int n=5; int a; srand(GetTickCount()); for (int i=0; i &lt; n; i++) for (int j=0; j...

транспонирование матрицы - C++
Имеется матрица размерности(6 на 3) необходимо ее транспонировать! вот мой код count=3; n=6; void __fastcall...

Транспонирование матрицы - C++
Помогите пожалуйста разобраться. Транспонирована ли матрица в заданном коде? Точнее, что является транспонированием в заданном коде. ...

Транспонирование матрицы - C++
Начал писать курсовик, мое задание такое: Создайте приложение для работы с квадратными матрицами, порядок которых достаточно высок,...

Транспонирование матрицы - C++
Что-то я совсем запуталась,не могу понять как транспонировать матрицу:/ --Вызвать функцию transpose(), формирующую матрицу b,...

Транспонирование матрицы - C++
Здравствуйте! Пишу функцию для транспонирования матрицы... Вот код: void tran(){ int n,m; cout &lt;&lt; &quot;Введите кол-во строк: &quot;; ...

Транспонирование матрицы - C++
Проверьте свойство (A^T)^T = А, где A – исходная матрица (n х n), Т означает транспонирование. Используйте процедуру транспониро- вания...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 1
21.05.2016, 19:25     Транспонирование матрицы #2
А почему бы сразу матрицу b не сделать m на n?
А то Вы потеряли память не выполнив
C++
1
delete[] b;
А в транспонировании Вы перемудрили
C++
1
2
3
for (int i = 0; i < n; i++)
   for (int j = 0; j < m; j++)
      b[j][i] = a[i][j];
Njkzy
29 / 29 / 14
Регистрация: 29.04.2011
Сообщений: 149
Завершенные тесты: 1
22.05.2016, 00:36  [ТС]     Транспонирование матрицы #3
Цитата Сообщение от zss Посмотреть сообщение
А то Вы потеряли память не выполнив
Почему не выполнил? В 60-61 строках, а также в 100-101 строках матрица b удаляется
Цитата Сообщение от zss Посмотреть сообщение
А в транспонировании Вы перемудрили
C++
1
2
3
for (int i = 0; i < n; i++)
* *for (int j = 0; j < m; j++)
* * * b[j][i] = a[i][j];
Для квадратной матрицы это работает, а вот для матрицы a с 2 строками и 3 столбцами этот код уже будет считать неверные значения
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 1
22.05.2016, 06:31     Транспонирование матрицы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Njkzy Посмотреть сообщение
матрица b удаляется
Вы удалили значения матрицы, а про вектор указателей, выделенный оператором
int **b = new int*[n];
забыли.

Цитата Сообщение от Njkzy Посмотреть сообщение
этот код уже будет считать неверные значения
С чего бы это!
У матрицы b - n столбцов и m строк.
У матрицы a - m столбцов и n строк.

Вот рабочий код
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
#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "rus");
    int n, m;
    cout << "Ввести количество строк: ";
    cin >> n;
    cout << "Ввести количество столбцов: ";
    cin >> m;
    int **a = new int*[n];
    for (int i = 0; i < n; i++)
        a[i] = new int[m];
 
    //заполняем матрицу
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << "a[" << i << "][" << j << "]: ";
            cin >> a[i][j];
        }
    }
 
    //Вывод матрицы
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";         
        cout << endl;
    }
 
    //Транспонируем матрицу
    int **b = new int*[m];
    for (int i = 0; i < m; i++)
        b[i] = new int[n];
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            b[i][j] = a[j][i];
    }
    cout <<"Транспонированная матрица"<< endl;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            cout << b[i][j] << " ";
        cout << endl;
    }
 
    for (int i = 0; i < n; i++)
        delete[]a[i]; // удаляем строки
    delete[] a; // удаляем указатели
    for (int i = 0; i < m; i++)
        delete[] b[i];
    delete[] b;
    system("pause");
    return 0;
}
Njkzy
29 / 29 / 14
Регистрация: 29.04.2011
Сообщений: 149
Завершенные тесты: 1
22.05.2016, 06:59  [ТС]     Транспонирование матрицы #5
Цитата Сообщение от zss Посмотреть сообщение
Вы удалили значения матрицы, а про вектор указателей, выделенный оператором
int **b = new int*[n];
забыли.
Ну ни то, что бы забыл,просто сайт на котором я вычитал про динамические двумерные массивы, меня к такому не готовил
В общем спасибо за помощь все заработало.
Yandex
Объявления
22.05.2016, 06:59     Транспонирование матрицы
Ответ Создать тему
Опции темы

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