Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/912: Рейтинг темы: голосов - 912, средняя оценка - 4.88
2 / 2 / 0
Регистрация: 10.01.2011
Сообщений: 30

Функция транспонирования матрицы

28.02.2011, 00:45. Показов 177093. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
В университете начали изучать подпрограммы, пока не могу толком в них разобраться. Необходимо написать функцию для транспонирования квадратной матрицы [5][5], значения любые, тип данных должен быть int. Библиотечные функции использовать нельзя, мы их ещё не учили. Помогите пожалуйста. Я очень путаюсь в передаче массивов по указателям, пыталась писать функцию с использованием двойного разыменования, ничего не получается, если можно, объясните как это сделать ((
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2011, 00:45
Ответы с готовыми решениями:

Функция транспонирования матрицы
Здравствуйте. Столкнулся со следующей проблемой. Написал функцию транспортировки матрицы, работает она правильно, но после отработки...

Функция транспонирования матрицы
(другими словами, просто двумерный целочисленный массив) размера rows×cols, и возвращает транспонированную матрицу MT (тоже двумерный...

Функция транспонирования матрицы
Тема неоднократно поднималась, прошу прощения, но всё же я очень начинающий на с++, и написал всё вроде просто, но он ни в какую не...

17
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
28.02.2011, 01:11
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
#include <iostream>
#include <iomanip>
 
//----------------
 
void transpose(int matrix[5][5]) //либо int matrix[][5], либо int (*matrix)[5]
{
    int t;
    for(int i = 0; i < 5; ++i)
    {
        for(int j = i; j < 5; ++j)
        {
            t = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = t;
        }
    }
}
 
//----------------
 
int main()
{
    int m[5][5] =
    {
        {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}
    };
 
    transpose(m);
 
    // вывод
    for(int i = 0; i < 5; ++i)
    {
        for(int j = 0; j < 5; ++j)
            std::cout << std::setw(4) << m[i][j];
        std::cout << '\n';
    }
 
    return 0;
}
3
2 / 2 / 0
Регистрация: 10.01.2011
Сообщений: 30
28.02.2011, 13:08  [ТС]
Спасибо, я это, в принципе, понимаю. Код немного переделала:

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
#include <iostream.h>
int trans (int(&matrix)[5][5])
  {
    int t;
    for (int i=0; i<5; i++)
       {
          for (int j=i; j<5; j++)
             {
               t=matrix[i][j];
               matrix[i][j]=matrix[j][i];
               matrix[j][i]=t;
              }
         }
     return (&matrix)[5][5];
  }
void main ()
{
int M[5][5];
int i ,j;
for (i=0; i<5; i++)
   {
      for (j=0;  j<5;  j++)
      M[i][j]=(i+23)-(j+2)
   }
M[5][5]=trans(M);
}
Так транспонируется матрица 5на5, а как транспонировать матрицу любой размерности (через функцию)?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
28.02.2011, 13:18
Самый простой способ:

Сразу после всех #include написать
C
1
#define DIM 5
В тексте программы вместо пятерок поставить DIM.
0
2 / 2 / 0
Регистрация: 10.01.2011
Сообщений: 30
28.02.2011, 13:30  [ТС]
Спасибо, а как без этого, через переменные? Я пытаюсь написать функцию с динамическим выделением памяти для массива, но у меня такой бред получается (
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
28.02.2011, 13:50
Alisson, код в студию, будем разбирать
0
2 / 2 / 0
Регистрация: 10.01.2011
Сообщений: 30
28.02.2011, 14:26  [ТС]
Мои попытки

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
#include <iostream.h>
int** transp (int **Matrix, int& n, int& m)
{
    int **Matrix2 = new int*[n];
       for (int i=0; i<n; i++)
       {
        Matrix2[i] = new int [m];
       }  
  for (i = 0; i<m; i++)
        for (int j=0; j<n; j++)
            Matrix2[i][j] = Matrix[j][i];
        int temp = n;
        n = m;
        m = temp;
    return Matrix2;
}
 
void main ()
{
int n=5;
int m=5;
int **Matrix= new int*[n];
       for (int i=0; i<n; i++)
       {
        Matrix[i] = new int [m];
       }  
    for (int i = 0; i<n; i++)
        for (int j=0; j<m; j++)
Matrix[i][j]=(i+25)-(j-2);
 
Matrix = transp (Matrix,n,m);
}
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
28.02.2011, 14:30
Alisson, создавать динамический массив внутри функции - не самая лучшая (и очевидная для других) идея. Имхо, лучше просто модифицировать начальную матрицу. Можно сделать примерно вот так:
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
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
 
void showMatrix(const char*, int**, size_t);
void transpose(int**, size_t);
void swap(void*, void*, size_t);
void errExit(size_t, const char*, ...);
 
#define safeFree(PTR) free(PTR), PTR = NULL
#define readMatrix(M, I, J) printf("Input " #M "[%u][%u]: ", I, J), scanf("%d", &M[I][J])
 
int main()
{
    size_t n;
    int** matrix;
    size_t i, j;
    
    fputs("Input n: ", stdout);
    scanf("%u", &n);
 
    if((matrix = (int**) malloc(n * sizeof(int*))) == NULL)
    errExit(1, "Can't allocate memory for %u rows.\n", n);
 
    for(i = 0; i < n; ++i)
    if((matrix[i] = (int*) malloc(n * sizeof(int))) == NULL)
        errExit(2, "Can't allocate memory for #%u row.\n", i);
 
    for(i = 0; i < n; ++i)
    for(j = 0; j < n; ++j)
        readMatrix(matrix, i, j);
 
    showMatrix("Initial matrix", matrix, n);
    
    transpose(matrix, n);
 
    showMatrix("Transposed matrix", matrix, n);
        
    for(i = 0; i < n; ++i)
    safeFree(matrix[i]);
    safeFree(matrix);
    
    exit(0);
}
 
void showMatrix(const char* prompt, int** matrix, size_t n)
{
    size_t i, j;
 
    puts(prompt);
    for(i = 0; i < n; ++i, putchar('\n'))
    for(j = 0; j < n; ++j)
        printf("%-6u", matrix[i][j]);
}
 
void transpose(int** matrix, size_t n)
{
    size_t i, j;
    for(i = 0; i < n; ++i)
    for(j = i + 1; j < n; ++j)
        swap(&matrix[i][j], &matrix[j][i], sizeof(int));
}
 
void swap(void* a, void* b, size_t size)
{
    static void* tmp = NULL;
    if((tmp = malloc(size)) == NULL)
    errExit(3, "Can't allocate memory.\n");
    
    memcpy(tmp, a, size);
    memcpy(a, b, size);
    memcpy(b, tmp, size);
    safeFree(tmp);
}
 
void errExit(size_t code, const char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vfprintf(stderr, fmt, ap);
    va_end(ap);
    if(code)
    exit(code);
}
Функции выделения/освобождения памяти в стиле С, но для С++ переделать будет несложно.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
28.02.2011, 15:07
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
#include <iostream>
#include <iomanip>
 
//----------------
 
int** new2DArray(const int m, const int n)
{
   int** arr = new int*[m];
   for(int i = 0; i < m; ++i)
      arr[i] = new int[n];
   return arr;
}
 
//---------------
void delete2DArray(int** arr, const int m)
{
   for(int i = 0; i < m; ++i)
      delete[] arr[i];
   delete[] arr;
}
 
//--------------- 
 
int** newTransposeMatrix(int** matrix, const int m, const int n) 
{
   int** res = new2DArray(n, m);
   
   for(int i = 0; i < m; ++i)    
      for(int j = 0; j < n; ++j)        
     res[j][i] = matrix[i][j];            
   
   return res;
}
 
//----------------
void print2DArray(int** arr, const int m, const int n)
{
   for(int i = 0; i < m; ++i)
   {
      for(int j = 0; j < n; ++j)
     std::cout << std::setw(4) << arr[i][j];
      std::cout << '\n';
   }   
}
//---------------
 
int main()
{
   // вводим размеры матрицы
   std::cout << "Input m: ";
   int m;
   std::cin >> m;
   
   std::cout << "Input n: ";
   int n;
   std::cin >> n;
   
   // создаём новую матрицу MxN
   int** mtrx = new2DArray(m, n);
 
   // заполняем 
   for(int i = 0; i < m; ++i)   
      for(int j = 0; j < n; ++j)      
     mtrx[i][j] = j;
              
   // выводим
   std::cout << "Matrix\n";
   print2DArray(mtrx, m, n);
 
   // получаем транспонированную матрицу и выводим её на экран
   int** tmtrx = newTransposeMatrix(mtrx, m, n);
   std::cout << "\nTranspose matrix\n";   
   print2DArray(tmtrx, n, m);
 
   // освобождаем выделенную память
   delete2DArray(mtrx, m);
   delete2DArray(tmtrx, n);
 
   return 0;
}
4
2 / 2 / 0
Регистрация: 10.01.2011
Сообщений: 30
28.02.2011, 17:01  [ТС]
Спасибо большое. Значит одной функцией здесь не обойтись ))
0
7 / 7 / 0
Регистрация: 26.05.2016
Сообщений: 2
26.05.2016, 17:35
поздно. но вдруг кому пригодится.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main(){
    int A[3][3],B[3][3], j, i;
    for (i = 0; i < 3; i++){
        for (j = 0; j < 3; j++)
            cin >> A[i][j];
    }
    for (i = 0; i < 3; i++){
        for (j = 0; j < 3; j++)
            B[i][j] = A[j][i];
    }
    for (i = 0; i < 3; i++){
        for (j = 0; j < 3; j++)
            cout << B[i][j];
        cout << endl;
    }
    system("pause");
    return 0;
}
6
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
26.05.2016, 18:29
Цитата Сообщение от HRHRHR Посмотреть сообщение
поздно. но вдруг кому пригодится.
Чем это решение принципиально отличается от уже приведённых, что пришлось поднимать тему аж пятилетней давности?
1
7 / 7 / 0
Регистрация: 26.05.2016
Сообщений: 2
15.06.2016, 22:55
ну... она намного компактнее) и ее легче понять новичкам вроде меня. вот и все
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 1
01.12.2017, 20:24
Я даже не поленился вспомнить логин и пасс от старого аккаунта, чтобы ответить тут. Принципиально отличается тем, что намного проще. Так сказать, транспонирование в чистом виде, как раз то, что нужно. Большое спасибо автору поста, что скинул своё решение. Мне очень помогло.
0
5 / 3 / 2
Регистрация: 12.09.2019
Сообщений: 270
06.04.2020, 18:33
Я тоже хотел лично поблагодарить, хоть и уже слишком поздно. Спасибо
0
0 / 0 / 0
Регистрация: 03.11.2021
Сообщений: 1
17.12.2021, 21:51
Вот это короткое решение как раз то, что мне надо. Спасибо
0
0 / 0 / 0
Регистрация: 24.05.2022
Сообщений: 1
24.05.2022, 02:21
Понимаю что пишу поздно но хочется поделится своей функцией
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
    int** Transp (int **Matrix, size_t &Height, size_t &Width)
{
//тут задаем размер транспонированной матрицы
    size_t w = Height, h = Width;
 
//создаем новую матрицу с этим размером
    int** buf = new int* [h];
    for (int i = 0; i < m; i++)
        buf[i] = new T[w];;
 
//заполняем ее присваивая числа из той матрицы что послали в функцию
    for (int i = 0; i<Height; i++)
        for (int j = 0; j<Width; j++) {
            buf[j][i] = Matrix[i][j];
        }
 
//изменяем те размеры что прислали, так как они по ссылке они не копируются а изменяются напрямую
    Height = h;
    Width = w;
 
//возвращаем транспонированную матрицу
    return buf;
}
 
//функция для вывода
    template <typename T> void show(const char* caption, T** matrix, size_t m, size_t n, int w)
{
    cout << caption;
    for (int i = 0; i < m; i++) {
        //cout << "    ";
        cout << "\t";
        for (int j = 0; j < n; j++) {
            cout << setw(w) << matrix[i][j] << "  ";
        } // for j
        cout << "\n";
    } // for i
} // show}
Эта функция транспонирования работает с задаваемым размером матрицы. Надеюсь кому-нибудь пригодится)
0
Модератор
 Аватар для long399
2882 / 1836 / 933
Регистрация: 16.10.2013
Сообщений: 5,240
Записей в блоге: 15
24.05.2022, 07:19
Цитата Сообщение от Aria0101 Посмотреть сообщение
C++
17
18
19
//изменяем те размеры что прислали, так как они по ссылке они не копируются а изменяются напрямую
    Height = h;
    Width = w;
Зачем изменять переменные, хранящие размеры исходной матрицы? Что за странное поведение функции? Она просто должна вернуть транспонированную матрицу и всё. Прежние размеры могут еще понадобиться где-то в программе, а вы их изменяете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.05.2022, 07:19
Помогаю со студенческими работами здесь

Функция транспонирования динамической матрицы N*M
Собственно сабж. Если точнее, проблема возникла с не самим алгоритмом транспонирования, а с выводом (сначала выводится обычная). Не...

Функция транспонирования квадратной матрицы
написать функцию транспонирвания квадратной матрицы (т.е. поворота исходной матрицы на 90градусов).с ее помощью определить является ли...

Не работает функция транспонирования матрицы
Я написал класс матриц. Он работает. но при использовании функции trans вместо транспонирования я получаю не измененную матрицу. ...

функция транспонирования
int** transp(int** a, int n, int m) { int i, j; int** arr = new int*; for (int i = 0; i &lt; n; ++i) arr = new int; for (i =...

Функция транспонирования
Помогите. Мне нужно написать функцию транспонирования матрицы А, (n&lt;=5). Другая функция определяет суммы элементов каждой строки....


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru