有志者自有千计万计,无志者只感千难万难。加油!
前言
题为c程序设计(第五版)谭浩强 第6章 第8题。
一、题目复现
二、实现步骤
1.思路分析
1.通过scanf输入数组的行数和列数。
2.通过二重循环输入数组的具体元素。
3.初始化标记量flag(一般初始化为0).
4.枚举每一行,找出每一行中最大的元素,并记下其列号。
5.将min的初始值即一开始的对比值初始化为该行的最大值max。
6.找出该列中最小的元素。
7.验证该行中最大的元素和该列中最小的元素是否为同一个元素(即min是否等于max)。
8.如果该位置上的元素在该行上最大,在该列上最小,则输出该位置所在的行号、列号和元素值,并将flag置为1。
9.如果没有鞍点,则输出"NO"。
2.进入实操
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 100
int main()
{
int a[N][N], i, j, k, n, m, max, min, flag;
printf("请输入矩阵的行数和列数:\n");
scanf("%d %d", &n, &m); //输入矩阵的行数和列数
printf("请输入矩阵的元素:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &a[i][j]); //输入矩阵元素
}
}
flag = 0; //flag用于标记是否有鞍点
for (i = 0; i < n; i++)
{ //枚举每一行
max = a[i][0]; //max记录该行中最大的元素
k = 0; //k记录最大元素所在的列号
for (j = 1; j < m; j++)
{ //找出该行中最大的元素及其所在列号
if (a[i][j] > max)
{
max = a[i][j];
k = j;
}
}
min = max; //min记录该列中最小的元素,初始值为该行中最大的元素
for (j = 0; j < n; j++)
{ //找出该列中最小的元素
if (a[j][k] < min)
{
min = a[j][k];
}
}
if (min == max)
{ //如果该位置上的元素在该行上最大,在该列上最小,则输出该位置所在的行号、列号和元素值,并将flag置为1
printf("行号:%d 列号:%d 值:%d\n", i + 1, k + 1, max);
flag = 1;
}
}
if (flag == 0)
{
//如果没有鞍点,则输出"NO"
printf("NO\n");
}
return 0;
}
运行结果如下(示例):
总结
针对该题,主要考察了:
1.标记量的设置。
2.如何找出数组中一行最大的元素。(即那每行的第一个元素去依次比较替换)
3.如何在确定一行中最大元素的同时,确定其是否为该列中最小。(即将比较量(本题中为min)初始化为该行中的最大值元素,然后在该列中依次比较替换。)