Транспонирование прямоугольной матрицы - C (СИ)
Формулировка задачи:
Доброго времени суток!
Возникла проблема при транспонировании прямоугольной матрицы. Транспонировать квадратную матрицу могу, но вот с прямоугольной проблема. Подскажите как написать, так, что бы транспонировалась прямоугольная матрица.
Заранее спасибо!
Функция транспонирования отдельно:
#include <stdio.h> #include <stdlib.h> void EnterMatrix_B(int *A, int *B); // прямокутна матриця void print(int **matrix, int a, int b); // виведення матриці на екран void transpMatrix(int a, int b); // транспонування матриці В static int **matrixB; int main(void) { int a, b; EnterMatrix_B(&a, &b); // введення прямокутної матриці print(matrixB, a, b); // виведення матриці на екран transpMatrix(a, b); // транспонування матриці free(matrixB); return 0; } EnterMatrix_B(int *A, int *B) // створення двомірного динамічного масиву (прямокутня матриця В) { char space; // для вилучення пробілу з буфера введення int i, j; // лічильники printf("Enter your height of rectangular matrix B: "); scanf("%d", &*A); // введення довжини стовбців printf("Enter your length of rectangular matrix B: "); scanf("%d", &*B); // введення кількості рядків matrixB = (int**)calloc(*A, sizeof(int*)); // виділення пам'яті для масиву вказівників (а елемантів) for(i = 0; i < *A; i++) { matrixB[i] = (int*)calloc(*B, sizeof(int)); // елементу масиву присвоюється b кількість комірок printf("Enter number [%d]:\n", i); for(j = 0; j < *B; j++) // вводяться значення в масив { printf("[%d][%d]=", i, j); scanf("%d%c", &matrixB[i][j], &space); } } } transpMatrix(int a, int b) // транспонування матриці В { int i, j; int temp; printf("Transposition of matrix B:\n"); for(i = 0; i < a; i++) for(j = i; j < b; j++) { temp = matrixB[i][j]; matrixB[i][j] = matrixB[j][i]; matrixB[j][i] = temp; } print(matrixB, a, b); } void print(int **matrix, int a, int b) // виведення матриці { int i, j; for(i = 0; i < a; i++) { for(j = 0; j < b; j++) printf("%4d", matrix[i][j]); printf("\n"); } }
transpMatrix(int a, int b) // транспонування матриці В { int i, j; int temp; for(i = 0; i < a; i++) for(j = i; j < b; j++) { temp = matrixB[i][j]; matrixB[i][j] = matrixB[j][i]; matrixB[j][i] = temp; } print(matrixB, a, b); }
Решение задачи: «Транспонирование прямоугольной матрицы»
textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int **transp (int n, int m, int **a) { //a[n][m] => at[m][n] int **at=(int**)malloc(m*sizeof(int *)); int i,j; if (at==NULL) return NULL; for (i=0; i<m; i++) { at[i]=(int*)malloc(n*sizeof(int)); if (at[i]==NULL) return NULL; } for (i=0; i<n; i++) for (j=0; j<m; j++) at[j][i]=a[i][j]; return at; } void print_matrix(int n,int m,int **a) { int i,j; for (i=0; i<n; i++) { printf ("\n"); for (j=0; j<m; j++) printf ("%d ",a[i][j]); } } int main () { const int n=3,m=2; int **a,i,j; a=(int**)malloc(n*sizeof(int *)); for (i=0; i<n; i++) a[i]=(int*)malloc(m*sizeof(int)); a[0][0]=1; a[0][1]=2; a[1][0]=3; a[1][1]=4; a[2][0]=5; a[2][1]=6; print_matrix(n,m,a); int **at=transp(n,m,a); print_matrix(m,n,at); fflush(stdin); getchar(); return 0; }
Объяснение кода листинга программы
- Объявлены две функции:
transp
иprint_matrix
. - В функции
transp
выделяется память под массив указателей на int с помощьюmalloc
, затем в цикле выделяется память под каждый int. - В функции
transp
происходит транспонирование матрицыa
в матрицуat
. - В функции
print_matrix
происходит вывод элементов матрицыa
на экран. - В функции
main
создается матрицаa
с помощьюmalloc
, затем заполняется значениями 1,2,3,4,5,6. - Вызывается функция
print_matrix
для вывода начальной матрицы. - Создается транспонированная матрица
at
с помощью функцииtransp
. - Вызывается функция
print_matrix
для вывода транспонированной матрицы. - В конце программы вызывается функция
fflush
для очистки буфера ввода и вывода, иgetchar
для ожидания нажатия любой клавиши. - Программа завершается возвратом значения 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д