#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int in[9][9];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
scanf("%d", &in[i][j]);
}
}
int sum1 = 0, sum2 = 0;
for (int i = 0; i < 3; i++) {
sum1+=in[i][i];
}
for (int i = 0; i < 3; i++) {
sum2 += in[i][2 - i];
}
printf("%d %d", sum1, sum2);
return 0;
}
这个是最基础的,分别求主对角线和副对角线的和
sum2 += in[i][2 - i];
在循环条件是i<3,但是运算时却是2-i
所以有关矩阵,请牢记数组下标第一个是0,而不是1
再看看矩阵的转置
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void printfs(int in[999][999], int ins[999][999], int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", in[i][j]);
}
printf("\n");
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%d", ins[i][j]);
}
printf("\n");
}
}
int main() {
int in[999][999], m, n;
scanf("%d %d", &m, &n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &in[i][j]);
}
}
int ins[999][999];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ins[i][j] = in[m - 1 - j][i];
}
}
printfs(in, ins, m, n);
return 0;
}
第一点,void printfs(int in[999][999], int ins[999][999], int m, int n)
为什么不能是int in[][],int ins[][]
在 C 语言中,数组在函数传参时有一些特定的规则。你不能使用不定大小的数组作为函数参数,例如 int in[][]
或 int ins[][]
。这是因为 C 语言需要知道数组的大小,以便正确地计算内存地址
为什么多维数组要明确除一维外的数组大小:
数组大小:在 C 语言中,数组的维度必须在编译时已知。对于多维数组,除了第一维,其他维度的大小必须在函数参数中明确指定。例如,int in[][999]
是合法的,但 int in[][]
不是,因为编译器无法确定第二维的大小
//也就是说,函数传参对第一维放松了要求,但是对于进一步的维度必须要先确认它们的大小(在 C 语言中,二维数组实际上是一个一维数组的数组)
指针的使用:在函数参数中,数组实际上会被转换为指针。对于一维数组,int arr[]
可以被视为 int *arr
。对于二维数组,int arr[m][n]
会被视为 int (*arr)[n]
int *arr在传一维数组时,arr表示指向该一维数组的首个元素的指针,传递的是首个元素的地址
int (*arr)[n] 也可以用于指向一个包含 n
个 int
元素的数组,但它并不是用于一维数组的标准方式,同时,这样徒增麻烦
int (*arr)[n]多用于处理二维数组,arr
指向的是一个一维数组(每一行),而 n
则表示每一行有n列。通过这种方式,C 语言能够有效地处理多维数组
在处理矩阵转置时,如果是要求顺时针旋转90度,那么你需要把头逆时针90度转过去看
除了注意针对ins的任何循环中的m和n外(意义互换了),ins[i][j] = in[m - 1 - j][i];这个核心代码必须强调
这个核心代码的右边不是[n-1-j],这是因为你在针对in时,m就是行,n就是列,要对它本身进行计算,而不是针对现在的ins
Comments NOTHING