利用C语言编写一个矩阵乘法运算的程序 (1)读取两个TXT文件中的数据,存入矩阵并输出显示; (2)编写矩阵乘法运算过程,并输出结果至新的TXT文件中; (3)在创建数组时,采用动态分配内存的方式。
时间: 2024-09-13 18:15:19 浏览: 75
在C语言中,我们可以利用结构体和指针来实现矩阵的动态存储,并通过文件I/O操作读取和写入数据。以下是简化的步骤:
1. **矩阵定义**:
定义一个结构体 `Matrix` 来表示矩阵,包含行数、列数以及指向元素的指针。
```c
typedef struct {
int rows;
int cols;
int* data;
} Matrix;
```
2. **读取TXT文件**:
使用 `fscanf` 函数从文本文件中读取整数,然后动态分配内存给矩阵元素。
```c
void read_matrix_from_file(char* filename, Matrix* matrix) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
// 文件打开失败处理
}
fscanf(file, "%d %d", &matrix->rows, &matrix->cols);
matrix->data = (int*)malloc(matrix->rows * matrix->cols * sizeof(int));
for (int i = 0; i < matrix->rows * matrix->cols; i++) {
fscanf(file, "%d", &matrix->data[i]);
}
fclose(file);
}
```
3. **矩阵乘法**:
可以使用嵌套循环计算两个矩阵的乘积,注意检查列数是否匹配。
```c
void multiply_matrices(Matrix* A, Matrix* B, Matrix* result) {
if (A->cols != B->rows) {
printf("Error: Incompatible dimensions for multiplication.\n");
return;
}
int newRow = A->rows;
int newCol = B->cols;
result->rows = A->rows;
result->cols = B->cols;
result->data = (int*)malloc(newRow * newCol * sizeof(int));
for (int i = 0; i < newRow; i++) {
for (int j = 0; j < newCol; j++) {
int sum = 0;
for (int k = 0; k < A->cols; k++) {
sum += A->data[i * A->cols + k] * B->data[k * B->cols + j];
}
result->data[i * newCol + j] = sum;
}
}
}
```
4. **写入TXT文件**:
矩阵乘法完成后,将结果保存到另一个TXT文件中。
```c
void write_matrix_to_file(const char* filename, const Matrix* matrix) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
// 文件打开失败处理
}
for (int i = 0; i < matrix->rows * matrix->cols; i++) {
fprintf(file, "%d ", matrix->data[i]);
}
fprintf(file, "\n");
fclose(file);
}
```
5. **完整流程示例**:
结合以上所有部分,构建完整的主函数来完成整个任务。
```c
int main() {
Matrix A, B, result;
// 初始化矩阵文件名
char A_filename[] = "matrix_A.txt";
char B_filename[] = "matrix_B.txt";
char result_filename[] = "result.txt";
read_matrix_from_file(A_filename, &A);
read_matrix_from_file(B_filename, &B);
multiply_matrices(&A, &B, &result);
write_matrix_to_file(result_filename, &result);
free(A.data);
free(B.data);
free(result.data); // 释放内存
return 0;
}
```
记得在实际运行前检查文件是否存在,文件路径是否正确,以及内存管理中的错误。在每个阶段结束后最好关闭文件以避免资源泄漏。在
阅读全文