编写函数将一个M * N的矩阵转置成 N * M 的矩阵
任务描述
本关任务:编写函数将一个
M * N的矩阵转置成一个N * M的矩阵,要求定义函数分别进行二维数组输入、输出和转置。相关知识
由
M * N个数排成的M行N列的数表称为M行N列的矩阵,简称M * N矩阵,在编程语言中可以当做二维数组来处理。转置:把矩阵
A的行换成同序数的列所得到的新矩阵B称为A的转置矩阵。定义两个二维数组如下:
int a[M][N],b[N][M];如果
3*5的矩阵A的值如下 :55 8 74 66 2332 12 1 36 5894 45 56 88 31那么矩阵A的转置矩阵B的值如下 :55 32 948 12 4574 1 5666 36 8823 58 31M和N有可能相等,也有可能不相等,针对二维数组不同的列数,定义不同的输出二维数组的函数:
void Output1(int (*b)[M],int m,int n){int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%d\t",*(*(b+i)+j));printf("\n");}}void Output2(int (*b)[N],int m,int n){int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%d\t",*(*(b+i)+j));printf("\n");}}编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,编写函数输入一个
3 * 5的矩阵,转置成一个5 * 3的矩阵,具体要求如下:
- 函数 input() 实现二维数组的输入;
- 函数 reverse() 实现二维数组的转置;
- 函数 output2() 实现转置前二维数组的输出;
- 函数 output1() 实现转置后二维数组的输出;
- 函数 main() 定义变量并调用以上子函数。
测试说明
平台会对你编写的代码进行测试。
测试输入:
55 8 74 66 23 32 12 1 36 58 94 45 56 88 31输入说明:输入
15个整数。预期输出:
55 8 74 66 2332 12 1 36 5894 45 56 88 3155 32 948 12 4574 1 5666 36 8823 58 31输出说明: 首先输出
3行5列的矩阵A; 再输出5行3列矩阵B,为矩阵A的转置矩阵,相邻两个整数之间用单个空格隔开。
开始你的任务吧,祝你成功!
数组传递的方法
#include <stdio.h>
#define M 3
#define N 5
void Input(int a[][N], int m, int n);
void reverse(int a[][N], int b[][M]);
void Output1(int a[][N], int m, int n);
void Output2(int a[][M], int m, int n);
int main()
{
int RowC[M][N], RowCT[N][M], r = M, c = N;
Input(RowC, r, c);
reverse(RowC, RowCT);
Output1(RowC, r, c);
Output2(RowCT, c, r);
return 0;
}
void Input(int a[][N], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
}
void reverse(int a[][N], int b[][M])
{
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
b[j][i] = a[i][j];
}
}
}
void Output1(int a[][N], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}
void Output2(int a[][M], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}
指针传递 的方法
#include <stdio.h>
#include <stdlib.h> // 添加头文件以使用动态内存分配函数
#define M 3
#define N 5
void Input(int (*a)[N], int m, int n);
void reverse(int (*a)[N], int (*b)[M], int m, int n);
void Output1(int (*a)[N], int m, int n);
void Output2(int (*a)[M], int m, int n);
int main()
{
int (*RowC)[N], (*RowCT)[M], r = M, c = N;
// 动态分配内存给RowC和RowCT
RowC = malloc(r * sizeof(*RowC));
RowCT = malloc(c * sizeof(*RowCT));
// 分配内存后,检查内存分配是否成功
if (RowC == NULL || RowCT == NULL)
{
printf("内存分配失败\n");
return 1;
}
Input(RowC, r, c);
reverse(RowC, RowCT, r, c);
Output1(RowC, r, c);
Output2(RowCT, c, r);
// 释放动态分配的内存
free(RowC);
free(RowCT);
return 0;
}
void Input(int (*a)[N], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
}
void reverse(int (*a)[N], int (*b)[M], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
b[j][i] = a[i][j];
}
}
}
void Output1(int (*a)[N], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
void Output2(int (*a)[M], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}