矩阵的运算

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

(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;
}

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

相关推荐
金融小师妹5 小时前
基于多源政策信号解析与量化因子的“12月降息预期降温”重构及黄金敏感性分析
人工智能·深度学习·1024程序员节
GIS数据转换器10 小时前
基于GIS的智慧旅游调度指挥平台
运维·人工智能·物联网·无人机·旅游·1024程序员节
南方的狮子先生21 小时前
【C++】C++文件读写
java·开发语言·数据结构·c++·算法·1024程序员节
Neil今天也要学习1 天前
永磁同步电机无速度算法--基于三阶LESO的反电动势观测器
算法·1024程序员节
开开心心_Every1 天前
专业视频修复软件,简单操作效果好
学习·elasticsearch·pdf·excel·音视频·memcache·1024程序员节
liu****2 天前
16.udp_socket(三)
linux·开发语言·数据结构·c++·1024程序员节
草莓熊Lotso2 天前
《算法闯关指南:优选算法--位运算》--38.消失的两个数字
服务器·c++·算法·1024程序员节
unable code3 天前
攻防世界-Misc-can_has_stdio?
网络安全·ctf·misc·1024程序员节
思茂信息3 天前
CST License(Flexnet)设置与问题处理方法
服务器·网络·单片机·3d·php·1024程序员节·cst
2301_797892833 天前
论文阅读:《Hypergraph Motif Representation Learning》
论文阅读·1024程序员节