一、二维数组的概念
1、二维数组本质上是以数组作为数组元素
的数组,即数组的数组。
2、二维数组就是一个有行和列的矩阵,每一行代表一个数组,即数组的数组。
3、每一行数组内元素所在的位置可以用行和列号来表示。
二、代码部分
一、头文件
二、动态二维数组的结构
三、初始化
四、随机赋值
五 、打印
六、相乘
七、测试代码
八、主函数
九、测试结果
十、总结
一、头文件
#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;
三、初始化
//初始化
TwoDArrayPtr initTwoDArray(int newRows,int newColumns)
{
int i;
TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(struct TwoDArray));
resultPtr->rows = newRows;
resultPtr->columns = newColumns;
resultPtr->elements = (int**)malloc(newRows*sizeof(int*));
for(i = 0; i < newRows; i ++)
{
resultPtr->elements[i] = (int*)malloc(newColumns*sizeof(int));
}
return resultPtr;
}
四、随机赋值
//随机赋值
void randomizeTwoDArray(TwoDArrayPtr newPtr,int lower,int upper)
{
int i,j;
for(i = 0;i < newPtr->rows ;i++)
{
for(j = 0;j <newPtr->columns ;j++)
{
newPtr->elements[i][j] = rand()%(upper - lower)+lower;
}
}
}
五 、打印
//打印二维数组
void printTwoDArray(TwoDArrayPtr newPtr)
{
int i,j;
for(i = 0;i < newPtr->rows ;i++)
{
for(j = 0;j < newPtr->columns ;j++)
{
printf("%d ",newPtr->elements [i][j]);
}
printf("\n");
}
printf("\r\n");
}
六、相乘
//二维数组相乘
TwoDArrayPtr matrixMultiply(TwoDArrayPtr newPtr1,TwoDArrayPtr newPtr2)
{
int i,j,k,sum;
if(newPtr1->columns != newPtr2->rows)
{
printf("The two matrices can not multiply.\n");
return ;
}
//初始一个新的二维数组用来储存相乘后的数据,且该二维数组的行数等于newPtr1,列数等于newPtr2
TwoDArrayPtr resultPtr = initTwoDArray(newPtr1->rows,newPtr2->columns );
for(i = 0;i < newPtr1->rows;i++)
{
for(j = 0;j < newPtr2->columns ;j++)
{
sum = 0;
for(k = 0;k < newPtr1->columns;k++)
{
sum += newPtr1->elements [i][k] * newPtr2->elements [k][j];
}
resultPtr->elements[i][j] = sum;
}
}
return resultPtr;
}
七、测试代码
//测试函数
void twoDArrayTest()
{
TwoDArrayPtr tempPtr1,tempPtr2,tempPtr3;
//初始化
tempPtr1 = initTwoDArray(3,2);
tempPtr2 = initTwoDArray(2,4);
//随机赋值
randomizeTwoDArray(tempPtr1,1,5);
randomizeTwoDArray(tempPtr2,4,9);
//打印数组
printf("The first darray is:\n");
printTwoDArray(tempPtr1);
printf("The second darray is:\n");
printTwoDArray(tempPtr2);
//进行运算
tempPtr3 = matrixMultiply(tempPtr1,tempPtr2);
printf("The result darray is:\n");
printTwoDArray(tempPtr3);
}
八、主函数
void main()
{
twoDArrayTest();
}
九、测试结果
十、总结
我认为难点主要在初始化和相乘部分,相乘部分画好图很容易理解到底谁是i,j,k,初始化部分有点迷惑。