查找数组元素
查找 1
请看这段代码和运行结果,你能看出它要做什么吗?

循环变量从 1 循环到了 10,但输出的只有 2 4 6 8 10,对,这是在打印 1-10 之间的偶数。
像这样,循环访问一组数据,从中找出符合条件的数据,这样的算法叫做查找。
写查找的算法,需要做 2 件事,
- 一是写循环访问每一个数据
- 二是对每一个数据进行验证
这样,就需要写 2 个“条件”:循环条件和筛选条件。

如上例,循环条件是x<=10,筛选条件是x%2==0。
初学者常见的错误是把 2 个条件都写在循环条件里,比如把循环条件写成 x<=10 && x%2== 0,
请注意甄别:循环条件必须能够遍历每一个数据,如果你写的循环条件会漏掉某些数据,或者循环没有能够正常运行,请检查是不是把筛选条件也写在循环条件里了。
任务
右边的代码声明数组保存了一些分数,然后循环打印不及格的分数(也就是在数组中查找不及格分数),代码缺少循环条件 (第 13 行) 和筛选条件 (第 15 行),请填写。
代码
using System;
using System.Collections.Generic;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int[] score = new int[] {89,39,100,51,94,65,70 }; //分数
Console.Write("不及格的有:");
for (int i = 0; i < score.Length; i++)
{
if(score[i] <= 60)//筛选条件
Console.Write(score[i]+",");
}
}
}
}编程练习
查找算法,主要有 2 个步骤:
1、使用循环访问数组中的每一个元素
2、在循环体中设置筛选条件,打印符合条件的元素
任务 1
有一组整数,请循环打印出其中的偶数。运行效果如下:
34,42,2,30,20,
代码 1
using System;
using System.Collections.Generic;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
//声明整型数组,保存一组整数
int[] num = new int[] { 3,34,42,2,11,19,30,55,20};
//请完善代码,循环打印数组中的偶数
for (int i = 0; i < num.Length; ++i) {
if (num[i] %2 == 0)
Console.Write($"{num[i]},");
}
}
}
}查找 2
上一节我们学习查找,是把符合条件的数据打印出来。有的时候我们不想打印,只想知道有没有符合条件的数据,该怎么做呢?下面的例子查找一组人名,如果人名中包含“诺贝尔”,就打印“有诺贝尔”,如果没有,就打印“木有木有”:

通过源代码可以看到,数组的第二个元素就是要查找的“诺贝尔”,运行结果是这样的:
这段代码有一个逻辑错误,事实上,数组中只要有一个“诺贝尔”就可以认定“有诺贝尔”,但必须所有的名字都不是“诺贝尔”,才能认定“木有木有”。
或者这么说:
- 一组数据中只要有一个符合条件,就可以认为“有符合条件的数据”;
- 但只有一组数据中每一个都不符合条件,才能认为“没有符合条件的数据”——一个相等即为"有",全都不等才是"无"。
那么,到底应当怎样判断有无呢?请看下面的代码:

- 变量 hasNbr 起到了关键作用:记录筛选结果。
- 它的初始值为 false ,表示没有,
- 如果循环中找到了相等的数据,再修改 hasNbr 的值为 true ,表示有。
- 循环结束后,只要看看变量 hasNbr 是 true 还是 false ,就知道循环中是否修改过。
运行结果如下(有诺贝尔):
删去数组中的“诺贝尔”,再次运行程序:
任务 2
右边代码检查了一组考试分数,看有没有考试不及格的,请仔细阅读代码,了解程序逻辑,然后在第 18 行(如果需要可以写多行)填写代码,完成功能。
代码 2
using System;
using System.Collections.Generic;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int[] score = { 85,76,98,100,62,60}; //分数
bool hasNopass = false;//记录是否有不及格的,默认没有
for (int i = 0; i < score.Length; i++)
{
if (score[i] < 60)//如果有不及格的
{
//记录有不及格的
hasNopass = true;
break;
}
}
if (hasNopass)
Console.WriteLine("有人不及格");
else
Console.WriteLine("都及格啦!");
}
}
}