- C#从入门到精通(第4版)
- 明日科技
- 2872字
- 2020-11-28 16:23:21
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 输出数组值