目标:实现一个能进行稀疏矩阵基本运算(包括加、减、乘)的运算器。
(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;
}
出菜单项,用户按照菜单提示进行相应的操作。