#include<stdio.h>
void input(int n,int m,int t[][m])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
scanf("%d",&t[i][j]);
}
}
}
void put(int n,int m,int t[][m])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
printf("%d ",t[i][j]);
}
printf("\n");
}
printf("\n");
}
void trans(int n,int m,int t1[][m],int t2[][n])
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
t2[i][j]=t1[j][i];
}
}
}
void add(int n,int m,int t1[][m],int t2[][m])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
t1[i][j]+=t2[i][j];
}
}
}
void sub(int n,int m,int t1[][m],int t2[][m])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
t1[i][j]-=t2[i][j];
}
}
}
void mul(int n,int m,int q,int t1[][m],int t2[][q],int t3[][q])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<q; j++)
{
t3[i][j]=0;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<q; j++)
{
for(int k = 0; k < m; k++){
t3[i][j] += t1[i][k] * t2[k][j];
}
}
}
}
int main()
{
int n,m;
while(1){
printf("1,转置\n");
printf("2,加法\n");
printf("3,减法\n");
printf("4,乘法\n");
printf("按任意键退出\n");
int option;scanf("%d",&option);
if(option==1)
{
printf("输入矩阵1行数:");
scanf("%d",&n);
printf("输入矩阵1列数:");
scanf("%d",&m);
printf("输入矩阵:\n");
int t1[n][m];
int t2[m][n];
input(n,m,t1);
trans(n,m,t1,t2);
put(m,n,t2);
}
else if(option==2)
{
printf("输入矩阵1行数:");
scanf("%d",&n);
printf("输入矩阵1列数:");
scanf("%d",&m);
printf("输入矩阵:\n");
int t1[n][m];
input(n,m,t1);
printf("输入矩阵2行数:");
scanf("%d",&n);
printf("输入矩阵2列数:");
scanf("%d",&m);
printf("输入矩阵:\n");
int t2[n][m];
input(n,m,t2);
add(n,m,t1,t2);
printf("--------\n");
put(n,m,t1);
}
else if(option==3)
{
printf("输入矩阵1行数:");
scanf("%d",&n);
printf("输入矩阵1列数:");
scanf("%d",&m);
printf("输入矩阵:\n");
int t1[n][m];
input(n,m,t1);
printf("输入矩阵2行数:");
scanf("%d",&n);
printf("输入矩阵2列数:");
scanf("%d",&m);
printf("输入矩阵:\n");
int t2[n][m];
input(n,m,t2);
sub(n,m,t1,t2);
printf("--------\n");
put(n,m,t1);
}
else if(option==4)
{
int x1,x2,x3,p,q;
printf("输入矩阵1行数:");
scanf("%d",&n);
printf("输入矩阵1列数:");
scanf("%d",&m);
printf("输入矩阵:\n");
int t1[n][m];
input(n,m,t1);
printf("输入矩阵2行数:");
scanf("%d",&p);
printf("输入矩阵2列数:");
scanf("%d",&q);
printf("输入矩阵:\n");
int t2[p][q];
int t3[n][q];
input(p,q,t2);
mul(n,m,q,t1,t2,t3);
printf("--------\n");
put(n,q,t3);
}
else
{
return 0;
}
}
}
用二维数组保存矩阵,用双重循环输入输出和计算矩阵即可,参考
#include<stdio.h>
#include<stdlib.h>
void input_mat(int *n,int *m,int **p)
{
printf("输入矩阵行数 列数:");
scanf("%d%d",n,m);
printf("输入矩阵:\n");
*p = (int *)malloc(sizeof(int)*(*n)*(*m));
for(int i=0; i<*n; i++)
{
for(int j=0; j<*m; j++)
{
scanf("%d",(*p)+i*(*m)+j);
}
}
}
void output_mat(int n,int m,int p[n][m])
{
printf("输出\n");
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
printf("%d ",p[i][j]);
}
printf("\n");
}
}
void trans(int n,int m,int p[n][m],int q[m][n])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
q[j][i] = p[i][j];
}
}
}
void add(int n,int m,int a[n][m],int b[n][m],int c[n][m])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
c[i][j] = a[i][j] + b[i][j];
}
}
}
void sub(int n,int m,int a[n][m],int b[n][m],int c[n][m])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
c[i][j] = a[i][j] - b[i][j];
}
}
}
void mul(int n,int m,int a[n][m],int b[n][m],int c[n][m])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
c[i][j] = a[i][j] * b[i][j];
}
}
}
int main()
{
int n,m,*a,*b;
do {
printf("========菜单=======\n");
printf(" 1.矩阵转置\n");
printf(" 2.矩阵加法\n");
printf(" 3.矩阵减法\n");
printf(" 4.矩阵乘法\n");
printf(" 5.退出\n");
printf("选择1-5:");
scanf("%d", &n);
if (n==1)
{
input_mat(&n,&m,&a);
output_mat(n,m,a);
int c[n][m];
trans(n,m,a,c);
output_mat(m,n,c);
}
else if (n==2)
{
input_mat(&n,&m,&a);
input_mat(&n,&m,&b);
int c[n][m];
add(n,m,a,b,c);
output_mat(n,m,c);
}
else if (n==3)
{
input_mat(&n,&m,&a);
input_mat(&n,&m,&b);
int c[n][m];
sub(n,m,a,b,c);
output_mat(n,m,c);
}
else if (n==4)
{
input_mat(&n,&m,&a);
input_mat(&n,&m,&b);
int d[n][m];
mul(n,m,a,b,d);
output_mat(n,m,d);
}
} while (n!=5);
printf("结束\n");
}