5.1二维数组与矩阵乘法

发布时间:2026/5/21 2:17:48

5.1二维数组与矩阵乘法 #include stdio.h#include malloc.h#include stdlib.h#define ROWS 4#define COLUMNS 5/*** 动态二维数组结构体*/typedef struct TwoDArray{int rows; // 行数int columns; // 列数int** elements; // 二级指针存储数组元素} TwoDArray, *TwoDArrayPtr;/*** 静态二维数组结构体*/typedef struct TwoDStaticArray{int rows;int columns;int elements[ROWS][COLUMNS]; // 固定大小数组} TwoDStaticArray, *TwoDStaticArrayPtr;/*** 初始化动态二维数组*/TwoDArrayPtr initTwoDArray(int paraRows, int paraColumns){int i;TwoDArrayPtr resultPtr (TwoDArrayPtr)malloc(sizeof(struct TwoDArray));resultPtr-rows paraRows;resultPtr-columns paraColumns;resultPtr-elements (int**)malloc(paraRows * sizeof(int*));for (i 0; i paraRows; i ){resultPtr-elements[i] (int*)malloc(paraColumns * sizeof(int));}//Of for ireturn resultPtr;}// Of initTwoDArray/*** 给数组随机赋值*/void randomizeTwoDArray(TwoDArrayPtr paraPtr, int paraLowerBound, int paraUpperBound){int i, j;for (i 0; i paraPtr-rows; i ){for (j 0; j paraPtr-columns; j ) {paraPtr-elements[i][j] rand() % (paraUpperBound - paraLowerBound) paraLowerBound;}//Of for j}//Of for i}// Of randomizeTwoDArray/*** 打印二维数组*/void printTwoDArray(TwoDArrayPtr paraPtr){int i, j;for (i 0; i paraPtr-rows; i ){for (j 0; j paraPtr-columns; j ) {printf(%d, , paraPtr-elements[i][j]);}//Of for jprintf(\r\n);}//Of for i}// Of initTwoDArray/*** 矩阵乘法运算*/TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2){int i, j, k, sum;// 判断是否满足矩阵相乘条件if (paraPtr1-columns ! paraPtr2-rows){printf(Matrices cannot be multiplied.\r\n);return NULL;}//Of ifTwoDArrayPtr resultPtr initTwoDArray(paraPtr1-rows, paraPtr2-columns);// 三层循环实现矩阵相乘for (i 0; i paraPtr1-rows; i ){for (j 0; j paraPtr2-columns; j ) {sum 0;for (k 0; k paraPtr1-columns; k ) {sum paraPtr1-elements[i][k] * paraPtr2-elements[k][j];}//Of for kresultPtr-elements[i][j] sum;printf(sum %d, , sum);}//Of for j}//Of for ireturn resultPtr;}// Of matrixMultiply/*** 动态二维数组测试*/void twoDArrayTest(){TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;tempPtr1 initTwoDArray(3, 2);randomizeTwoDArray(tempPtr1, 1, 5);printf(The first matrix:\r\n);printTwoDArray(tempPtr1);tempPtr2 initTwoDArray(2, 4);randomizeTwoDArray(tempPtr2, 4, 9);printf(The second matrix:\r\n);printTwoDArray(tempPtr2);tempPtr3 matrixMultiply(tempPtr1, tempPtr2);printf(The result:\r\n);printTwoDArray(tempPtr3);}//Of twoDArrayTest/*** 初始化静态二维数组输出元素地址*/TwoDStaticArrayPtr initTwoDStaticArray(){int i, j;TwoDStaticArrayPtr resultPtr (TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray));resultPtr-rows ROWS;resultPtr-columns COLUMNS;for (i 0; i ROWS; i ){for (j 0; j COLUMNS; j ) {resultPtr-elements[i][j] i * 10 j;//Print their addresses.printf((%d, %d): %d; , i, j, (resultPtr-elements[i][j]));}//Of for j}//Of for ireturn resultPtr;}// Of initTwoDStaticArray/*** 程序入口*/int main(){twoDArrayTest();TwoDStaticArrayPtr tempPtr initTwoDStaticArray();return 1;}// Of main知识点总结1. 区分静态二维数组和动态二维数组静态大小固定动态可灵活指定行列。​2. 动态二维数组依靠二级指针配合内存分配实现使用更灵活。​3. 矩阵相乘规则第一个矩阵列数等于第二个矩阵行数。​4. 利用 rand() 函数可快速给数组批量生成随机数值。​5. 可通过打印地址直观观察数组元素内存分布规律。

相关新闻