二维数组、二维数组的乘法
二维数组在概念上是二维的,具有行和列,但在内存中是连续存放的;换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。在本代码测试静态二维数组的地址时就可以清晰的知道。
例如Array[m][n]表示的就是有一个m行n列的二维数组。
二维数组乘法的满足条件:第一个数组的列必须等于第二个数组的行。得到的新二维数组的行等于第一个二维数组的行,列等于第二个二维数组的列。
相乘公式:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ROWS 4
#define COLUMNS 5
//动态二维数组
typedef struct TwoDimensionalArray
{
int rows;//行数
int columns;//列数
int **elements;//二维数组
} *TwoDimensionalArrayPtr;
//静态二维数组
typedef struct TwoDStaticArray
{
int rows;
int columns;
int elements[ROWS][COLUMNS];
} *TwoDStaticArrayPtr;
//初始化静态二维数组并打印每一个数据的地址
void iniTwpDStaticArray()
{
TwoDStaticArrayPtr resultPtr = (TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray));
resultPtr->rows = ROWS;
resultPtr->columns = COLUMNS;
int count = 0;//计数打印的地址的个数
for(int i = 0; i < ROWS; i++)
{
for(int j = 0; j < COLUMNS; j++)
{
resultPtr->elements[i][j] = i * 10 + j;
printf("(%d,%d) = %d ",i,j,&resultPtr->elements[i][j]);
count++;
if(count == 4)
{
printf("\n");
count = 0;
}
}
}
}
//打印二维数组
void printArray(TwoDimensionalArrayPtr paraArray)
{
for(int i = 0; i < paraArray->rows; i++)
{
for(int j = 0; j < paraArray->columns; j++)
{
printf("%02d ",paraArray->elements[i][j]);//因为打印的是%2d所以在存入数据的时候不要超过99
}
printf("\n");
}
}
//动态二维数组初始化
TwoDimensionalArrayPtr initTwodimensionalArray(int paraArows,int paraColumns)
{
TwoDimensionalArrayPtr resultPtr = (TwoDimensionalArrayPtr)malloc(sizeof(struct TwoDimensionalArray));
resultPtr->rows = paraArows;
resultPtr->columns = paraColumns;
resultPtr->elements = (int **)malloc(sizeof(int *) * paraArows);
for(int i = 0; i < paraArows; i++)
{
resultPtr->elements[i] = (int *)malloc(sizeof(int) * paraColumns);
}
return resultPtr;
}
//动态二位数组存储随机数字
void randomizeTwoDArray(TwoDimensionalArrayPtr paraPtr, int paraLowerBound, int paraUpperBound)
{
for(int i = 0; i < paraPtr->rows; i++)
{
for(int j = 0; j < paraPtr->columns; j++)
{
paraPtr->elements[i][j] = rand() % (paraUpperBound - paraLowerBound) + paraLowerBound;
}
}
}
//二位数组相乘
TwoDimensionalArrayPtr matrixMultiply(TwoDimensionalArrayPtr paraArray1,TwoDimensionalArrayPtr paraArray2)
{
//判断两个数组是否可以相乘。
if(paraArray1->columns != paraArray2->rows)
{
printf("这两个数组不能相乘!\n");
return NULL;
}
int sum;//相乘得到的新的数组paraArray的每一个位置的值
TwoDimensionalArrayPtr paraArray = initTwodimensionalArray(paraArray1->rows,paraArray2->columns);//相乘的到的数据存储在该二维数组里
for(int i = 0; i < paraArray1->rows; i++)
{
for(int j = 0; j < paraArray2->columns; j++)
{
sum = 0;
for(int k = 0; k < paraArray1->columns; k++)
{
sum += paraArray1->elements[i][k] * paraArray2->elements[k][j];
}
paraArray->elements[i][j] = sum;
}
}
return paraArray;
}
//动态二维数组测试单元
void TwoDimensionalArrayTest()
{
TwoDimensionalArrayPtr tempArray1 = initTwodimensionalArray(3,2);
randomizeTwoDArray(tempArray1,1,5);
printf("第一个二维数组是:\n");
printArray(tempArray1);
TwoDimensionalArrayPtr tempArray2 = initTwodimensionalArray(2,3);
randomizeTwoDArray(tempArray2,2,8);
printf("第二个二维数组是:\n");
printArray(tempArray2);
TwoDimensionalArrayPtr tempArray3 = matrixMultiply(tempArray1,tempArray2);
printf("相乘得到的二维数组是:\n");
printArray(tempArray3);
}
//静态二维数组测试单元
void TwoDStaticArrayTest()
{
iniTwpDStaticArray();
}
int main()
{
TwoDStaticArrayTest();
TwoDimensionalArrayTest();
return 0;
}
测试结果
(0,0) = 11277384 (0,1) = 11277388 (0,2) = 11277392 (0,3) = 11277396
(0,4) = 11277400 (1,0) = 11277404 (1,1) = 11277408 (1,2) = 11277412
(1,3) = 11277416 (1,4) = 11277420 (2,0) = 11277424 (2,1) = 11277428
(2,2) = 11277432 (2,3) = 11277436 (2,4) = 11277440 (3,0) = 11277444
(3,1) = 11277448 (3,2) = 11277452 (3,3) = 11277456 (3,4) = 11277460
第一个二维数组是:
02 04
03 01
02 01
第二个二维数组是:
02 02 06
04 07 07
相乘得到的二维数组是:
20 32 40
10 13 25
08 11 19
PS D:\Data Struction\weekFour\student>