矩阵的运算

目标:实现一个能进行稀疏矩阵基本运算(包括加、减、乘)的运算器。

(1)以三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减、相乘的运算

(2)稀疏矩阵的输入形式为三元组表示,运算结果则以通常的阵列形式列出。

(3)首先提示用户输入矩阵的行数和列数,并判别给出的两个矩阵行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和列数均不超过20。

(4)程序需给出菜单项,用户按照菜单提示进行相应的操作。

复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
void menu()
{
	printf("****************************************************************\n");
	printf("****************************************************************\n");
	printf("**********************欢迎使用矩阵计算器************************\n");
	printf("*******1、转置                               2、加法      ******\n");
	printf("*******3、减法                               4、数乘      ******\n");
	printf("*******5、乘法                               0、退出     *******\n");
	printf("****************************************************************\n");
	printf("****************************************************************\n");
}

void  Matrix_output(int(*s)[100], int m, int n)//输出
{
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%2d ", s[i][j]);
		}
		printf("\n");
	}
}

void  Matrix_transpose(int(*s)[100], int(*t)[100], int m, int n)//转置
{
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			t[j][i] = s[i][j];
		}
	}
}
void Matrix_addition(int(*s)[100], int(*t)[100], int(*p)[100], int m, int n)//相加
{
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			p[i][j] = s[i][j] + t[i][j];
		}
	}
}

void Matrix_subtraction(int(*s)[100], int(*t)[100], int(*p)[100], int m, int n)//相减
{
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			p[i][j] = s[i][j] - t[i][j];
		}
	}
}

void Matrix_shucheng(int(*s)[100], int(*t)[100], int m, int n, int k)//数乘
{
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			t[i][j] = k * s[i][j];
		}
	}
}

void Matrix_multiplication(int(*s)[100], int(*t)[100], int(*p)[100], int m, int n, int x, int y)//相乘
{
	int i, j, k, sum;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < y; j++)
		{
			sum = 0;
			for (k = 0; k < n; k++)
			{
				sum += s[i][k] * t[k][j];
			}
			p[i][j] = sum;
		}
	}
}

int main()
{
	int m, n, i, j, k, input;
	int x, y;
	int A[100][100], B[100][100], C[100][100];
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1://转置
			printf("请输入矩阵的行数:> ");
			scanf("%d", &m);
			printf("\n");
			printf("请输入矩阵的列数:> ");
			scanf("%d", &n);
			printf("\n");
			printf("请输入矩阵:\n");
			for (i = 0; i < m; i++)
			{
				for (j = 0; j < n; j++)
				{
					scanf("%d", &A[i][j]);
				}
			}
			printf("原矩阵:\n");
			Matrix_output(A, m, n);
			Matrix_transpose(A, B, m, n);
			printf("转置后的矩阵:\n");
			Matrix_output(B, n, m);
			break;
		case 2://相加
			printf("请输入第一个矩阵的行数:> ");
			scanf("%d", &m);
			printf("\n");
			printf("请输入第一个矩阵的列数:> ");
			scanf("%d", &n);
			printf("\n");
			printf("请输入矩阵:\n");
			for (i = 0; i < m; i++)
			{
				for (j = 0; j < n; j++)
				{
					scanf("%d", &A[i][j]);
				}
			}
			printf("请输入第二个矩阵的行数:> ");
			scanf("%d", &x);
			printf("\n");
			printf("请输入第二个矩阵的列数:> ");
			scanf("%d", &y);
			printf("\n");
			if (m == x && n == y)
			{
				printf("请输入矩阵:\n");
				for (i = 0; i < m; i++)
				{
					for (j = 0; j < n; j++)
					{
						scanf("%d", &B[i][j]);
					}
				}
				printf("第一个矩阵:\n");
				Matrix_output(A, m, n);
				printf("第二个矩阵:\n");
				Matrix_output(B, m, n);
				Matrix_addition(A, B, C, m, n);
				printf("和矩阵:\n");
				Matrix_output(C, m, n);
			}
			else
			{
				printf("这两个矩阵不是同型矩阵,不能相加\n");
			}
			break;
		case 3:
			printf("请输入第一个矩阵的行数:> ");
			scanf("%d", &m);
			printf("\n");
			printf("请输入第一个矩阵的列数:> ");
			scanf("%d", &n);
			printf("\n");
			printf("请输入第一个矩阵:\n");
			for (i = 0; i < m; i++)
			{
				for (j = 0; j < n; j++)
				{
					scanf("%d", &A[i][j]);
				}
			}
			printf("请输入第二个矩阵的行数:> ");
			scanf("%d", &x);
			printf("\n");
			printf("请输入第二个矩阵的列数:> ");
			scanf("%d", &y);
			printf("\n");
			if (m == x && n == y)
			{
				printf("请输入第二个矩阵:\n");
				for (i = 0; i < m; i++)
				{
					for (j = 0; j < n; j++)
					{
						scanf("%d", &B[i][j]);
					}
				}
				printf("第一个矩阵:\n");
				Matrix_output(A, m, n);
				printf("第二个矩阵:\n");
				Matrix_output(B, m, n);
				Matrix_subtraction(A, B, C, m, n);
				printf("差矩阵:\n");
				Matrix_output(C, m, n);
			}
			else
			{
				printf("这两个矩阵不是同型矩阵,不能相减\n");
			}
			break;
		case 4:
			printf("请输入矩阵的行数:> ");
			scanf("%d", &m);
			printf("\n");
			printf("请输入矩阵的列数:> ");
			scanf("%d", &n);
			printf("\n");
			printf("请输入这个数:>");
			scanf("%d", &k);
			printf("\n");
			printf("请输入矩阵:\n");
			for (i = 0; i < m; i++)
			{
				for (j = 0; j < n; j++)
				{
					scanf("%d", &A[i][j]);
				}
			}
			printf("原矩阵:\n");
			Matrix_output(A, m, n);
			Matrix_shucheng(A, B, m, n, k);
			printf("数乘矩阵:\n");
			Matrix_output(B, m, n);
			break;
		case 5:
			printf("请输入第一个矩阵的行数:> ");
			scanf("%d", &m);
			printf("\n");
			printf("请输入第一个矩阵的列数:> ");
			scanf("%d", &n);
			printf("\n");
			printf("请输入第一个矩阵:\n");
			for (i = 0; i < m; i++)
			{
				for (j = 0; j < n; j++)
				{
					scanf("%d", &A[i][j]);
				}
			}
			printf("请输入第二个矩阵的行数:> ");
			scanf("%d", &x);
			printf("\n");
			printf("请输入第二个矩阵的列数:> ");
			scanf("%d", &y);
			printf("\n");
			if (n == x)
			{
				printf("请输入第二个矩阵:\n");
				for (i = 0; i < x; i++)
				{
					for (j = 0; j < y; j++)
					{
						scanf("%d", &B[i][j]);
					}
				}
				printf("第一个矩阵:\n");
				Matrix_output(A, m, n);
				printf("第二个矩阵:\n");
				Matrix_output(B, x, y);
				Matrix_multiplication(A, B, C, m, n, x, y);
				printf("相乘矩阵:\n");
				Matrix_output(C, m, y);
			}
			else
			{
				printf("这两个矩阵不能相乘\n");
			}
			break;
		case 0:
			printf("退出计算,欢迎再次使用\n");
			break;
		default:
			printf("输入错误,请从新输入\n");
			break;
		}

	} while (input);

	return 0;
}

出菜单项,用户按照菜单提示进行相应的操作。

相关推荐
网安_秋刀鱼9 小时前
【java安全】shiro反序列化1(shiro550)
java·开发语言·安全·web安全·网络安全·1024程序员节
unable code2 天前
攻防世界-Misc-Wire1
网络安全·ctf·misc·1024程序员节
开开心心就好3 天前
版本转换工具,支持Win双系统零售批量版
linux·运维·服务器·pdf·散列表·零售·1024程序员节
开开心心就好3 天前
免费卸载工具,可清理残留批量管理启动项
linux·运维·服务器·windows·随机森林·pdf·1024程序员节
unable code3 天前
攻防世界-Misc-4-1
网络安全·ctf·misc·1024程序员节
yBmZlQzJ5 天前
免费内网穿透-端口转发配置介绍
运维·经验分享·docker·容器·1024程序员节
金融小师妹6 天前
AI算法视角下非农夜冲击波来袭,黄金高位区间震荡态势的深度神经网络解析
大数据·深度学习·1024程序员节
全栈小58 天前
【数据库】浙人医携手金仓数据库,打造全国首个多院区异构多活容灾架构
数据库·1024程序员节·金仓
CoderYanger10 天前
贪心算法:7.最长连续递增序列
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger10 天前
贪心算法:6.递增的三元子序列
java·算法·leetcode·贪心算法·1024程序员节