机械工业出版社C#.NET程序设计案例教程高职高专计算机类课程改革规划教材国家社会科学基金“十一五”规划(教育学科)国家级课题成果主编:杨东霞秦俊平参编:杨忠义赵祯模块三C#流程控制循环语句3语句的类别1表达式语句与复合语句4分支语句25转移语句56调试程序7异常处理语句模块三C#流程控制本模块导读计算机是通过执行程序来解决问题的,而计算机更长于重复运算,C#中实现重复运算的控制结构称为循环语句;要提前结束循环或短路某次循环,要使用break或continue语句;在较为复杂的程序中,程序往往需要根据不同的情况进行不同的处理,C#区别不同的情况通过分支语句结合逻辑表达式来实现;当程序执行遇到任何错误情况或意外行为时,可通过C#的异常处理语句进行处理;循环语句、break与continue语句、分支语句与异常处理语句都属于C#的流程控制语句。程序语句本来是按照书写顺序执行的,结合使用循环语句、分支语句就可以实现结构化程序的三种基本结构:顺序结构、选择结构与循环结构。本模块主要从程序流程控制的角度介绍各类语句及其用法。通过本模块的学习和实训,学生应该熟练掌握常用语句的使用方法,能够根据具体的问题选择合适的结构和语句进行简单的程序设计并对它进行调试。模块三C#流程控制本模块要点语句的类别表达式语句与复合语句分支语句循环语句转移语句调试程序异常处理语句模块三C#流程控制任务一语句【案例】计算机是通过执行程序来解决问题的,程序是算法的计算机语言描述。我们从C#提供的各种语句开始,将它们逐步应用到人事工资管理系统中。模块三C#流程控制知识点详解C#语句分成八大类:(1)表达式语句:各种表达式加分号组成。(2)复合语句:将多条语句组合成一条语句的结构。(3)空语句:只有一个分号的语句。(4)分支语句:包括if、if/else和switch语句。(5)循环语句:包括while、do/while、for和foreach语句。(6)标记语句:包括case、default和标号语句。(7)转移语句:包括continue、break、return和goto语句。(8)异常处理语句:包括try、catch和finally组成的异常代码块。模块三C#流程控制其中后五类用于程序的执行流程控制,统称为流程控制语句。C#语言的表达式加上一个分号“;”结尾,就构成表达式语句,表达式语句主要完成运算功能。赋值表达式加上一个分号“;”结尾就构成了赋值语句,由于运算的结果往往需要保存起来,所以赋值语句也成为用得最多的表达式语句。空语句是只由一个分号构成的语句,它什么也不做。在需要语句又不进行任何操作时使用空语句。例如用空语句作为循环体,表示循环体什么也不做。把多个语句用花括号“{”和“}”括起来组成的结构称为复合语句。复合语句的一般形式为:{[说明部分]语句部分}模块三C#流程控制其中:(1)在复合语句中可以定义变量,所定义的变量只可以在复合语句中使用。(2)复合语句中还可以包含复合语句,由此形成最基本的嵌套结构。(3)复合语句内的各条语句都必须以分号“;”结尾,在右花括号“}”外不加分号“;”。(4)在程序中放置单条语句的地方都可以使用复合语句,复合语句在逻辑上是单个语句,表示{}中的语句序列是一个整体。模块三C#流程控制例3-1从键盘输入5个整数并输出。代码如下:classProgram{staticvoidMain(string[]args){inti;for(i=0;i5;i++){intj;j=int.Parse(Console.ReadLine());Console.WriteLine(第{0}次:{1},i,j);}//Console.WriteLine(“第{0}次:{1}”,i,j);提示当前上下文中不存在名称“j”}}模块三C#流程控制任务二选择结构【案例】在人事工资管理系统中,使用系统前需要先登录,输入用户名和密码与事先分配的用户名和密码进行比较,如相等则为合法用户,否则为非法用户,也就是要根据输入的用户名和密码区别出合法用户与非法用户两种情况并执行不同的代码;对津贴的发放是依据员工的岗位来确定并细化为多种情况,这些都需要采用选择结构实现。模块三C#流程控制子任务1if语句和if/else语句知识点详解if语句的一般形式为:if(条件)语句;false图3-1if语句true条件语句1模块三C#流程控制子任务1if语句和if/else语句知识点详解语句1语句2条件truefalse图3-2if/else语句if/else语句的一般形式为:if(条件)语句1;else语句2;模块三C#流程控制例3-2在人事工资管理系统中,使用系统前需要先登录,输入用户名和密码与事先分配的用户名和密码进行比较,如相等则为合法用户,不相等或没有输入则重新输入。模块三C#流程控制在人事工资管理系统中的已分配用户名和密码保存在数据库中,此处进行了改写。程序中为了使用MessageBox消息框,在程序开始使用了using指令,在解决方案中添加了引用System.Windows.Forms。图3-3添加引用对话框模块三C#流程控制子任务2if/elseif语句知识点详解if/elseif结构的一般形式如下:if(条件1)语句1;elseif(条件2)语句2;elseif(条件3)语句3;…else语句n;条件1语句1条件2条件3语句2语句3语句4truefalsetruetruefalsefalse图3-5嵌套if语句实现多分支模块三C#流程控制if/elseif结构就是if语句的else部分又是一条if/else语句,这就形成了if语句的嵌套形式,当然还允许其它的嵌套形式,如if语句的if部分也是if/else语句。在使用嵌套的if语句时,要注意if和else的配对问题。例如:if(条件1)if(条件2)语句1;else语句2;其中的else应该与哪一个if配对呢?从书写形式来看应与第一个if配对。模块三C#流程控制如果将代码改写为:if(条件1)if(条件2)语句1;else语句2;从书写形式来看应与第二个if配对。为了避免理解上的二义性,C#语言规定,else总是与它前面最近的if配对,因此这段代码else应理解为与第二个if配对,而与采用哪种书写形式无关。如果要使else与第一个if配对,可以将上述程序段改写如下:if(条件1){if(条件2)语句1;}else语句2;通过复合语句符号{}明确表示花括号内是一完整的语句,以此明确if和else的配对关系。模块三C#流程控制例3-3在人事工资管理系统中,根据员工受聘岗位不同,享受不同的津贴。岗位与津贴之间的对应关系如下表所示:岗位津贴A3000B2000C1600D1200E800F600表3-1岗位与津贴之间的对应关系模块三C#流程控制子任务3switch语句if/else语句在两个不同的动作之间进行选择,当要实现在多个不同的动作之间进行选择时,就要用嵌套的if/else来实现,当分支较多时,程序变得复杂冗长,可读性降低。C#提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。模块三C#流程控制知识点详解switch语句的一般形式为:switch(表达式){case常量表达式1:语句组1;break;case常量表达式2:语句组2;break;…case常量表达式n:语句组n;break;default:语句组n+1;break;}=其它图3-6switch语句的结构……表达式=表达式1=表达式2=表达式n语句组1语句组2语句组n语句组n+1=其它模块三C#流程控制其中:(1)case后的各个常量表达式必须为整型值、字符型值或枚举值。(2)case后的各个常量值不可重复出现。例如:case'A':语句;break;case'A':语句;break;会出现编译错误。(3)在每个case后,允许放置多条语句,不必使用复合语句形式,当switch表达式的值与case常量表达式值相等时,执行case后的语句,直到break语句跳出switch结构。(4)break语句是转移语句,其作用是控制程序的流程从switch语句中跳出来,执行switch语句之后的语句。在每个非空分支包括default的最后都需要放置一条break语句,仅当某个分支为空时可以没有break语句,这时,会一直执行到遇到break为止,这与C/C++语言有所不同。(5)default子句可以缺省,如果缺省,当switch表达式的值与所有case后面的常量表达式的值都不相等时,则什么也不执行,直接退出switch语句,而且各case和default子句的先后顺序可以变动,不会影响程序的运行结果。(6)case和default的作用是标记它们后面的语句,以根据switch表达式的值将控制转移到相应语句,它们本身是标号语句,只能用在switch语句体中。所谓标号语句,一般形式如下:标识符:语句标识符的作用是用来标记语句,标识符被称为标号,前置标号的语句被称为标号语句,标号的作用在于供其它语句将控制转移到所标记的语句。模块三C#流程控制任务三循环结构【案例】计算机是通过执行程序来解决问题的,而计算机更长于重复运算,C#中实现重复运算的控制结构称为循环语句。在人事工资管理系统中,计算月度所有员工的平均工资,调整每位员工的工资等都需要重复的处理每位员工的信息。在实际系统中,员工的信息保存在数据库中,本模块的实例为了处理上的方便将员工的信息保存在数组中,侧重介绍如何通过循环语句控制重复处理过程。模块三C#流程控制子任务1while语句知识点详解while语句的一般形式为:while(条件)语句;满足不满足条件语句图3-7while语句的结构模块三C#流程控制子任务2do/while语句知识点详解do/while语句的一般形式为:do语句;while(条件);true条件语句图3-8do/while语句的结构false模块三C#流程控制子任务3for语句知识点详解for语句的一般形式为:for(表达式1;表达式2;表达式3)语句;表达式2语句表达式3truefalse图3-9for语句的结构模块三C#流程控制for语句很好地体现了正确表达循环结构应注意的三个问题:(1)循环控制变量的初始化;(2)循环条件;(3)循环控制变量的更新。模块三C#流程控制至此,我们已经学习了C#语言中三种循环控制语句while、do/while和for语句,下面再讨论三种循环语句的选用方法。同一个问题,往往既可以用while语句解决,也可以用do/while或者for语句来解决,但在实际应用中,应根据具体情况来选用不同的循环语句,选用的一般原则是:(1)如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是由循环体的执行情况确定的,一般用while语句或者do/while语句。(2)当循环体至少执行一次时,用do/while语句,反之,如果循环体可能一次也不执行,选用while语句。模块三C#流程控制子任务4foreach语句知识点详解foreach语句的一般形式为:foreach(元素类型元素变量in数组名或集合名)语句;模块三C#流程控制语句中完成对数组元素或集合元素的访问。(1)foreach循环自动完成数组编历,每次循环中元素变量顺序获得每个数组元素的值,相当于数组名[下标],但元素变量是一个只读变量,在循环中不可更改元素变量的值,也就是说,不可为元素变量赋值。(2)foreach循环依据数组的定义大小进行迭代,循环中下标从0递增到length-1,而非依据数组的有意义元素个数进行迭代。(3)foreach和in配合工作。(4)使用foreach循环不会发生下标越界现象。模块三C#流程控制子任务5多重循环知识点详解一个循环的循环体中包含另一个循环叫作循环嵌套,外层的循环语句称为“外层循环”,内层的的循环语句称为“内层循环”,这种嵌套过程可以有许多层。一个循环外面仅包围一层循环叫双重循环;一个循环外面包围两