高级语言程序设计 实验报告三:编写矩阵运算函数

内容:
1.编写矩阵定义、初始化函数;
2.编写矩阵加法函数;
3.编写矩阵减法函数;
4.编写矩阵乘法函数;
5.编写求矩阵均值函数;
6.编写求一个矩阵的子阵函数;
7.编写矩阵输出函数;
8.编写主控函数;

代码:

#include<stdio.h>
#include<stdlib.h>
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);//矩阵加(A=B+C)
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C);//矩阵减(A=B-C)
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C);//矩阵乘(A=BC)
double MeanMatrix(Matrix *T);//矩阵元素均值
int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol);//求T1的子矩阵T2
int main()//主函数
{
	int i,row,col,BeginRow,EndRow,BeginCol,EndCol,go=1;
	double mean;
	Matrix T,T1,T2,A,B,C;
    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");
	do{ 
	printf("请输入数字:");
	scanf("%d",&i);
	switch(i)
	{
	case 1:
        InputMatrix(&T);
		printf("矩阵元素平均值为\n");
		mean=MeanMatrix(&T);
		printf("%lf",mean);
        printf("\n") ;
		break;
	case 2:
		printf("请输入矩阵的行数与列数,格式为“行 列:”");
	    scanf("%d %d",&row,&col);
        InitialMatrixRand(&T,row,col);
		printf("您获得了一个随机数矩阵\n");
        PrintfMatrix(&T);
		mean=MeanMatrix(&T);
		printf("矩阵元素平均值为\n");
		printf("%lf",mean);
printf("\n") ;
		break;
	case 3:
		printf("输入第一个矩阵\n");
        InputMatrix(&B);
		printf("输入第二个矩阵\n");
		InputMatrix(&C);
		initialMatrixZero(&A,B.row,B.col);
		AddMatrix(&A,&B,&C);
		printf("它们的和是\n");
		PrintfMatrix(&A);
		break;
	case 4:
		printf("输入第一个矩阵\n");
        InputMatrix(&B);
		printf("输入第二个矩阵\n");
		InputMatrix(&C);
		initialMatrixZero(&A,B.row,B.col);
		MinusMatrix(&A,&B,&C);
		printf("它们的差是\n");
		PrintfMatrix(&A);
		break;
	case 5:
		printf("注意:前后输入的矩阵要保证行列数满足:第一个mxn,第二个nxm\n");
		printf("输入第一个矩阵\n");
        InputMatrix(&B);
		printf("输入第二个矩阵\n");
		InputMatrix(&C);
		initialMatrixZero(&A,B.row,B.col);
		MultiMatrix(&A,&B,&C);
		printf("它们的积是\n");
		PrintfMatrix(&A);
		break;
	case 6:
		printf("请输入矩阵的行数与列数,格式为“行 列:”");
	    scanf("%d %d",&row,&col);
        InitialMatrixRand(&B,row,col);
		InitialMatrixRand(&C,row,col);
		printf("您获得了两个个随机数矩阵\n");
        PrintfMatrix(&B);
		printf("和\n");
		PrintfMatrix(&C);
		initialMatrixZero(&A,row,col);
		AddMatrix(&A,&B,&C);
		printf("它们的和是\n");
		PrintfMatrix(&A);
		break;
	case 7:
		printf("请输入矩阵的行数与列数,格式为“行 列:”");
	    scanf("%d %d",&row,&col);
        InitialMatrixRand(&B,row,col);
		InitialMatrixRand(&C,row,col);
		printf("您获得了两个个随机数矩阵\n");
        PrintfMatrix(&B);
		printf("和\n");
		PrintfMatrix(&C);
		initialMatrixZero(&A,row,col);
		MinusMatrix(&A,&B,&C);
		printf("它们的差是\n");
		PrintfMatrix(&A);
		break;
	case 8:
		printf("请输入矩阵的行数与列数,格式为“行 列:”");
	    scanf("%d %d",&row,&col);
        InitialMatrixRand(&B,row,col);
		InitialMatrixRand(&C,row,col);
		printf("您获得了两个个随机数矩阵\n");
        PrintfMatrix(&B);
		printf("和\n");
		PrintfMatrix(&C);
		initialMatrixZero(&A,row,col);
		MultiMatrix(&A,&B,&C);
		printf("它们的积是\n");
		PrintfMatrix(&A);
		break;
	case 9:
		printf("请输入矩阵的行数与列数,格式为“行 列:”");
	    scanf("%d %d",&row,&col);
        InitialMatrixRand(&T1,row,col);
		printf("您获得了一个随机数矩阵\n");
        PrintfMatrix(&T1);
		printf("请输入子阵的起始行,结束行,起始列,结束列,用空格分隔:\n");
		scanf("%d %d %d %d",&BeginRow,&EndRow,&BeginCol,&EndCol);
		InitialMatrix(&T2,EndRow-BeginRow+1,EndCol-BeginRow+1);
		SubMatrix(&T1,&T2,BeginRow,BeginCol,EndRow,EndCol);
		printf("你获得了这个子式:\n");
		PrintfMatrix(&T2);
		break;
	case 0:
		printf("程序结束");
		go=0;
	}
    }while(go);
    return 0;
}
void InitialMatrix(Matrix *T,int row,int col)//定义矩阵并且申请动态内存
{
	int i;
	T->row=row;
	T->col=col;
	T->mat=(double**)malloc(row*sizeof(double*));
	for(i=0;i<row;i++)
	{
		T->mat[i]=(double*)malloc(col*sizeof(double));
	}
}
void initialMatrixZero(Matrix *T,int row,int col)//初始化为0
{
	int i,j;
	InitialMatrix(T,row,col);
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			T->mat[i][j]=0;
		}
	}
}
void InitialMatrixRand(Matrix *T,int row,int col)//初始化为50以内的随机正整数
{
	int i,j;
	InitialMatrix(T,row,col);
	srand(NULL);
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			T->mat[i][j]=rand()%50+1;
		}
	}
}
void InputMatrix(Matrix *T)//键盘输入矩阵
{
    int i,j,row,col;
	printf("请输入矩阵的行数与列数,格式为“行 列:”");
	scanf("%d %d",&row,&col);
	InitialMatrix(T,row,col);
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
		    printf("请输入第%d行,第%d列的数:",i+1,j+1);
			scanf("%lf",&T->mat[i][j]);
		}
	}
}
void DestroyMatrix(Matrix *T)//释放矩阵空间
{
	int i;
	for(i=0;i<T->row;i++)
	{
		free(T->mat[i]);
	}
	free(T->mat);
}
void PrintfMatrix(Matrix *T)//矩阵输出
{
	int i,j;
	for(i=0;i<T->row;i++)
	{
		for(j=0;j<T->col;j++)
		{
			printf("%lf ",T->mat[i][j]);
		}
		printf("\n");
	}
}
int AddMatrix(Matrix *A,Matrix *B,Matrix *C)//矩阵加(A=B+C)
{
	int i,j;
	for(i=0;i<A->row;i++)
	{
		for(j=0;j<A->col;j++)
		{
			A->mat[i][j]=B->mat[i][j]+C->mat[i][j];
		}
	}
	return 1;
}
int MinusMatrix(Matrix *A,Matrix *B,Matrix *C)//矩阵减(A=B-C)
{
	int i,j;
	for(i=0;i<A->row;i++)
	{
		for(j=0;j<A->col;j++)
		{
			A->mat[i][j]=B->mat[i][j]-C->mat[i][j];
		}
	}
	return 1;
}
int MultiMatrix(Matrix *A,Matrix *B,Matrix *C)//矩阵乘(A=BC)
{
	int i,j,k;
	double m;
	for(i=0;i<A->row;i++)
	{
		for(j=0;j<A->col;j++)
		{
			for(k=0;k<B->col;k++)
			{
				m=B->mat[i][k]*C->mat[k][j];
				A->mat[i][j]+=m;
			}
		}
	}
	return 1;
}
double MeanMatrix(Matrix *T)//矩阵元素均值
{
	int i,j;
	double sum,mean;
	sum=0;
	for(i=0;i<T->row;i++)
	{
		for(j=0;j<T->col;j++)
		{
			sum+=T->mat[i][j];
		}
	}
	mean=sum/(T->row*T->col);
	return mean;
}
int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol)//求T1的子矩阵T2
{
    int i,j;
	int m=0,n=0;
	for(i=BeginRow-1;i<EndRow;i++)
	{
		for(j=BeginCol-1;j<EndCol;j++)
		{
			T2->mat[m][n]=T1->mat[i][j];
			n++;
		}
		m++;
	}
	return 1;
}
  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值