第5章程序流控制_第1页
第5章程序流控制_第2页
第5章程序流控制_第3页
第5章程序流控制_第4页
第5章程序流控制_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第5章章 程序流程控制程序流程控制n5.1. 顺序结构顺序结构n5.2 选择结构选择结构n5.3 循环结构循环结构n5.4 转移语句转移语句n5.5 异常处理语句异常处理语句n5.6 条件编译条件编译n 总结总结5.1 顺序结构顺序结构n1表达式语句表达式语句n2块块(复合复合)语句语句返回首页5.1.1 表达式语句表达式语句n表达式是指用运算符连接各个运算对象,合乎表达式是指用运算符连接各个运算对象,合乎语法规则的式子。在语法规则的式子。在C#程序中,几乎所有的操程序中,几乎所有的操作运算都通过表达式来实现,而表达式语句也作运算都通过表达式来实现,而表达式语句也就成了就成了C# 程序中最简

2、单也是最基本的一类语程序中最简单也是最基本的一类语句。句。 n(1)空语句。)空语句。 n(2)赋值语句。)赋值语句。int i=0;n(3)函数调用语句)函数调用语句 (对象对象.方法方法) p.Open();返回本节5.1.2 块块(复合复合)语句语句C# 语言允许把一组语句用一对花括号括起来,语言允许把一组语句用一对花括号括起来,构成一个块块语句。例如:构成一个块块语句。例如:int a;a=1+2;块语句是若干条语句的一个集合,它在语法上是块语句是若干条语句的一个集合,它在语法上是一个整体,相当于一个语句。复合语句与简单一个整体,相当于一个语句。复合语句与简单语句一样地使用。语句一样地

3、使用。 返回本节5.2 选择结构选择结构n1ifelse语句语句 (1) if,ifelse语句语句 (2) if 与三目运算符与三目运算符 (3) 嵌套嵌套 (4) 注意事项注意事项n2switch语句语句 switch语句是多分支的选择语句。语句是多分支的选择语句。 返回首页5.2.1.1 ifelse语句语句例:例:判断用户的输入,如果输入的数值大于判断用户的输入,如果输入的数值大于0,则在屏幕,则在屏幕上显示上显示“正数正数”;否则在屏幕上显示;否则在屏幕上显示“不是正数不是正数”。public static void main() int a =(int)Console.ReadLi

4、ne(); if(a0) Console.WriteLine(“0:是正数是正数”,a); else Console.WriteLine(“0:不是正数不是正数”,a);返回本节5.2.1.2 if 与三目运算符与三目运算符通常通常,如果一条如果一条if.else语句比较简单的话语句比较简单的话,我我们也可以用们也可以用 ?: 来替代来替代 例例: if(ab) s=a*a; else s=b*b; 等价为等价为 s=ab?a*a:b*b;返回本节5.2.1.3 嵌套嵌套if,if.else 允许嵌套允许嵌套 例例: if(布尔表达式布尔表达式) if,if.else 语句语句 else if

5、,if.else 语句语句返回本节5.2.1.4 注意注意 1.条件的运算结果一定要是布尔类型条件的运算结果一定要是布尔类型 turu/false if(布尔表达式布尔表达式) 例: /以前C,C+中喜欢的方式 计算:s=a/b int s,a,b; if(b) Console.WriteLine(“除数不能为除数不能为0”); else s=a/b; .例: /C#中 int s,a,b; if(b=0) Console.WriteLine(“除数不能为除数不能为0”); else s=a/b; . 2.嵌套只能一环扣一环嵌套只能一环扣一环,不能形成交叉不能形成交叉返回本节5.2.2 swi

6、tch 语句语句 5.2.2.1 基本形式基本形式 5.2.2.2 替代替代if语句形成多分支语句形成多分支 5.2.2.3 贯穿与标号组合区分贯穿与标号组合区分 5.2.2.4 break goto retune 退出分退出分支支 5.2.2.5 注意事项注意事项返回本节5.2.2.1 基本形式基本形式switch语句的语法格式为:语句的语法格式为:switch (表达式)表达式)case 常量表达式常量表达式1:语句:语句1;跳转语句;跳转语句;case 常量表达式常量表达式2:语句:语句2;跳转语句;跳转语句;case 常量表达式常量表达式n:语句语句n;跳转语句跳转语句;default

7、:语句语句n+1;跳转语句跳转语句;返回本节例如,根据考试成绩的等级输出百分制分数段:例如,根据考试成绩的等级输出百分制分数段: char grade;switch (grade) caseA: Console.WriteLine(85100“);break; caseB: Console.WriteLine(7084“);break; caseC: Console.WriteLine(6069“);break; caseD: Console.WriteLine(60“);break; default: Console.WriteLine(error“);break;返回本节n有几点说明:有几

8、点说明:n(1)default语句是可缺省的。语句是可缺省的。 n(2)switch后面括号中的表达式只能是整型、字符型后面括号中的表达式只能是整型、字符型,字符字符串或枚举型表达式。串或枚举型表达式。 n(3)在各个分支中的)在各个分支中的break语句起着退出语句起着退出switch语句的作语句的作用。用。 n(4)case语句起标号的作用。标号不能重名,所以每一个语句起标号的作用。标号不能重名,所以每一个case常量表达式的值必须互不相同,否则就会出现编译错常量表达式的值必须互不相同,否则就会出现编译错误。误。 n(5)当多个分支需要执行同一操作时,可以使多个)当多个分支需要执行同一操作

9、时,可以使多个case语语句共用一组语句。句共用一组语句。 n(6)各个)各个case(包括包括default)语句的出现次序可以任意。语句的出现次序可以任意。 n(7)每个)每个case语句中可以有多条语句组成相应的语句,但语句中可以有多条语句组成相应的语句,但不必用不必用 。 返回本节5.2.2.2 替代替代if语句形成多分支语句形成多分支 switch 与与 if嵌套语句在作用上可以互换嵌套语句在作用上可以互换 switch 的好处是多分支条理清晰的好处是多分支条理清晰,程序可读性强程序可读性强 例例:用用if嵌套改写嵌套改写 if (grade=A) ConSole.WriteLine

10、(85100“); else if (grade=B) ConSole.WriteLine(7084“); else if (grade=C) ConSole.WriteLine(6069“); else if (grade=D) ConSole.WriteLine(60“); else ConSole.WriteLine(error“);返回本节5.2.2.3贯穿贯穿(遍历遍历)与标号组合区分与标号组合区分例例 C,C+中中 计算一年中天数计算一年中天数 (利用了贯穿的技巧利用了贯穿的技巧)switch (month) case 12: day+=31; /贯穿下面所有的贯穿下面所有的 ca

11、se case 11: day+=30; /贯穿下面所有的贯穿下面所有的 case case 1: day+=31; /贯穿下面所有的贯穿下面所有的 case Console.WriteLine(“天数为天数为:0”,day);例例2 C# 计算一年中天数计算一年中天数switch (month) case 12: day+=31;goto case 11; /跳转跳转 case 11: day+=30;goto case 10; case 1: day+=31;break; Console.WriteLine(“天数为天数为:0”,day);返回本节5.2.2.3贯穿贯穿(遍历遍历)与标号组

12、合区分与标号组合区分例例2 C# 计算一年中天数计算一年中天数switch (month) case “12月月”:case “12”: Console.WriterLine(“标号组合标号组合”); case 11: day+=30;goto case 10; case 1: day+=31;break; Console.WriteLine(“天数为天数为:0”,day);返回本节5.2.2.4 break goto return 例例2 计算一年中天数计算一年中天数int CountDayByMonth(int year ,int month) switch (month) case 12

13、: day+=31;goto case 11; case 11: day+=30;goto case 10; 跳转跳转 case 1: day+=31;break; 退出该条退出该条switch语句语句 default: return -1; /退出该函数退出该函数 /修正闰年和闰月修正闰年和闰月 day +=闰年和闰月处理函数闰年和闰月处理函数; return day;返回本节5.2.2.5 注意注意 与与C,C+不同不同1.switch后面括号中的表达式还可以是字符串表达式后面括号中的表达式还可以是字符串表达式2.case语句不能贯穿语句不能贯穿,如果一定要达到如果一定要达到C,C+的效果

14、请用的效果请用 goto 标标号号 语句跳转实现语句跳转实现3. Case 语句的位置无关性语句的位置无关性(因为没有贯穿的原因因为没有贯穿的原因)4.其它其它: 1.跳转语句跳转语句:break 和和goto的用法的用法 2.return 的用法的用法 返回本节5.3 循环结构循环结构C# 提供了三种循环控制语句:提供了三种循环控制语句:n 1.while语句语句n 2.dowhile语句语句n3.for语句语句n4.foreach 语句语句(C,C+中没有中没有)前三种语句都由相似的三部分组成:前三种语句都由相似的三部分组成:n 1.进入循环的条件进入循环的条件;n 2.循环体循环体;n

15、3.退出循环的条件;退出循环的条件;完成的功能也类似。所不同的只是三者进入与退出循环的方式不同。完成的功能也类似。所不同的只是三者进入与退出循环的方式不同。(注意注意: 除布尔表达外其它要求与除布尔表达外其它要求与C,C+语句类似语句类似)(记忆记忆: 当当循环条件循环条件为为真真时时,进入进入循环循环)返回首页5.3.1 while语句语句 1while语句语句while语句的语法格式为:语句的语法格式为:while (布尔表达式布尔表达式)循环体;循环体;它的含义为:首先对它的含义为:首先对布尔表达式布尔表达式进行判断,若判断结果为进行判断,若判断结果为假(假(false),),则跳过循环

16、体,执行则跳过循环体,执行while结构后面的语句。结构后面的语句。若判断结果为真(若判断结果为真(true),则进入循环体,执行其中的语),则进入循环体,执行其中的语句序列。句序列。 while循环由循环由4个部分组成:循环变量初始化,判断条件,个部分组成:循环变量初始化,判断条件,循环体,改变循环变量的值。循环体,改变循环变量的值。返回本节5.3.1 while语句语句n例例1 计算计算sum=1+2+3+10的的while循环结构如下:循环结构如下:int sum=0;int i=1; /循环变量初始化循环变量初始化while (ilimit程序如下:程序如下:void Main() i

17、nt i=0,sum=0; float limit; Console.WriteLine(Please input limit:“); limit =(float)Console.ReadLine(); do i+; sum+=(float)1/i; while (sum=limit); Console.WriteLine(i);返回本节5.3.3 for语句语句 for语句的语法格式为:语句的语法格式为: for(初始化;布尔表达式;步长)初始化;布尔表达式;步长) 循环体循环体(1)初始化;)初始化;(2)测试布尔表达式,若为)测试布尔表达式,若为false,则结束循环,转到(,则结束循环

18、,转到(5););(3)若布尔表达式,若为)若布尔表达式,若为ture ,则执行循环体,然后计算步长;,则执行循环体,然后计算步长;(4)转回()转回(2););(5)执行)执行for语句下面的一个语句。语句下面的一个语句。返回本节例如,例如,计算计算sum=1+2+3+10 : for (int i=1;i=10;i+) /注意注意:不能漏掉分号不能漏掉分号sum+=i;回忆回忆: 上小节上小节 while 的方式的方式记忆记忆: 其实其实 while dowhile for 大多数情况下都可以实现大多数情况下都可以实现相同功能相同功能返回本节5.3.4 foreach 语句语句 语法格式:

19、语法格式:foreach(类型类型 变量名变量名 in 表达式)表达式) 循环体循环体 返回本节5.3.4 foreach 语句语句 例例: 显示数组的数值显示数组的数值 int arr1=new int1,2,3,4,5; foreach(int x in arr1) Console.WriteLine(“值为值为:0”,x); /显示显示 值为值为:1 /x0=1 值为值为: 2 /x1=2 值为值为:5 /x4=5 返回本节5.3.4 foreach 语句语句 3.注意注意 foreach(类型类型 循环变量循环变量 in 表达式)表达式) 循环体循环体 (1) 表达式必须是集合类型表达

20、式必须是集合类型 (一种数组对象一种数组对象,只不过此数组实现了只不过此数组实现了IEnumerable接口接口,foreach 正是利用了它来完成正是利用了它来完成索引工作索引工作) (2) 集合类型中元素集合类型中元素 类型类型 都为都为循环变量的类型循环变量的类型 (3) 循环变量为只读循环变量为只读,即不能改变该变量的任何内容即不能改变该变量的任何内容 (4)循环自动进行循环自动进行,循环次数为集合的元素数循环次数为集合的元素数 (5) break continue return 可以改变或跳出循环可以改变或跳出循环返回本节5.4 转移语句转移语句n1break语句语句break语句的

21、作用是:结束当前正在执行的循环(语句的作用是:结束当前正在执行的循环(for、while和和dowhile)或多路分或多路分支支(switch)程序结构,转而执行这些结构后面的语句。程序结构,转而执行这些结构后面的语句。n2continue语句语句continue语句的作用是:结束当前正在执行的这一次循环(语句的作用是:结束当前正在执行的这一次循环(for、while和和dowhile),),接着执行下一次循环。即跳过循环体中尚未执行的语句,接着进行接着执行下一次循环。即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。下一次是否执行循环的判定。n3goto语句语句goto语句的语

22、法格式为:语句的语法格式为:goto 标号标号;n4. return 语句语句 退出函数体退出函数体注意注意: 1.转移只能是转出转移只能是转出,而不能是转入而不能是转入 2.goto 语句可以用在任何语句间语句可以用在任何语句间,但绝对不能乱用但绝对不能乱用,否则会让程序变得复杂否则会让程序变得复杂!返回首页5.5 异常处理语句异常处理语句n5.5.1 引发异常的条件引发异常的条件 n5.5.2 自定义抛出异常自定义抛出异常 thrown5.5.3异常处理语句异常处理语句 try catch(Exception e) 可以有多个可以有多个catch块块 finallyn5.5.4 异常处理的

23、过程异常处理的过程n5.5.5 异常类异常类返回首页5.5.1 引发异常的条件引发异常的条件1.系统抛出系统抛出 算术溢出算术溢出,除除0错误错误 访问资源失败访问资源失败(数据库操作失败数据库操作失败)2.自定义抛出自定义抛出 程序用程序用 throw 语句抛出语句抛出返回本节5.5.2 自定义抛出异常自定义抛出异常 throw 语句语句: 1.throw 表达式表达式 表达式返回值为异常类型表达式返回值为异常类型(Exception)或其派生的类型或其派生的类型 2.throw ; 再次抛出再次抛出(继续传播继续传播)返回本节5.5.3 异常处理语句异常处理语句n 常见形式常见形式: 1.

24、try catch(s) 2. try catch(s) finallyn 异常传播异常传播 当出现一个异常以后当出现一个异常以后,程序将控制权转移给程序将控制权转移给第一个能够第一个能够处理该异常处理该异常的子句的子句,这整个处理的过程就叫做这整个处理的过程就叫做异常传播异常传播 (记忆记忆:是不是有点象是不是有点象C,C+中的中的switch的匹配过程的匹配过程?)返回本节5.5.3 异常处理语句异常处理语句n各语句块的介绍各语句块的介绍 try 监视异常监视异常 catch() 捕捉并处理异常捕捉并处理异常(可以多条可以多条) finally 必须执行的语句块必须执行的语句块 注意注意1

25、: 不能理解为没有不能理解为没有 try就不会产生异常就不会产生异常,异常的产生与有没有异常的产生与有没有try无关无关 注意注意2 : finally块一定会执行到块一定会执行到,不论是否会发生由以下原因导致的程序控制转移不论是否会发生由以下原因导致的程序控制转移: 1.普通语句普通语句 2. break; continue ;goto; return;的结果的结果 3.将异常传播到语句之外的结果将异常传播到语句之外的结果返回本节5.5.4 异常处理过程异常处理过程n对待异常的态度对待异常的态度: 1.捕捉捕捉清除清除继续程序继续程序 2.捕捉捕捉处理处理继续抛出继续抛出(传播传播)继续程序

26、继续程序例例1: using Sytem; class Test static void F() try G(); catch(Exception e) Console.WriteLine(“Exception in F:0”,e.Message); e=new Exception(“F”); throw; static void G() throw new Exception(“G”); static void Main() try F(); catch(Exception e) Console.WriteLine(“Exception in Main:0”,e.Message); 返回本节

27、5.5.4 异常处理过程异常处理过程例例2: 计算计算 Z=sqr(|x2-y2|)+x (c#2.0 中中sqrt不再弹出异常不再弹出异常,所以此例作废所以此例作废) double x,y,z; try z=Math.Sqrt(x*x-y*y); catch z=Math.Sqrt(y*y-x*x); finally z+=x; 返回本节5.5.5 异常类异常类5.5.5.1 常用的异常类常用的异常类5.5.5.2 Exception 类的属性类的属性5.5.5.3 Exception对象的构造对象的构造(实例化实例化)返回本节5.5.5.1 常用的异常类常用的异常类表表11-1(P290)

28、返回本节异常类异常类导致异常出现的原因导致异常出现的原因Exception基类基类AccessException访问一个类型成员如一个方法或字段时失败访问一个类型成员如一个方法或字段时失败 ArgumentException方法的参数非法方法的参数非法IndexOutOfRangeException数组下标出界数组下标出界OutOfMemoryException 无足够的内存无足够的内存OverFlowException数据溢出数据溢出.5.5.5.2 Exception 类的属性类的属性属性属性返回类型返回类型作用作用Messagestring 存放异常的信息存放异常的信息 (读读)Sour

29、cestring 出现异常时的程序名称出现异常时的程序名称 (读读,写写)TargeSiteSystem.Reflection.MethodBase 方法的参数非法方法的参数非法 (读读)StackTracestring 出现异常的位置出现异常的位置 (读读)HelpLinkstring 异常的帮助文件异常的帮助文件URL字符串字符串(读读,写写)InnerExceptionException导致出现异常的实例导致出现异常的实例(读读).例:11-8 (p294) 返回本节5.5.5.3 Exception对象的构造对象的构造(实例化实例化) 构造方法构造方法 1. public Except

30、ion(); 2. public Exception(string 错误消息错误消息); 3. public Exception(string,Exception); 3. protected Exception(SerializationInfo,StreamongConteat)例例: throw new Exception(); throw new Exception(“XX错误错误”); throw new Exception(“xx 参数格式出错参数格式出错”,new FormatException);返回本节5.6 条件编译条件编译与以上介绍的本质不同处与以上介绍的本质不同处: 条

31、件编译属于编译器编译前的预处理过程条件编译属于编译器编译前的预处理过程 预处理预处理 条件编译指令条件编译指令: #define COUNT 定义符号定义符号 #undef COUNT 取消符号取消符号 必须放在所有必须放在所有”实语句实语句”之前之前 # if . #endif 单支单支, if 符号表达式符号表达式 #if #else #endif 双支双支 #if #elif#else.#endif 多支多支(嵌套嵌套) #elif =#else if 注意注意: 条件编译语句条件编译语句 不用分号结束不用分号结束条件编译语句的作用条件编译语句的作用: 根据符号选择要编译的语句根据符号选

32、择要编译的语句 (如分别定义测试版和正式发行版如分别定义测试版和正式发行版,然后编译然后编译成不同版本的程序成不同版本的程序) 返回首页5.6 条件编译条件编译注意注意: #define COUNT 必须放在所有实代码之前必须放在所有实代码之前 例例1: namespace N #define B /错误错误 ,位于位于namespace N语句之后语句之后 #if B class CClass1 #endif 例例2: #define Debug class Class1 #if Debug void Trace(string s) #endif 例例3: #define A #define B #undef C class D #if C void F() #elif A&B void I() #else voidG() #endif 注意注意: #elif 与与 #else 是一组是一组if 语句语句返回本节5.6 条件编译条件编译在编译时发出错误或警告信息在编译时发出错误或警告信息 #warning 警告信息警告信息 #error 错误信息错误信息 注意注意: 1. 不用分号结束不用分号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论