完全动态二维数组,格式化读写文件,矩阵乘法实例。1000*1000与1000*2000矩阵相乘,并格式化读写文件。 截图如下: 代码如下: /************************************************************************/ /*Name:matrixmultiply.c */ /*Target:设计一个简单数据单元的矩阵相乘程序流程 */ /*Eg:matrixmultiply a.txt b.txt c.txt */ /*Written By jrckkyy. (WANT vs6.0) */ /************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> void main(int argc, char *argv[]) { FILE* fp = 0; time_t starttime; time_t endtime; time_t elapsetime; int i; int j; int k; int** matrixa = 0; int** matrixb = 0; int** matrixc = 0; char ch; char* chp = 0; if (sizeof(argv[1]) > 30 || argv[1] == NULL || sizeof(argv[2]) > 30 || argv[2] == NULL || sizeof(argv[3]) > 30 || argv[3] == NULL) //reject shell code { exit(0); } // //构造矩阵a并且写入a.txt //分配1000*1000矩阵空间 matrixa = (int**)malloc(1000*sizeof(int *)); for (i = 0; i < 1000; ++i) { matrixa[i] = (int *)malloc(1000*sizeof(int)); } //构造1000*1000矩阵数据 for (i = 0; i < 1000; ++i) { for (j = 0; j < 1000; ++j) { matrixa[i][j] = 1; } } fp = fopen(argv[1], "w+"); if (fp != NULL) { for (i = 0; i < 1000; ++i) { for (j = 0; j < 1000; ++j) { if (999 == j) { fprintf(fp, "%d", matrixa[i][j]); continue; } fprintf(fp, "%d/t", matrixa[i][j]); } fprintf(fp, "/n"); } } else { printf("文件打开失败!/n"); exit(0); } fclose(fp); // //构造矩阵b并且写入b.txt //分配1000*2000矩阵空间 matrixb = (int**)malloc(1000*sizeof(int *)); for (i = 0; i < 1000; ++i) { matrixb[i] = (int *)malloc(2000*sizeof(int)); } //构造1000*1000矩阵数据 for (i = 0; i < 1000; ++i) { for (j = 0; j < 2000; ++j) { matrixb[i][j] = 2; } } fp = fopen(argv[2], "w+"); if (fp != NULL) { for (i = 0; i < 1000; ++i) { for (j = 0; j < 2000; ++j) { if (1999 == j) { fprintf(fp, "%d", matrixb[i][j]); continue; } fprintf(fp, "%d/t", matrixb[i][j]); } fprintf(fp, "/n"); } } else { printf("文件打开失败!/n"); exit(0); } //释放动态资源 fclose(fp); for (i = 0; i < 1000; ++i) { free(matrixa[i]); } free(matrixa); matrixa = 0; for (i = 0; i < 1000; ++i) { free(matrixb[i]); } free(matrixb); matrixa = 0; // //从格式化文件中读取字符,放入内存中 //分配matrixa的空间 matrixa = (int**)malloc(1000*sizeof(int*)); for (i = 0; i < 1000; ++i) { matrixa[i] = (int*)malloc(1000*sizeof(int)); } //读取a.txt文件中的矩阵数据到内存空间中,以table分割,以/n换行 fp = fopen(argv[1], "r"); if (fp != NULL) { i = 0; j = 0; while( (ch = fgetc(fp)) != EOF ) { if(ch == '/t') { //putch(ch); ++j; continue; } if (ch == '/n') { //putch(ch); ++i; j = 0; continue; } //putch(ch); chp = &ch; matrixa[i][j] = atoi(chp); } chp = 0; fclose(fp); } else { printf("文件打开失败!/n"); exit(0); } //测试是否正确将文本中的字符串转换为了内存的整型元素矩阵 //printf("%d", matrixa[0][0]*2); // for (i = 0; i < 1000; ++i) // { // for (j = 0; j < 1000; ++j) // { // printf("%d/t", matrixa[i][j]); // } // printf("/n"); // } //读取b.txt文件中的矩阵数据到内存空间中,以table分割,以/n换行 matrixb = (int**)malloc(1000*sizeof(int*)); for (i = 0; i < 1000; ++i) { matrixb[i] = (int*)malloc(2000*sizeof(int)); } fp = fopen(argv[2], "r"); if (fp != NULL) { i = 0; j = 0; while ((ch = fgetc(fp)) != EOF) { if (ch == '/t') { ++j; continue; } if (ch == '/n') { ++i; j = 0; continue; } chp = &ch; matrixb[i][j] = atoi(chp); } chp = 0; fclose(fp); } else { printf("文件打开失败!"); exit(0); } //printf("%d", matrixb[0][0]*2); // //预计a、b矩阵相乘结果为1000*2000的矩阵,下面分配矩阵c matrixc = (int**)malloc(1000*sizeof(int*)); for (i = 0; i < 1000; ++i) { matrixc[i] = (int*)malloc(2000*sizeof(int)); } // //矩阵相乘运算结果放入matrixc,并写入c.txt for (i = 0; i < 1000; ++i) { for (j = 0; j < 2000; ++j) { matrixc[i][j] = 0; for (k = 0; k < 1000; ++k) { matrixc[i][j] += matrixa[i][k] * matrixb[k][j]; } } } for (i = 0; i < 1000; ++i) { free(matrixa[i]); } free(matrixa); matrixa = 0; for (i = 0; i < 1000; ++i) { free(matrixb[i]); } free(matrixb); matrixb = 0; //测试matrixc矩阵 // printf("%d/t", matrixc[0][0]); // printf("%d/t", matrixc[999][999]); // printf("%d/t", matrixc[999][1999]); // for (i = 0; i < 1000; ++i) // { // for (j = 0; j < 2000; ++j) // { // printf("%d/t", matrixc[i][j]); // } // printf("/n"); // } fp = fopen(argv[3], "w+"); if (fp != NULL) { for (i = 0; i < 1000; ++i) { for (j = 0; j < 2000; ++j) { if (j == 1999) { fprintf(fp, "%d", matrixc[i][j]); continue; } fprintf(fp, "%d/t", matrixc[i][j]); } fprintf(fp, "/n"); } } else { printf("打开文件错误!"); exit(0); } fclose(fp); fp = 0; for (i = 0; i < 1000; ++i) { free(matrixc[i]); } free(matrixc); matrixc = 0; } http://blog.csdn.net/jrckkyyhttp://hi.baidu.com/jrckkyy