题目:
输入N阶矩阵
进行以下操作:
转置(TRANSLATE):即将aij转变为aji ,并将转置后的矩阵(新矩阵)存储至原二维数组中
加法(ADD):即矩阵A加矩阵B,并将新矩阵存储至原二维数组中
乘法(MULTIPLY):即矩阵A乘矩阵B,并将新矩阵存储至原二维数组中
对角线相加(SUM):输出两条对角线上之和(不重复相加)
输入:
第一行为矩阵阶数N
下N行代表该N阶矩阵
其后每一行都为对应操作,,以OVER结束
输出:
对应操作得到的新矩阵/数值
输入样例:
2
1 0
0 1
TRANSLATE
ADD
1 0
0 1
ADD
2 0
0 2
MULTIPLY
1 2
3 4
SUM
OVER
输出样例:
1 0
0 1
2 0
0 2
4 0
0 4
4 8
12 16
40
方法总结:
①字符串函数strcmp用来判断字符串是否相等,从而进行对应操作
②线性代数相关知识
#include <string.h>
#include <stdio.h>
//矩阵转置
void translate(int a[100][100], int n) //注意函数调用创建的是二维数组
{
int b[100][100] = { 0 };
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
b[i][j] = a[j][i];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = b[i][j]; //转置:坐标(x,y)——>(y,x) 对应索引同理
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d",a[i][j]);
if (j != n - 1) //输出的每一行最后一个元素不带空格
printf(" ");
}
printf("\n");
}
}
//矩阵乘法
void multiply(int a[100][100], int n)
{
int b[100][100] = { 0 }; //输入矩阵
int c[100][100] = { 0 }; //结果矩阵
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d",&b[i][j]);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
c[i][j] = 0;
//注意:这是三层循环,矩阵乘法的核心(左取一行,右取一列,对应相乘再相加)
for(int k = 0;k < n;k++)
{
c[i][j] += a[i][k] * b[k][j]; //a[i][k]从左往右 b[k][j]从上往下
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = c[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d", a[i][j]);
if (j != n - 1) //输出的每一行最后一个元素不带空格
printf(" ");
}
printf("\n");
}
}
//矩阵加法
void add(int a[100][100], int n)
{
int b[100][100] = { 0 };
int c[100][100] = { 0 };
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &b[i][j]);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
c[i][j] = a[i][j] + b[i][j]; //对应位置相加即可
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = c[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d", a[i][j]);
if (j != n - 1) //输出的每一行最后一个元素不带空格
printf(" ");
}
printf("\n");
}
}
void sum(int a[100][100], int n)
{
int r = 0;
for (int i = 0; i < n; i++)
{
r += a[i][i];
}
for(int i = 0; i < n; i++)
{
if(i != n - 1 - i)
{
r += a[i][n-i-1];
}
}
printf("%d\n",r);
}
int main()
{
int n = 0;
scanf("%d", &n);
int arr[100][100] = { 0 };
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
char op[20];
while (1)
{
scanf("%s", op); //读取对应操作
if (strcmp(op, "OVER") == 0) //判定矩阵操作的结束
{
break;
}
else if (strcmp(op, "TRANSLATE") == 0)
{
translate(arr, n);
}
else if (strcmp(op, "ADD") == 0)
{
add(arr, n);
}
else if (strcmp(op, "MULTIPLY") == 0)
{
multiply(arr, n);
}
else if (strcmp(op, "SUM") == 0)
{
sum(arr, n);
}
}
return 0;
}
368






