栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

#ex10 C语言标准实验报告

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

#ex10 C语言标准实验报告

实验内容:

上机完成以下编程实验,调试运行程序并完成报告。

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

主要函数和结构参考原型如下:

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;imat+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;imat+i))+j)=0;
		}
	}
	return ;
}
void InitialMatrixRand(Matrix *T,int row, int col)
{
	int i,j;
	for(i=0;imat+i))+j)=rand()%50+1;
		}
	}
	return ;
}
void InputMatrix(Matrix *T)
{
	int i,j;
	double x;
	for(i=0;irow;i++)
	{
		for(j=0;jcol;j++)
		{
			scanf("%lf",&x);
			*((*(T->mat+i))+j)=x;
		}
	}
	return ;
}
void DestroyMatrix(Matrix *T)
{
	int i;
	for(i=0;irow;i++)
		free(*(T->mat+i));
	free(T->mat);
	return ;
}
void PrintfMatrix(Matrix *T)
{
	int i,j;
	for(i=0;irow;i++)
	{
		for(j=0;jcol;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;jcol;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;irow;i++)
	{
		for(j=0;jcol;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)的码图,所以有些小出入也无所谓。

在选择功能界面,加入了更多换行及多了一行水平星星分隔线;

在选择功能,加入了“选择功能错误”一反馈;

在矩阵加减法功能,输入的行、列默认是两个矩阵的行、列,而不是分别输入两个矩阵行、列。减少了“判断错误”一步;

在矩阵乘法功能,加入了“判断两矩阵是否能相乘 的 错误情况”;

等等……

求实求真,大气大为。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629656.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号