第二次
掌握指针和结构、文件的结合使用。
掌握形参与实参
首先通过读书,掌握c语言文本文件的基本概念和基本操作。
熟悉文本文件的读写及fopen/fclose,fscanf/fprintf等函数。
掌握指针和结构、文件的结合使用。
掌握形参与实参
首先通过读书,掌握c语言文本文件的基本概念和基本操作。
熟悉文本文件的读写及fopen/fclose,fscanf/fprintf等函数。
上机练习1:将几个数字及字符串写入文件。读出并显示。
通过读书,掌握结构的基本概念;学习和实践结构数组,结构指针概念。
上机练习2:将矩阵表示为结构,成员包括:矩阵行数,列数,及指向矩阵具体元素的指针;然后重做第一课练习。
作业:使用读写文件的矩阵乘法
要求:读出指定文本文件中各矩阵,计算多矩阵相乘后结果,并将结果写入另一文本文件中。
文件名任意;如输入文件:input.txt; 输出文件out.txt
输入文件格式:将多个矩阵记录在文件中,多个矩阵以空行分隔。
类似:
1 3 2
2 5 4
输入文件格式:将多个矩阵记录在文件中,多个矩阵以空行分隔。
类似:
1 3 2
2 5 4
3
8
12
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;
}