6.2 循环语句

循环语句主要用于重复执行嵌入语句,在C#中,常见的循环语句有while语句、do…while语句、for语句和foreach语句。下面将对这几种循环语句做详细讲解。

6.2.1 while语句

视频讲解:光盘\TM\lx\6\03 while语句.mp4

while语句用于根据条件值执行一条语句零次或多次,当每次while语句中的代码执行完毕时,将重新查看是否符合条件值,若符合则再次执行相同的程序代码,否则跳出while语句,执行其他程序代码。

1.基本的while循环

while语句的基本格式如下。

        while(【布尔表达式】)
        {
            【语句块】
        }

while语句的执行顺序如下:

计算【布尔表达式】的值。

如果【布尔表达式】的值为true,程序执行【语句块】。执行完毕重新计算【布尔表达式】的值是否为true。

如果【布尔表达式】的值为false,则控制将转移到while语句的结尾。

while语句在现实生活中就相当于公园中的木马,当按下“启动”按钮时(也就是布尔表达式设置为true),木马将不停地转动。如果按下“停止”按钮(也就是布尔表达式设为false),木马将停止转动。while循环语句的执行过程如图6.7所示。

图6.7 while语句的执行过程

下面通过实例演示如何使用while语句。

【例6.6】创建一个控制台应用程序,声明一个string类型的数组,并初始化数组,然后通过while语句循环输出数组中的所有成员,代码如下。(实例位置:光盘\TM\sl\6\5)

        static void Main(string[] args)
        {
            Console.WriteLine("2014年NBA总冠军马刺队主力队员:");
            //声明一个string类型的数组,并初始化
            string[] Players = new string[] { "蒂姆·邓肯", "马努·吉诺比利", "托尼·帕克", "卡哇伊·莱昂纳德", "伯瑞
        斯·迪奥", "丹尼·格林", "帕蒂·米尔斯" };
            int i=0;                       //声明一个int类型的变量i并初始化为0
            while (i<Players.Length)       //调用while语句当i小于数组长度时执行
            {
              //输出数组中的值
              Console.WriteLine(Players[i]);
              i++;                       //i自增1
            }
            Console.ReadLine();
        }

程序的运行结果为:


2014年NBA总冠军马刺队主力队员:

蒂姆·邓肯

马努·吉诺比利

托尼·帕克

卡哇伊·莱昂纳德

伯瑞斯·迪奥

丹尼·格林

帕蒂·米尔斯

注意 初学者经常犯的一个错误就是在while表达式的括号后加“; ”。如:

              while(x = = 5);
              Console.WriteLine ("x的值为5");

这时,程序会认为要执行一条空语句,从而进入无限循环,C#编译器又不会报错,这可能会浪费很多时间去调试,读者应注意这个问题。

2.跳出或执行下一次循环

在while语句的嵌入语句块中,break语句用于将控制转到while语句的结束点,而continue语句可用于将控制直接转到下一次循环。

说明 在循环语句中,可以通过goto、return或throw语句退出。

【例6.7】创建一个控制台应用程序,声明两个int类型的变量s和num,分别初始化为0和80。然后通过while语句循环输出,当s大于40时,使用break语句终止循环。当s是偶数时,使用continue语句将程序转到下一次循环,从而实现输出40以内的所有奇数,代码如下。(实例位置:光盘\TM\sl\6\6)

      static void Main(string[] args)
      {
          int s=0, num=80;                     //声明两个int类型的变量并初始化
          whiIe(s<num)                         //调用while语句,当s小于num时执行
          {
              s++;                             //s自增1
              if (s>40)                        //使用if语句判断s是否大于40
              {
                break;                         //使用break语句终止循环
              }
              if ((s % 2)==0)                  //调用if语句判断s是否为偶数
              {
                continue;                      //使用continue语句将程序转到下一次循环
              }
              Console.WriteLine(s);            //输出s
          }
          Console.ReadLine();
      }

程序的运行结果为“1~39的所有奇数”。

闯关训练:有一个经典的面试题,有一组数1、1、2、3、5、8、13、21、34…要求用递归算法算出这组数的第30个数是多少?请用C#编程实现。

6.2.2 do…while语句

视频讲解:光盘\TM\lx\6\04 do...while语句.mp4

do...while循环语句与while循环语句类似,它们之间的区别是:while语句为先判断条件是否成立再执行循环体,而do...while循环语句则先执行一次循环后,再判断条件是否成立。也就是说do...while循环语句中“{}”中的程序段至少要被执行一次。do...while循环语句基本形式如下。

        do
        {
            【语句块】
        }while(【布尔表达式】);

do…while语句的执行顺序如下。

程序首先执行【语句块】。

当程序到达【语句块】的结束点时,计算【布尔表达式】的值。如果【布尔表达式】的值是true,程序转到do…while语句的开头;否则,结束循环。

与while语句的一个明显区别是do...while语句在结尾处多了一个分号(;)。根据do...while循环语句的语法特点总结出do...while循环语句的执行过程,如图6.8所示。

图6.8 do…while循环语句的执行过程

【例6.8】创建一个控制台应用程序,定义一个string类型的数组,并初始化数组,然后使用do…while语句循环输出数组中的值,代码如下。(实例位置:光盘\TM\sl\6\7

        static void Main(string[] args)
        {
            string[] myArray=new string[3]{"世界杯", "欧洲杯", "欧冠"};   //声明一个string数组并初始化
            int i = 0;
            do                                                         //调用do...while语句
            {
              Console.WriteLine(myArray[i]);                           //输出数组中数据
              i++;
            }while (i<myArray.Length);                                 //设置do...while语句的条件
            Console.ReadLine();
        }

程序的运行结果为:

世界杯

欧洲杯

欧冠

6.2.3 for语句

视频讲解:光盘\TM\lx\6\05 for语句.mp4

for语句是C#程序设计中最有用的循环语句之一。for语句用于计算一个初始化序列,然后当某个条件为真时,重复执行嵌套语句并计算一个迭代表达式序列。如果为假,则终止循环,退出for循环。for语句的基本形式如下。

        for(【初始化表达式】; 【条件表达式】; 【迭代表达式】)
        {
            【语句块】
        }

【初始化表达式】由一个局部变量声明或者由一个逗号分隔的表达式列表组成。用【初始化表达式】声明的局部变量的作用域从变量的声明开始,一直到嵌入语句的结尾。【条件表达式】必须是一个布尔表达式。【迭代表达式】必须包含一个用逗号分隔的表达式列表。

for语句的执行原理就好像是复印机复印纸张一样,可以在复印机上设置要复印的张数,也就是设置循环条件,然后开始复印。当复印的张数等于设置的张数时,也就是循环条件为假时,将停止复印。

for语句执行的顺序如下。

如果有【初始化表达式】,则按变量初始值设定项或语句表达式的书写顺序指定它们,此步骤只执行一次。

如果存在【条件表达式】,则计算它。

如果不存在【条件表达式】,则程序将转移到嵌入语句。如果程序到达了嵌入语句的结束点,按顺序计算for循环表达式,然后从上一个步骤中for条件的计算开始,执行另一次循环。

for循环语句的执行过程如图6.9所示。

说明 在应用for循环体时,循环体中的3个条件不能为空,若为空,如for( ; ; ), for语句将出现死循环。

【例6.9】创建一个控制台应用程序,首先声明一个int类型的数组,然后向数组中添加10个值,最后使用for循环语句遍历数组,并将数组中的值输出,代码如下。(实例位置:光盘\TM\sl\6\8)

        static void Main(string[] args)
        {
            int[] myint=new int[10];                   //声明一个具有10个元素的整型数组
            myint[0]=0;                                //向数组中添加第一个元素
            myint[1]=1;                                //向数组中添加第二个元素
            myint[2]=2;                                //向数组中添加第三个元素
            myint[3]=3;                                //向数组中添加第四个元素
            myint[4]=4;                                //向数组中添加第五个元素
            myint[5]=5;                                //向数组中添加第六个元素
            myint[6]=6;                                //向数组中添加第七个元素
            myint[7]=7;                                //向数组中添加第八个元素
            myint[8]=8;                                //向数组中添加第九个元素
            myint[9]=9;                                //向数组中添加第十个元素
            for(int i=0; i<myint.Length; i++)          //调用for循环语句
            {
              Console.WriteLine("myint[{0}]的值是:{1}", i, myint[i]); //输出结果
            }
            Console.ReadLine();
        }

程序的运行结果如图6.10所示。

图6.9 for循环语句执行过程

图6.10 输出数组中的值

互动练习:尝试使用C#制作一个数字猜猜看小游戏,具体要求为:使用随机对象产生一个1至100间的整数,当用户单击“开始”按钮时,动态生成100个按钮,并开始计时,如果用户单击的数字小于随机数,那么被单击的按钮变为红色,并显示字符串“小”,如果用户单击的数字大于随机数,那么被单击的按钮变为红色,并显示字符串“大”,如果单击的数字等于随机数就会弹出消息框,提示已经猜对了数字,并显示用时及猜测次数。

6.2.4 foreach语句

视频讲解:光盘\TM\lx\6\06 foreach语句.mp4

foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何foreach语句都可以改写为for语句版本。foreach语句用于枚举一个集合的元素,并对该集合中的每个元素执行一次嵌入语句。但是,foreach语句不应用于更改集合内容,以避免产生不可预知的错误。foreach语句的基本形式如下。

        foreach(【类型】 【迭代变量名】 in 【集合类型表达式】)
        {
            【语句块】
        }

其中,【类型】和【迭代变量名】用于声明迭代变量,迭代变量相当于一个范围覆盖整个语句块的局部变量。在foreach语句执行期间,迭代变量表示当前正在为其执行迭代的集合元素。

【集合类型表达式】必须有一个从该集合的元素类型到迭代变量的类型的显示转换,如果【集合类型表达式】的值为null,则会出现异常。

说明 foreach语句也可以用于循环访问数组中的元素。

【例6.10】创建一个控制台应用程序,实例化一个ArrayList数组,向数组中添加值,然后通过使用foreach语句遍历整个数组,并输出数组中的值,代码如下。(实例位置:光盘\TM\sl\6\9)

        static void Main(string[] args)
        {
            ArrayList alt=new ArrayList();           //实例化ArrayList类
            alt.Add("用一生下载你");                   //使用Add方法向对象中添加数据
            alt.Add("芸烨湘枫");                      //使用Add方法向对象中添加数据
            alt.Add("一生所爱");                      //使用Add方法向对象中添加数据
            alt.Add("情茧");                         //使用Add方法向对象中添加数据
            alt.Add("痞子CAI");                      //使用Add方法向对象中添加数据
            Console.WriteLine("您收藏的网名有:");     //输出提示
            foreach(string InternetName in alt)     //使用foreach语句输出数据
            {
              Console.WriteLine(InternetName);      //输出ArrayList对象中的所有数据
            }
            Console.ReadLine();
        }

程序的运行结果如图6.11所示。

图6.11 输出数组值