Skip to content
On this page

查找数组元素

查找 1

请看这段代码和运行结果,你能看出它要做什么吗?

img

img

循环变量从 1 循环到了 10,但输出的只有 2 4 6 8 10,对,这是在打印 1-10 之间的偶数。

像这样,循环访问一组数据,从中找出符合条件的数据,这样的算法叫做查找

写查找的算法,需要做 2 件事,

  • 一是写循环访问每一个数据
  • 二是对每一个数据进行验证

这样,就需要写 2 个“条件”:循环条件筛选条件

img

如上例,循环条件是x<=10,筛选条件是x%2==0

初学者常见的错误是把 2 个条件都写在循环条件里,比如把循环条件写成 x<=10 && x%2== 0,

请注意甄别:循环条件必须能够遍历每一个数据,如果你写的循环条件会漏掉某些数据,或者循环没有能够正常运行,请检查是不是把筛选条件也写在循环条件里了。

任务

右边的代码声明数组保存了一些分数,然后循环打印不及格的分数(也就是在数组中查找不及格分数),代码缺少循环条件 (第 13 行) 和筛选条件 (第 15 行),请填写。

代码

csharp
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

csharp
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

上一节我们学习查找,是把符合条件的数据打印出来。有的时候我们不想打印,只想知道有没有符合条件的数据,该怎么做呢?下面的例子查找一组人名,如果人名中包含“诺贝尔”,就打印“有诺贝尔”,如果没有,就打印“木有木有”:

img

通过源代码可以看到,数组的第二个元素就是要查找的“诺贝尔”,运行结果是这样的:

img

这段代码有一个逻辑错误,事实上,数组中只要有一个“诺贝尔”就可以认定“有诺贝尔”,但必须所有的名字都不是“诺贝尔”,才能认定“木有木有”。

或者这么说:

  • 一组数据中只要有一个符合条件,就可以认为“有符合条件的数据”;
  • 但只有一组数据中每一个都不符合条件,才能认为“没有符合条件的数据”——一个相等即为"有",全都不等才是"无"

那么,到底应当怎样判断有无呢?请看下面的代码:

img

  • 变量 hasNbr 起到了关键作用:记录筛选结果
  • 它的初始值为 false ,表示没有
  • 如果循环中找到了相等的数据,再修改 hasNbr 的值为 true ,表示
  • 循环结束后,只要看看变量 hasNbrtrue 还是 false ,就知道循环中是否修改过。

运行结果如下(有诺贝尔):

img

删去数组中的“诺贝尔”,再次运行程序:

img

任务 2

右边代码检查了一组考试分数,看有没有考试不及格的,请仔细阅读代码,了解程序逻辑,然后在第 18 行(如果需要可以写多行)填写代码,完成功能。

代码 2

csharp
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("都及格啦!");
        }
    }
}