下面是乘法的代码:
#include <stdio.h>
struct mtx{//构造矩阵结构体
int x;
int y;
float dat[101];
}mx0,mx1;
void prtfmtx(struct mtx mx){//格式化输出矩阵
float *tp=mx.dat;
int tmp=mx.x*mx.y;
for(int a=0;a<tmp;a++){
printf("%.1f",*tp++);
if((a+1)%mx.y==0){
printf("\n");
}else{
printf(",");
}
};
}
struct mtx scfmtx(char name){//格式化输入矩阵
struct mtx mx;
printf("行列式%c :\n",name);
printf("输入行数:");
scanf("%d",&mx.x);
printf("输入列数:");
scanf("%d",&mx.y);
printf("输入数据:\n");
int a,tmp=mx.x*mx.y;
for(a=0;a<tmp;a++){
scanf("%f",&mx.dat[a]);
};
printf("行列式%c :\n",name);
prtfmtx(mx);//传入变量x,y,a[0],a[1]...等等,而非结构体mx这就是C的特点,传入数量,而非变量.如需改变被传入数据,可采用返回值
return mx;
}
void init(){
printf("矩阵乘法(最多10行10列)\n");
mx0=scfmtx('M');
//printf("mx0.y=%d...\n",mx0.y);
mx1=scfmtx('N');
//printf("mx1.y=%d...\n",mx1.y);
if(mx0.y!=mx1.x){
printf(" M 的列数必须等于 N 的行数");
}
}
struct mtx mxmtp(){//实现mx0*mx1
struct mtx mx;
float tmpdt[11][11];
int tmp=mx1.x*mx1.y,mtp=0;
for(int a=0;a<mx1.x;a++){//将mx1转置
for(int b=0;b<mx1.y;b++){
tmpdt[b][a]=mx1.dat[mtp++];
}
}
float s=0,*sp=mx0.dat,*tp;
mtp=0;
for(int a=0;a<mx0.x;a++){
for(int b=0;b<mx1.y;b++){
tp=sp;
for(int c=0;c<mx0.y;c++){//mx0每行乘mx1各行
s+=tmpdt[b][c]*(*sp++);
}
mx.dat[mtp]=s;
s=0;mtp++;
sp=tp;
}
sp+=mx0.y;
}
mx.x=mx0.x;
mx.y=mx1.y;
return mx;
}
void main(void) {
init();
printf("\n单击回车键继续");
getchar();
getchar();
printf("\n结果为:\n");
prtfmtx(mxmtp());
}
#include <stdio.h>
struct mtx{//构造矩阵结构体
int x;
int y;
float dat[101];
}mx0,mx1;
void prtfmtx(struct mtx mx){//格式化输出矩阵
float *tp=mx.dat;
int tmp=mx.x*mx.y;
for(int a=0;a<tmp;a++){
printf("%.1f",*tp++);
if((a+1)%mx.y==0){
printf("\n");
}else{
printf(",");
}
};
}
struct mtx scfmtx(char name){//格式化输入矩阵
struct mtx mx;
printf("行列式%c :\n",name);
printf("输入行数:");
scanf("%d",&mx.x);
printf("输入列数:");
scanf("%d",&mx.y);
printf("输入数据:\n");
int a,tmp=mx.x*mx.y;
for(a=0;a<tmp;a++){
scanf("%f",&mx.dat[a]);
};
printf("行列式%c :\n",name);
prtfmtx(mx);//传入变量x,y,a[0],a[1]...等等,而非结构体mx这就是C的特点,传入数量,而非变量.如需改变被传入数据,可采用返回值
return mx;
}
void init(){
printf("矩阵乘法(最多10行10列)\n");
mx0=scfmtx('M');
//printf("mx0.y=%d...\n",mx0.y);
mx1=scfmtx('N');
//printf("mx1.y=%d...\n",mx1.y);
if(mx0.y!=mx1.x){
printf(" M 的列数必须等于 N 的行数");
}
}
struct mtx mxmtp(){//实现mx0*mx1
struct mtx mx;
float tmpdt[11][11];
int tmp=mx1.x*mx1.y,mtp=0;
for(int a=0;a<mx1.x;a++){//将mx1转置
for(int b=0;b<mx1.y;b++){
tmpdt[b][a]=mx1.dat[mtp++];
}
}
float s=0,*sp=mx0.dat,*tp;
mtp=0;
for(int a=0;a<mx0.x;a++){
for(int b=0;b<mx1.y;b++){
tp=sp;
for(int c=0;c<mx0.y;c++){//mx0每行乘mx1各行
s+=tmpdt[b][c]*(*sp++);
}
mx.dat[mtp]=s;
s=0;mtp++;
sp=tp;
}
sp+=mx0.y;
}
mx.x=mx0.x;
mx.y=mx1.y;
return mx;
}
void main(void) {
init();
printf("\n单击回车键继续");
getchar();
getchar();
printf("\n结果为:\n");
prtfmtx(mxmtp());
}