矩阵的运算

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

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

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

相关推荐
希忘auto3 天前
详解Redis的常用命令
redis·1024程序员节
yaosheng_VALVE3 天前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king3 天前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
一个通信老学姐8 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui8 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9269 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang20219 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒10 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang202110 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节
一个通信老学姐10 天前
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节