C语言实现动态二维数组及相乘

一、二维数组的概念

 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,初始化部分有点迷惑。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是C语言中两个二维数组相乘的代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct TwoDArray { int rows; int columns; int **elements; } TwoDArray, *TwoDArrayPtr; // 初始化二维数组 void initTwoDArray(TwoDArrayPtr array, int rows, int columns) { array->rows = rows; array->columns = columns; array->elements = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { array->elements[i] = (int *)malloc(columns * sizeof(int)); } } // 释放二维数组 void freeTwoDArray(TwoDArrayPtr array) { for (int i = 0; i < array->rows; i++) { free(array->elements[i]); } free(array->elements); } // 随机赋值 void randomAssign(TwoDArrayPtr array) { for (int i = 0; i < array->rows; i++) { for (int j = 0; j < array->columns; j++) { array->elements[i][j] = rand() % 10; } } } // 打印二维数组 void printTwoDArray(TwoDArrayPtr array) { for (int i = 0; i < array->rows; i++) { for (int j = 0; j < array->columns; j++) { printf("%d ", array->elements[i][j]); } printf("\n"); } } // 二维数组相乘 TwoDArrayPtr multiplyTwoDArray(TwoDArrayPtr array1, TwoDArrayPtr array2) { if (array1->columns != array2->rows) { printf("Error: The number of columns in the first array must be equal to the number of rows in the second array.\n"); return NULL; } TwoDArrayPtr result = (TwoDArrayPtr)malloc(sizeof(TwoDArray)); initTwoDArray(result, array1->rows, array2->columns); for (int i = 0; i < array1->rows; i++) { for (int j = 0; j < array2->columns; j++) { int sum = 0; for (int k = 0; k < array1->columns; k++) { sum += array1->elements[i][k] * array2->elements[k][j]; } result->elements[i][j] = sum; } } return result; } // 测试代码 void test() { TwoDArray array1, array2, *result; initTwoDArray(&array1, 2, 3); initTwoDArray(&array2, 3, 2); randomAssign(&array1); randomAssign(&array2); printf("Array1:\n"); printTwoDArray(&array1); printf("Array2:\n"); printTwoDArray(&array2); result = multiplyTwoDArray(&array1, &array2); if (result != NULL) { printf("Result:\n"); printTwoDArray(result); freeTwoDArray(result); } freeTwoDArray(&array1); freeTwoDArray(&array2); } // 主函数 int main() { test(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenshengnannn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值