C语言之结构体指针


第二次
掌握指针和结构、文件的结合使用。
掌握形参与实参
首先通过读书,掌握c语言文本文件的基本概念和基本操作。
熟悉文本文件的读写及fopen/fclose,fscanf/fprintf等函数。
上机练习1:将几个数字及字符串写入文件。读出并显示。
通过读书,掌握结构的基本概念;学习和实践结构数组,结构指针概念。
上机练习2:将矩阵表示为结构,成员包括:矩阵行数,列数,及指向矩阵具体元素的指针;然后重做第一课练习。

作业:使用读写文件的矩阵乘法
要求:读出指定文本文件中各矩阵,计算多矩阵相乘后结果,并将结果写入另一文本文件中。
文件名任意;如输入文件:input.txt; 输出文件out.txt
输入文件格式:将多个矩阵记录在文件中,多个矩阵以空行分隔。
类似:
1 3 2
2 5 4
3
8
12

(上述文件包括2个矩阵,分别为2*3和3*1的)
(提示:对于多矩阵,可使用结构数组/结构指针

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

int M;															//定义全局变量,表示输入矩阵的个数
/*****************************************************
定义结构体形式的矩阵
成员:行数,列数,和二维指针(指向数组)
******************************************************/
typedef struct matrix
{
	int row;
	int column;
	int **p;
}Matrix, *Matrixp;

/*****************************************************
定义结构体,表示矩阵的尺寸
成员:行数,列数
******************************************************/
typedef struct mn
{
	int m;
	int n;
}Mat, *Matp;

/*****************************************************
函数名称:read_matrixsize
函数输入参数:FILE *fp, Matp mat
函数返回值:无
函数功能:读取矩阵的大小
******************************************************/
read_matrixsize(FILE *fp, Matp mat)
{
	int flag = 0;
	int m, n;
	m = 1;
	n = 0;
	char ch;
	mat->n = mat->m = 0;
	while (!feof(fp))
	{
		fscanf(fp, "%c", &ch);
		if (ch != ' ')
		{
			if (ch == '\n')
			{
				if (flag)
				{
					m--;
					mat->m = m;
					flag = 0;
					break;
				}
				m++;
				n = 0;
				flag = 1;
			}
			else
			{
				n++;
				if(feof(fp))//循环时候先读的ch,所以最后读到末尾的标志字符,依然在循环里,需要判断
				{
					n--;
					mat->m = m;
				}
				if (mat->n < n)
				{
					mat->n = n;
				}
				flag = 0;
			}
		}
	}
}

/*****************************************************
函数名称:read_matrix
函数输入参数:Matrixp matrix1, Matp mat, FILE *fp
函数返回值:无
函数功能:读取矩阵的元素
******************************************************/
read_matrix(Matrixp matrix1, Matp mat, FILE *fp)
{
	int ch;
	matrix1->row = mat->m;
	matrix1->column = mat->n;
	for (int i = 0;i < mat->m;i++)
	{
		for (int j = 0;j < mat->n;)
		{
			fscanf(fp, "%d", &ch);//读整形数据即可
			matrix1->p[i][j] = ch;
			j++;
		}
	}
	fscanf(fp, "%c", &ch);
	fscanf(fp, "%c", &ch);//有两个回车。。。。
}

/*****************************************************
函数名称:assign_space
函数输入参数:Matrixp matrix, int m, int n
函数返回值:无
函数功能:为结构体指针分配空间
******************************************************/
assign_space(Matrixp matrix, int m, int n)
{
	matrix->row = m;
	matrix->column = n;
	matrix->p = (int **)malloc(sizeof(int *)*m);
	for (int i = 0;i < m;i++)
	{
		matrix->p[i] = malloc(sizeof(int)*n);
	}
}

/*****************************************************
函数名称:matrix_mul
函数输入参数:Matrixp matrix1, Matrixp matrix2, Matrixp matrix3
函数返回值:无
函数功能:完成矩阵的乘法
******************************************************/
matrix_mul(Matrixp matrix1, Matrixp matrix2, Matrixp matrix3)
{
	for (int i = 0;i < M;i++)
	{
		for (int j = 0;j < matrix1->column;j++)
		{
			matrix3->p[i][j] = 0;
			for (int k = 0;k < matrix1->row;k++)
			{
				matrix3->p[i][j] += ((int)(matrix2->p[i][k])) * ((int)(matrix1->p[k][j]));
				
			}
		}
	}
}

/*****************************************************
函数名称:free_space
函数输入参数:Matrixp matrix
函数返回值:无
函数功能:完成动态空间的释放
******************************************************/
free_space(Matrixp matrix)
{
	for (int i = 0;i < matrix->row;i++)
	{
		free(*(matrix->p + i));
	}
	free(matrix->p);
}

/*****************************************************
主函数
******************************************************/
int main()
{
	Matrixp matrix1, matrix2, matrix3;
	Matp mat;
	long int offset;
	mat = (Matp)malloc(sizeof(Mat));
	matrix1 = (Matrixp)malloc(sizeof(Matrix));
	matrix2 = (Matrixp)malloc(sizeof(Matrix));
	matrix3 = (Matrixp)malloc(sizeof(Matrix));
	FILE *fp, *fp1;
	fp = fopen("D:\\input.txt", "r");
	for (int i = 0; !feof(fp); i++)
	{
		offset = ftell(fp);											//获得当前的读取位置
		read_matrixsize(fp, mat);
		assign_space(matrix1, mat->m, mat->n);
		fseek(fp, offset, SEEK_SET);								//寻找之前的位置
		read_matrix(matrix1, mat, fp);
		offset = ftell(fp);
		if (i == 0)													//基情况的初始化
		{
			M = mat->m;
			assign_space(matrix2, mat->m, mat->n);
			assign_space(matrix3, mat->m, mat->n);
			for (int k = 0;k < mat->m;k++)
			{
				for (int j = 0;j < mat->n;j++)
					matrix2->p[k][j] = matrix1->p[k][j];
			}
		}
		else
		{
			assign_space(matrix3, M, mat->n);
			matrix_mul(matrix1, matrix2, matrix3);
			free_space(matrix2);
			assign_space(matrix2, M, mat->n);
			for (int k = 0;k < matrix3->row;k++)
			{
				for (int j = 0;j < matrix3->column;j++)
				{
					matrix2->p[k][j] = matrix3->p[k][j];
				}
			}
			free_space(matrix1);
			free_space(matrix3);
		}
	}
	fp1 = fopen("D:\\output.txt", "w");
	for (int k = 0;k < M;k++)
	{
		for (int j = 0;j < matrix2->column;j++)
			fprintf(fp1,"%d ", matrix2->p[k][j]);						//写输出结果到  D://output.txt
		fprintf(fp1,"\n");
	}
	fclose(fp1);
	fclose(fp);
	free(mat);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值