Транспонирование прямоугольной матрицы - 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.