题目如下
有一个3*3的矩阵num,编程实现:
(1)求出元素中的最大值和最小值,以及最大值和最小值所在的行号和列号(行号和列号从0开始);
(2)分别求出各行、各列及两条对角线上元素之和。
以以下矩阵为例:
1 2 3
4 5 6
7 8 9
要求:
(1)各个元素的值在程序运行时从键盘输入;
(2)求和必须使用循环实现,不能直接用元素相加(如第0行的和,不可写num[0][0]+num[0][1]+num[0][2]);
(3)按照以下形式输出:
第0行元素之和为6。
第1行元素之和为15。
第2行元素之和为24。
第0列元素之和为12。
第1列元素之和为15。
第2列元素之和为18。
两条对角线的元素之和分别为15、15。
最大元素值是9,位于第2行第2列。
最小元素值是1,位于第0行第0列。
老样子,先分析,三个功能:输入矩阵、求最值输出、求和输出。
输入矩阵功能就放在main函数里面了,一个二维数组,遍历输入就行。
int main() {
int a[3][3];
int i, j;
printf("请输入%d个数:\n", 3 * 3);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
scanf_s("%d", &a[i][j]);
}
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%5d", a[i][j]);
}
printf("\n");
}
SUM(a);
MAXMIN(a);
}
求最值元素,简单的打擂台算法,定一个擂主,遍历各个元素挨个去比较就行。
这里写的时候一开始偷懒,max和min都定的a[0][0],结果导致求最小值的for循环直接跳过了,从而出现了bug,由于题目给出了数据,所以我直接定一个较大元素为擂主(偷懒)
int MAXMIN(int a[3][3]) {
int m, n, x, y;
int max, min;
int i, j;
max = a[0][0];
min = a[2][2];
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (a[i][j] > max) {
max = a[i][j];
m = i;
n = j;
}
if (a[i][j] < min) {
min = a[i][j];
x = i;
y = j;
}
}
}
printf("最大元素值是%d,位于第%d行第%d列\n", max, m, n);
printf("最小元素值是%d,位于第%d行第%d列\n", min, x, y);
return 0;
}
然后就是求和函数,还是for循环遍历一次,在正确的地方输出就行。
对角线的话,加一个判断:主对角线行列相等,辅对角线相加等于特定数值就行。
int i, j;
int sum1=0,sum2=0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
sum1 = a[i][j] + sum1;
}
printf("第%d行元素之和为%d\n", i, sum1);
sum1 = 0;
}
for (j = 0; j < 3; j++) {
for (i = 0; i < 3; i++) {
sum1 = a[i][j] + sum1;
}
printf("第%d列元素之和为%d\n", j, sum1);
sum1 = 0;
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (i == j) {
sum1 = a[i][j] + sum1;
}
}
}
for (i = 0; i < 3; i++) {
for (j = 0; j <3 ; j++) {
if (i + j==2) {
sum2 = a[i][j] + sum2;
}
}
}
printf("两条对角线的元素之和分别为%d、%d。\n", sum1, sum2);
return 0;
}