#include<iostream>
using namespace std;
typedef struct TwoDArray{
int rows;
int columns;
int** elements;
}TwoDArray,*TwoDArrayPtr;;
typedef struct TwoDStaticArray{
int rows;
int columns;
int elements[4][5];
}TwoDStaticArray,*TwoDStaticArrayPtr;
TwoDArrayPtr initTwoDArray(int paraRows, int paraColumns){
TwoDArrayPtr resultPtr=(TwoDArrayPtr)malloc(sizeof(TwoDArray));
resultPtr->rows=paraRows;
resultPtr->columns=paraColumns;
resultPtr->elements=(int**)malloc(sizeof(int*)*paraRows);
for(int i=0;i<paraRows;i++){
resultPtr->elements[i]=(int*)malloc(sizeof(int)*paraColumns);
}
return resultPtr;
}
void randomizeTwoDArray(TwoDArrayPtr 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;
}
}
}
void printTwoDArray(TwoDArrayPtr paraPtr){
for(int i=0;i<paraPtr->rows;i++){
for(int j=0;j<paraPtr->columns;j++){
printf("%d ",paraPtr->elements[i][j]);
}
printf("\r\n");
}
}
TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2){
if(paraPtr1->columns!=paraPtr2->rows){
printf("Matrices cannot be multiplied.\r\n");
return nullptr;
}
int sum=0;
TwoDArrayPtr resultPtr=initTwoDArray(paraPtr1->rows,paraPtr2->columns);
for(int i=0;i<paraPtr1->rows;i++){
for(int j=0;j<paraPtr2->columns;j++){
sum=0;
for(int k=0;k<paraPtr1->columns;k++){
sum+=paraPtr1->elements[i][k]*paraPtr2->elements[k][j];
}
resultPtr->elements[i][j]=sum;
printf("sum = %d ",sum);
}
}
return resultPtr;
}
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);
}
TwoDStaticArrayPtr initTwoDStaticArray(){
TwoDStaticArrayPtr resultPtr=(TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray));
resultPtr->rows=4;
resultPtr->columns=5;
for (int i=0;i<4;i++){
for (int j=0;j<5;j++){
resultPtr->elements[i][j]=i*10+j;
printf("(%d, %d): %d; ",i,j,&(resultPtr->elements[i][j]));
}
}
return resultPtr;
}
int main(){
twoDArrayTest();
TwoDStaticArrayPtr tempPtr=initTwoDStaticArray();
return 0;
}
这段代码涉及了C++中的矩阵操作和动态内存分配。以下是我对这段代码的学习心得:
-
数据结构定义:
- 定义了两种不同的数据结构:
TwoDArray
和TwoDStaticArray
,分别用于动态和静态二维数组。 TwoDArray
使用指针来表示二维数组的行和列,并动态分配内存以存储元素。TwoDStaticArray
使用固定大小的二维数组来存储元素。
- 定义了两种不同的数据结构:
-
函数实现:
initTwoDArray
函数用于初始化动态二维数组,动态分配内存以存储数组元素。randomizeTwoDArray
函数用于为二维数组随机赋值。printTwoDArray
函数用于打印二维数组的元素。matrixMultiply
函数用于矩阵相乘操作,检查矩阵是否可以相乘,并返回结果矩阵。
-
测试函数:
twoDArrayTest
函数用于测试动态二维数组的初始化、赋值、打印和矩阵相乘操作。
-
静态数组初始化:
initTwoDStaticArray
函数用于初始化静态二维数组,直接在函数内部为数组赋值并打印元素的地址。
-
学习心得:
- 通过这段代码,我学习了如何使用指针和动态内存分配来处理二维数组。
- 矩阵相乘的实现让我更加熟悉了矩阵运算的基本原理。
- 理解了动态数组和静态数组在内存分配和使用上的区别。
- 总体而言,这段代码帮助我加深了对C++中数组和指针的理解,以及如何进行矩阵操作和内存管理的知识。