番外篇之矩阵运算

矩阵的运算代码(加减乘除)(内有注释)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define ROW 10  //定义行
#define COL 10	//定义列
//设置全局变量A矩阵的m代表实际矩阵的行数,n代表实际矩阵的列数
//设置全局变量B矩阵的p代表实际矩阵的行数,q代表实际矩阵的列数
int m, n;
int p, q;
void menu()
{
	printf("**********************请选择你要进行的运算\n");
	printf("**********************0:退出矩阵运算     \n");
	printf("**********************1:加法运算		  \n");
	printf("**********************2:减法运算	      \n");
	printf("**********************3:转置运算	      \n");
	printf("**********************4:乘法运算		  \n");
}
void Input_MAT(int A[][COL], int B[][COL])
{
	int i = 0;
	int j = 0;
	printf("输入A数组的行数,列数:");
	scanf("%d%d", &m, &n);
	printf("输入A数组:\n");
	for (; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &A[i][j]);
		}
	}
	printf("输入B数组的行数,列数:");
	scanf("%d%d", &p, &q);
	printf("输入B数组:\n");
	//输入B数组
	for (i = 0; i < p; i++)
	{
		for (j = 0; j < q; j++)
		{
			scanf("%d", &B[i][j]);
		}
	}
}
void Output_MAT(int A[][COL], int B[][COL])
{
	int i = 0;
	int j = 0;
	//输出A数组
	printf("输出A数组:\n");
	for (; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%2d ", A[i][j]);
		}
		printf("\n");
	}
	printf("输出B数组:\n");
	//输出B数组
	for (i = 0; i < p; i++)
	{
		for (j = 0; j < q; j++)
		{
			printf("%2d ", B[i][j]);
		}
		printf("\n");
	}
}
//矩阵相加
void Add(int A[][COL],int B[][COL],int sum[][COL])
{
	if (m == p && n == q)
	{
		int i = 0;
		int j = 0;
		for (; i < m; i++)
		{
			for (j = 0; j < n; j++)
				sum[i][j] = A[i][j] + B[i][j];//得到和矩阵
		}
		//打印和矩阵
		printf("开始打印和矩阵\n");
		for (i=0; i < m; i++)
		{
			for (j = 0; j < n; j++)
				printf("%2d ", sum[i][j]);
			printf("\n");
		}
	}
	else
		printf("你的矩阵相加形式不合法,请重新输入\n");
}
void Sub(int A[][COL], int B[][COL], int sum[][COL])
{
	if (m == p && n == q)
	{
		int i = 0;
		int j = 0;
		for (; i < m; i++)
		{
			for (j = 0; j < n; j++)
				sum[i][j] = A[i][j] - B[i][j];//得到差矩阵
		}
		//打印和矩阵
		printf("开始打印减矩阵\n");
		for (i = 0; i < m; i++)
		{
			for (j = 0; j < n; j++)
				printf("%2d ", sum[i][j]);
			printf("\n");
		}
	}
	else
		printf("你的矩阵相减形式不合法,请重新输入\n");
}
void Tra(int A[][COL],int B[][COL])
{
	printf("下面开始A矩阵的转置\n");
	int i = 0;
	int j = 0;
	//转置运算
	for (; i < m; i++)
	{
		for (j = i; j < n; j++)
		{
			int tmp = 0;
			tmp = A[i][j];
			A[i][j] = A[j][i];
			A[j][i] = tmp;
		}
	}
	printf("下面开始B矩阵的转置\n");
	for (i = 0; i < p; i++)
	{
		for (j = i; j < q; j++)
		{
			int tmp = 0;
			tmp = B[i][j];
			B[i][j] = B[j][i];
			B[j][i] = tmp;
		}
	}
	//输入转置后的A,B矩阵
	Output_MAT(A, B);
}
void Mul1(int A[][COL], int B[][COL], int sum[][COL])
{
	int i = 0;
	int j = 0;
	int k = 0;
	if (n == p)
	{
		for (; i < m; i++)
		{
			for (j = 0; j < q; j++)
			{
				for (k = 0; k < n; k++)
				sum[i][j] += A[i][k] * B[k][j];
			}
		}
		printf("开始打印积矩阵\n");
		for (i = 0; i < m; i++)
		{
			for (j = 0; j < q; j++)
			printf("%2d ", sum[i][j]);
			printf("\n");
		}
	}
	else
		printf("矩阵相乘形式不合法\n");
}
void Mul2(int A[][COL], int B[][COL], int sum[][COL])
{
	int i = 0;
	int j = 0;
	int k = 0;
	if (q == m)
	{
		for (; i < p; i++)
		{
			for (j = 0; j < n; j++)
			{
				for (k = 0; k < q; k++)
					sum[i][j] += B[i][k] * A[k][j];
			}
		}
		printf("开始打印积矩阵\n");
		for (i = 0; i < p; i++)
		{
			for (j = 0; j < n; j++)
				printf("%2d ", sum[i][j]);
			printf("\n");
		}
	}
	else
		printf("矩阵相乘形式不合法\n");
}

int main()
{
	int A[ROW][COL] = { 0 };//初始化A数组
	int B[ROW][COL] = { 0 };//初始化B数组
	//矩阵输入函数
	//Input_MAT(A,B);
	//矩阵输出函数
	//Output_MAT(A, B);
	int input = 0;//初始化要进行的运算密码
	do
	{
		menu();//菜单,你要进行的矩阵运算
		printf("请输入密码进行矩阵运算:");
		scanf("%d", &input);
		//矩阵输入函数
		Input_MAT(A, B);
		//矩阵输出函数
		Output_MAT(A, B);
		int flag = 0;//矩阵乘法,若flag = 0,进行A乘以B,若flag=1,进行B乘以A
		int sum[ROW][COL] = { 0 };
		switch (input)
		{
		case 0:
			printf("退出矩阵运算");
			break;
		case 1:
			//定义矩阵之和的和矩阵
			Add(A, B, sum);//加法运算
			break;
		case 2:
			//矩阵减法运算
			Sub(A, B, sum);
			break;
		case 3:
			//A,B矩阵的转置
			Tra(A,B);
			break;
		case 4:
			//A,B矩阵的乘法
			printf("请输入你要进行的矩阵乘法\n");
			printf("输入 0 进行A矩阵乘以B矩阵的运算\n");
			printf("输入 1 进行B矩阵乘以A矩阵的运算\n");
			printf("请输入数字:");
			scanf("%d", &flag);
			if(flag==0)
			Mul1(A, B, sum);
			if(flag==1)
			Mul2(A, B, sum);
			break;
		default:
			printf("输入数字不合法,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}
相关推荐
小字节,大梦想21 分钟前
【C++】二叉搜索树
数据结构·c++
吾名招财22 分钟前
yolov5-7.0模型DNN加载函数及参数详解(重要)
c++·人工智能·yolo·dnn
我是哈哈hh42 分钟前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
憧憬成为原神糕手43 分钟前
c++_ 多态
开发语言·c++
郭二哈1 小时前
C++——模板进阶、继承
java·服务器·c++
Tisfy1 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
挥剑决浮云 -1 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
Mephisto.java1 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli1 小时前
滑动窗口->dd爱框框
算法
丶Darling.1 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树