番外篇之矩阵运算

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

复制代码
#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;
}
相关推荐
虾球xz6 分钟前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
fpcc36 分钟前
跟我学c++高级篇——模板元编程之十三处理逻辑
c++
格林威1 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
Dream it possible!2 小时前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
?abc!3 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue3 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
Dddle14 小时前
C++:this指针
java·c语言·开发语言·c++
不見星空4 小时前
2025年第十六届蓝桥杯软件赛省赛C/C++大学A组个人解题
c语言·c++·蓝桥杯
jiunian_cn4 小时前
【c++】异常详解
java·开发语言·数据结构·c++·算法·visual studio
梁下轻语的秋缘4 小时前
每日c/c++题 备战蓝桥杯(洛谷P1387 最大正方形)
c语言·c++·蓝桥杯