参考代码:上机完成以下编程实验,调试运行程序并完成报告。
- 编写矩阵定义、初始化函数;
- 编写矩阵加法函数;
- 编写矩阵减法函数;
- 编写矩阵乘法函数;
- 编写求矩阵均值函数;
- 编写求一个矩阵的子阵函数;
- 编写矩阵输出函数;
- 编写主控函数;
主要函数和结构参考原型如下:
typedef struct{
double ** mat;
int row;
int col;
}Matrix;
void InitialMatrix(Matrix *T, int row,int col); //只分配空间不初始化;
void InitialMatrixZero(Matrix *T,int row, int col); //初始化为0
void InitialMatrixRand(Matrix *T,int row, int col); //初始化为50以内随机正整数
void InputMatrix(Matrix *T); //键盘输入矩阵
void DestroyMatrix(Matrix *T); // 释放矩阵空间
void PrintfMatrix(Matrix *T); //矩阵输出
int AddMatrix(Matrix *A,Matrix *B,Matrix *C); // 矩阵加
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C); // 矩阵减
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C); //矩阵乘法
double MeanMatrix(Matrix *T); //矩阵元素均值
int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol); //求T1的子矩阵T2;
测试程序参考界面如下所示:
矩阵函数测试,请选择功能,输入对应的数字:
***************************************************
1:输入一个矩阵,求矩阵均值;
2:产生一个随机数矩阵,求矩阵均值;
3:输入两个个矩阵,求矩阵和;
4:输入两个个矩阵,求矩阵差;
5:输入两个个矩阵,求矩阵积;
6:产生两个个随机数矩阵,求矩阵和;
7:产生两个个随机数矩阵,求矩阵差;
8:产生两个个随机数矩阵,求矩阵积;
9:求矩阵的子阵,如矩阵的2-4行,1-3列的子阵;
0:结束!
评分标准:共10个功能要求,完成一个功能测试给8分,其余20分;
#include讲解:#include #include typedef struct{ double ** mat; int row; int col; }Matrix; void InitialMatrix(Matrix *T, int row,int col); void InitialMatrixZero(Matrix *T,int row, int col); void InitialMatrixRand(Matrix *T,int row, int col); void InputMatrix(Matrix *T); void DestroyMatrix(Matrix *T); void PrintfMatrix(Matrix *T); int AddMatrix(Matrix *A,Matrix *B,Matrix *C); int MinusMatrix(Matrix *A,Matrix *B,Matrix *C); int MultiMatrix(Matrix *A,Matrix *B,Matrix *C); double MeanMatrix(Matrix *T); int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol); int main() { srand((unsigned)time(NULL)); Matrix T,A,B,C,t; int choose,row,col,BeginRow,BeginCol,EndRow,EndCol,row1,row2,col1,col2; while(1) { printf(" 矩阵函数测试,请选择功能,输入对应的数字:n"); printf("***************************************************n"); printf(" 1:输入一个矩阵,求矩阵均值;n"); printf(" 2:产生一个随机数矩阵,求矩阵均值;n"); printf(" 3:输入两个个矩阵,求矩阵和;n"); printf(" 4:输入两个个矩阵,求矩阵差;n"); printf(" 5:输入两个个矩阵,求矩阵积;n"); printf(" 6:产生两个个随机数矩阵,求矩阵和;n"); printf(" 7:产生两个个随机数矩阵,求矩阵差;n"); printf(" 8:产生两个个随机数矩阵,求矩阵积;n"); printf(" 9:求矩阵的子阵,如矩阵的2-4行,1-3列的子阵;n"); printf(" 0:结束!n"); scanf("%d",&choose); if(choose<0||choose>9) printf("输入错误!n"); if(choose==0) break; if(choose==1) { printf("请输入矩阵的行数:"); scanf("%d",&row); printf("请输入矩阵的列数:"); scanf("%d",&col); InitialMatrix(&T,row,col); printf("请输入一个%d×%d的矩阵:n",row,col); InputMatrix(&T); printf("The Matrix is:n"); PrintfMatrix(&T); printf("The mean of the matrix is %lfn",MeanMatrix(&T)); DestroyMatrix(&T); } if(choose==2) { printf("请输入矩阵的行数:"); scanf("%d",&row); printf("请输入矩阵的列数:"); scanf("%d",&col); InitialMatrix(&T,row,col); InitialMatrixRand(&T,row,col); printf("The Matrix is:n"); PrintfMatrix(&T); printf("The mean of the matrix is %lfn",MeanMatrix(&T)); DestroyMatrix(&T); } if(choose==3) { printf("请输入矩阵的行数:"); scanf("%d",&row); printf("请输入矩阵的列数:"); scanf("%d",&col); InitialMatrix(&A,row,col); InitialMatrix(&B,row,col); InitialMatrix(&C,row,col); InitialMatrixZero(&C,row,col); printf("请输入矩阵A:n"); InputMatrix(&A); printf("请输入矩阵B:n"); InputMatrix(&B); printf("矩阵A为:n"); PrintfMatrix(&A); printf("矩阵B为:n"); PrintfMatrix(&B); printf("矩阵A与矩阵B的和为:n"); AddMatrix(&A,&B,&C); PrintfMatrix(&C); DestroyMatrix(&A); DestroyMatrix(&B); DestroyMatrix(&C); } if(choose==4) { printf("请输入矩阵的行数:"); scanf("%d",&row); printf("请输入矩阵的列数:"); scanf("%d",&col); InitialMatrix(&A,row,col); InitialMatrix(&B,row,col); InitialMatrix(&C,row,col); InitialMatrixZero(&C,row,col); printf("请输入矩阵A:n"); InputMatrix(&A); printf("请输入矩阵B:n"); InputMatrix(&B); printf("矩阵A为:n"); PrintfMatrix(&A); printf("矩阵B为:n"); PrintfMatrix(&B); printf("矩阵A与矩阵B的差为:n"); MinusMatrix(&A,&B,&C); PrintfMatrix(&C); DestroyMatrix(&A); DestroyMatrix(&B); DestroyMatrix(&C); } if(choose==5) { printf("请输入矩阵A的行数:"); scanf("%d",&row1); printf("请输入矩阵A的列数:"); scanf("%d",&col1); InitialMatrix(&A,row1,col1); printf("请输入矩阵A:n"); InputMatrix(&A); printf("请输入矩阵B的行数:"); scanf("%d",&row2); printf("请输入矩阵B的列数:"); scanf("%d",&col2); InitialMatrix(&B,row2,col2); printf("请输入矩阵B:n"); InputMatrix(&B); if(col1!=row2) { printf("输入错误!n"); } else { printf("矩阵A为:n"); PrintfMatrix(&A); printf("矩阵B为:n"); PrintfMatrix(&B); InitialMatrix(&C,row1,col2); MultiMatrix(&A,&B,&C); printf("矩阵A与矩阵B的积为:n"); PrintfMatrix(&C); DestroyMatrix(&C); } DestroyMatrix(&A); DestroyMatrix(&B); } if(choose==6) { printf("请输入要生成的随机数矩阵的行数:"); scanf("%d",&row); printf("请输入要生成的随机数矩阵的列数:"); scanf("%d",&col); InitialMatrix(&A,row,col); InitialMatrix(&B,row,col); InitialMatrix(&C,row,col); InitialMatrixRand(&A,row,col); InitialMatrixRand(&B,row,col); InitialMatrixZero(&C,row,col); printf("生成的随机数矩阵A为:n"); PrintfMatrix(&A); printf("生成的随机数矩阵B为:n"); PrintfMatrix(&B); printf("矩阵A与矩阵B的和为:n"); AddMatrix(&A,&B,&C); PrintfMatrix(&C); DestroyMatrix(&A); DestroyMatrix(&B); DestroyMatrix(&C); } if(choose==7) { printf("请输入要生成的随机数矩阵的行数:"); scanf("%d",&row); printf("请输入要生成的随机数矩阵的列数:"); scanf("%d",&col); InitialMatrix(&A,row,col); InitialMatrix(&B,row,col); InitialMatrix(&C,row,col); InitialMatrixRand(&A,row,col); InitialMatrixRand(&B,row,col); InitialMatrixZero(&C,row,col); printf("生成的随机数矩阵A为:n"); PrintfMatrix(&A); printf("生成的随机数矩阵B为:n"); PrintfMatrix(&B); printf("矩阵A与矩阵B的差为:n"); MinusMatrix(&A,&B,&C); PrintfMatrix(&C); DestroyMatrix(&A); DestroyMatrix(&B); DestroyMatrix(&C); } if(choose==8) { printf("请输入要生成的随机数矩阵A的行数:"); scanf("%d",&row1); printf("请输入要生成的随机数矩阵A的列数:"); scanf("%d",&col1); InitialMatrix(&A,row1,col1); InitialMatrixRand(&A,row1,col1); printf("请输入要生成的随机数矩阵B的行数:"); scanf("%d",&row2); printf("请输入要生成的随机数矩阵B的列数:"); scanf("%d",&col2); InitialMatrix(&B,row2,col2); InitialMatrixRand(&B,row2,col2); if(col1!=row2) { printf("输入错误!n"); } else { printf("生成的随机数矩阵A为:n"); PrintfMatrix(&A); printf("生成的随机数矩阵B为:n"); PrintfMatrix(&B); InitialMatrix(&C,row1,col2); MultiMatrix(&A,&B,&C); printf("矩阵A与矩阵B的积为:n"); PrintfMatrix(&C); DestroyMatrix(&C); } DestroyMatrix(&A); DestroyMatrix(&B); } if(choose==9) { printf("请输入矩阵的行数:"); scanf("%d",&row); printf("请输入矩阵的列数:"); scanf("%d",&col); InitialMatrix(&T,row,col); printf("请输入一个%d×%d的矩阵:n",row,col); InputMatrix(&T); printf("请输入a,b,c,d,表示求矩阵的a-b行,c-d列的子阵n"); printf("a="); scanf("%d",&BeginRow); printf("b="); scanf("%d",&EndRow); printf("c="); scanf("%d",&BeginCol); printf("d="); scanf("%d",&EndCol); printf("The Matrix is:n"); PrintfMatrix(&T); InitialMatrix(&t,EndRow-BeginRow+1,EndCol-BeginCol+1); SubMatrix(&T,&t,BeginRow-1,BeginCol-1,EndRow-1,EndCol-1); printf("矩阵的%d-%d行,%d-%d列的子阵为:n",BeginRow,EndRow,BeginCol,EndCol); PrintfMatrix(&t); DestroyMatrix(&T); DestroyMatrix(&t); } } return 0; } void InitialMatrix(Matrix *T, int row,int col) { int i; T->mat=(double **)malloc(sizeof(double*)*row); for(i=0;i mat+i)=(double *)malloc(sizeof(double)*col); } T->row=row; T->col=col; return ; } void InitialMatrixZero(Matrix *T,int row, int col) { int i,j; for(i=0;i
mat+i))+j)=0; } } return ; } void InitialMatrixRand(Matrix *T,int row, int col) { int i,j; for(i=0;i
mat+i))+j)=rand()%50+1; } } return ; } void InputMatrix(Matrix *T) { int i,j; double x; for(i=0;i
row;i++) { for(j=0;j col;j++) { scanf("%lf",&x); *((*(T->mat+i))+j)=x; } } return ; } void DestroyMatrix(Matrix *T) { int i; for(i=0;i row;i++) free(*(T->mat+i)); free(T->mat); return ; } void PrintfMatrix(Matrix *T) { int i,j; for(i=0;i row;i++) { for(j=0;j col;j++) { printf("%2.0lf ",*((*(T->mat+i))+j)); } printf("n"); } return ; } int AddMatrix(Matrix *A,Matrix *B,Matrix *C) { int i,j; for(i=0;irow;i++) { for(j=0;jcol;j++) { *((*(C->mat+i))+j)=*((*(A->mat+i))+j)+*((*(B->mat+i))+j); } } return 0; } int MinusMatrix(Matrix *A,Matrix *B,Matrix *C) { int i,j; for(i=0;irow;i++) { for(j=0;jcol;j++) { *((*(C->mat+i))+j)=*((*(A->mat+i))+j)-*((*(B->mat+i))+j); } } return 0; } int MultiMatrix(Matrix *A,Matrix *B,Matrix *C) { int i,j,k; for(i=0;irow;i++) { for(j=0;j col;j++) { for(k=0;kcol;k++) *((*(C->mat+i))+j)+=(*((*(A->mat+i))+k))*(*((*(B->mat+k))+j)); } } return 0; } double MeanMatrix(Matrix *T) { double mean=0; int i,j; for(i=0;i row;i++) { for(j=0;j col;j++) { mean+=*((*(T->mat+i))+j); } } mean/=(T->row*T->col); return mean; } int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol) { int i,j; for(i=BeginRow;i<=EndRow;i++) { for(j=BeginCol;j<=EndCol;j++) { *((*(T2->mat+i-BeginRow))+j-BeginCol)=*((*(T1->mat+i))+j); } } return 0; }
不知不觉已经到了14周,非新生项目课的小伙伴C语言实验报告是不是马上就要上交了呢?
Part 1. void InitialMatrix(Matrix *T, int row,int col)
在此函数中,运用了两次malloc()函数来动态分配内存,方便在重复运行时可以节约内存。关于内存分配的逻辑,用下图简略说明一下。
第一次分配,相当于将T->mat(类型为double**,二级指针)指向了长度为row的一块地址(红色部分)的首地址,该部分地址的元素类型是double*,仍是指针。第二次分配,将红色部分的每一个指针,都分别指向了长度为col的一块地址(蓝色部分)的首地址,该部分地址的元素类型是double,即用来存储矩阵中的元素。两次分配,实现了将T->mat总体指向了一个row行、col列的矩阵。
之后将row和col存入T中,方便后续使用。
Part 2. void InitialMatrixZero(Matrix *T,int row, int col)
用双重循环将矩阵元素清零初始化,这个不必多讲吧
Part 3. void InitialMatrixRand(Matrix *T,int row, int col)
随机初始化,这个在之前的随机数置换题目中有提到过,主要用到了time(),rand(),srand()等函数。
srand((unsigned)time(NULL))目的是提供以当前计算机时间为基础的种子。由于时间是一直变化的,所以rand()函数可以得到不同的数值,实现随机数的生成。而报告要求生成50以内随机正整数,所以需要在rand()的基础上%50+1。
Part 4 & Part 6. void InputMatrix(Matrix *T) & void PrintfMatrix(Matrix *T)
输入、输出。在这里,因为没有传入row和col,所以需要用到之前存储进矩阵的T->row和T->col。
Part 5. void DestroyMatrix(Matrix *T)
这里需要注意的是free()的顺序,请读者自行思考。
Part 7 & Part 8. int AddMatrix(Matrix *A,Matrix *B,Matrix *C) & int MinusMatrix(Matrix *A,Matrix *B,Matrix *C)
矩阵的加法,减法。
Part 9. int MultiMatrix(Matrix *A,Matrix *B,Matrix *C)
简单的模拟了一下矩阵的乘法。看不太懂的uu不妨取一个小一点的行列,对照该部分简单想一下。
End Part. double MeanMatrix(Matrix *T) & int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol)
求均值,取子阵。相信难不到你~!
P.S.
在我的代码中,有一些部分不完全与报告要求相同,但毕竟是报告,而不是可(yan)爱(ge)的码图,所以有些小出入也无所谓。
在选择功能界面,加入了更多换行及多了一行水平星星分隔线;
在选择功能,加入了“选择功能错误”一反馈;
在矩阵加减法功能,输入的行、列默认是两个矩阵的行、列,而不是分别输入两个矩阵行、列。减少了“判断错误”一步;
在矩阵乘法功能,加入了“判断两矩阵是否能相乘 的 错误情况”;
等等……
求实求真,大气大为。



