流程控制语句与函数.ppt_第1页
流程控制语句与函数.ppt_第2页
流程控制语句与函数.ppt_第3页
流程控制语句与函数.ppt_第4页
流程控制语句与函数.ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1 第5章流程控制语句与函数 5 1控制程序流程5 2使用选择语句5 3使用循环语句5 4使用goto语句5 5嵌套使用流程控制语句5 6函数5 7常用内部函数5 8小结 2 5 1控制程序流程 控制程序流程的方法很多 主要有如下3种 选择语句 如同考试中的单选题目 选择执行了某条语句 另一条就不会再执行 循环语句 在需要将一个表达式进行多次重复运算时 可以使用循环语句 指定其循环次数或者界定其退出循环的条件 goto语句 即标记语句 使程序自动跳到标记语句处执行 标记语句执行完毕又直接回到调用标记语句处 需要注意的是 在程序中最好不使用goto语句 因为该语句会使得程序代码可读性很差 3 5 2使用选择语句 5 2 1if语句用if语句实现单分支选择结构 if 表达式 语句 语句中的表达式通常用于表示条件 应为关系表达式或逻辑表达式 语句只是一条语句 如果在条件满足时需要执行多条语句 应使用花括号 括起来 使之成为语句块 表达式 中的括号不能省略 4 5 2 1if语句 示例 staticvoidMain string args doublescore score Convert ToDouble Console ReadLine if score 60 Console WriteLine 恭喜你 通过了这次考试 Console Read 5 5 2 1if语句 用if语句实现双分支选择结构 if 表达式 语句1 else语句2 6 5 2 1if语句 用if语句实现多分支选择结构If 表达式1 语句1 elseif 表达式2 语句2 elseif 表达式3 语句3 else语句n 7 5 2 2switch语句 在C 语言中 除使用if语句实现多分支外 也可以使用switch语句 switch 表达式 case常量表达式1 语句1 break case常量表达式2 语句2 break case常量表达式n 语句n break default 语句n 1 break 8 5 2 2switch语句 switch表达式的类型为sbyte byte short ushort int uint long ulong char string 枚举或用户自定义类型 每个case分支中的常量表达式必须能隐式转换为switch表达式的类型 且常量表达式的值不能相同 从而保证分支选择的唯一性 如果某个分支有多条语句 可以用花括号括起来 也可以不加花括号 default分支可有可无 但是每个switch语句最多只能有一个default分支 当default语句缺省时 如果switch后面的表达式值与任意常量表达式值不相等 将不执行任何语句 直接退出switch语句 各分支语句中的break不可省略 否则将会出现错误 这一点跟Java和C 不同 使用switch语句时一定要注意 case后面必须是常量表达式 以冒号结束而不是分号 9 5 2 2switch语句 示例 staticvoidMain string args doublescore charclass1 inti Console WriteLine 请输入你的成绩 score Convert ToDouble Console ReadLine i int score 10 switch i case10 case9 class1 A break case8 class1 B break case7 class1 C break case6 class1 D break default class1 E break Console WriteLine 你的成绩等级为 0 class1 10 5 2 3switch语句的控制类型 switch语句的控制可以按case语句的排列先后顺序进行 也可以通过跳转语句来实现 示例 实现switch语句的跳转语句 staticvoidMain string args intdays 0 intmonth 3 switch month case1 case3 case5 case7 case8 case10 case12 days 31 break case2 days 28 break case4 case6 case9 case11 days 30 break default days 0 break Console WriteLine thismonthhas 0 days days 11 5 3使用循环语句 5 3 1while语句while语句是用来实现循环的语句 该类循环先测试循环条件再执行循环体 按照不同条件执行循环体部分零次或多次 它的语法形式如下 while 表达式 循环体部分 12 5 3 1while语句 注意 循环体如果包含一条以上的语句 应以花括号括起来作为复合语句 在循环体中 通常应包含改变循环条件表达式值的语句 否则便会造成无限循环 由于先判断条件 可能出现第一次测试条件时 表达式的值就为false 此种情况下循环体将一次也不执行 又称 允许0次循环 13 5 3 1while语句 示例 classTestWhile staticvoidMain string args intnumber 1 sum 0 while number 10 sum number number Console WriteLine thesumis 0 sum Console Read 执行上述代码 运行结果为 thesumis55 14 5 3 2do语句 do循环语句实现的是直到型循环 该类循环先执行循环体再测试循环条件 do循环体语句while 表达式 15 5 3 2do语句 示例 classTestWhile staticvoidMain string args intnumber 1 sum 0 do sum number number while number 10 Console WriteLine thesumis 0 sum Console Read 执行上述代码 运行结果为 thesumis55 16 5 3 3for语句 for 表达式1 表达式2 表达式3 语句 17 5 3 3for语句 表达式1 2 3都可以省略 分号不能省略 如果表达式1 2 3都省略 则将无终止地执行循环体 表达式2是循环控制条件 如果省略 循环将无终止地进行下去 表达式1一般用于为循环控制条件赋初值 也可以是与循环变量无关的其他表达式 如果表达式1省略或者是与循环条件无关的其他表达式 则应该在for语句之前给循环控制条件赋初值 表达式3一般用于改变循环控制条件的值 如果表达式3省略或者是其他与循环条件无关的表达式 则应该在循环体中另有语句改变循环条件 以保证循环能正常结束 18 5 3 4foreach语句 foreach 类型标识符in表达式 嵌入语句 示例 staticvoidMain string args int list 10 20 30 40 50 60 foreach intiinlist Console Write 0 5 i Console Read 19 5 3 5break语句和continue语句 break语句用于跳出包含它的switch while do for foreach语句 如果break不是在switch while do for foreach语句块中 将发生编译错误 当switch while do for foreach语句相互嵌套时 break语句只是跳出直接包含它的语句块 20 5 3 5break语句和continue语句 classTestBreak staticvoidMain string args for inti 0 i 10 i Console Write enteraword strings Console ReadLine if s end break Console WriteLine youentered 0 s Console Read 21 5 3 5break语句和continue语句 continue语句类似于break语句 也必须用于while dowhile for foreach语句 它只从循环的当前迭代中退出 然后在循环的下一次迭代开始重新执行 而不是退出循环 需要注意如下事项 continue语句的目标地址为直接包含它的while dowhile for或者foreach语句的嵌套语句结尾 假如continue语句不能被while dowhile for或者foreach语句包含 将发生编译错误 当有while dowhile for或者foreach语句相互嵌套时 continue语句只适用于直接包含它的语句块 22 5 3 5break语句和continue语句 示例staticvoidMain string args for inti 0 i 10 i Console Write enteraword strings Console ReadLine if s end continue Console WriteLine youentered 0 s Console Read 23 5 4使用goto语句 goto语句是除选择语句 循环语句之外的控制程序流程的语句 常用于将程序流程转移出嵌套范围 goto语句的常见用法为gotolable语句 其中 lable为一个标签 其语法形式为 标签1 24 5 4使用goto语句 示例 staticvoidMain string args intn 1 sum 0 lable if n 5 sum sum n n gotolable Console WriteLine sum 0 sum Console Read 25 5 5嵌套使用流程控制语句 选择结构的嵌套 if 表达式1 if 表达式2 语句1else语句2elseif 表达式3 语句3else语句4 26 5 5嵌套使用流程控制语句 循环结构的嵌套示例 staticvoidMain string args inti 1 a 0 for i 5 i do i a while i 3 i Console WriteLine a的值为 0 i的值为 1 a i Console ReadLine 27 5 6函数 5 6 1函数的定义与使用函数在使用之前必须先定义 函数定义的形式如下 函数修饰符数据类型标识符函数名 形式参数说明列表 变量 数组的定义语句 其他可执行部分 函数的返回值是需要返回给主调函数的处理结果 由return语句给出 对于无返回值的函数 其类型标识符为void 不需要return语句 28 5 6 1函数的定义与使用 示例 编写一个函数 用于求任意两个整数之间所有数的平方和 classProgram privatestaticintpfh intx inty inti sum 0 for i x i y i sum sum i i return sum 29 5 6 1函数的定义与使用 函数的使用 在类中的某个函数中 调用本类中由 函数名 指定的函数 其语法形式如下 函数名 实际参数列表 调用另一个类的非静态函数 其语法形式如下 对象名 方法名 实际参数列表 调用另一个类的静态函数 其语法形式如下 类名 方法名 实际参数列表 30 5 6 2函数的参数传递 参数传递中的类型转化示例 classProgram staticfloatSqr floatk return k k staticvoidMain string args inty floatyy y 6 yy Sqr y Console WriteLine 0 的平方是 1 y yy Console ReadLine 31 5 6 2函数的参数传递 参数传递的类型 值传递时参数的语法形式如下 参数类型参数名引用传递时参数的语法形式如下 ref参数类型参数名输出传递时参数的语法形式如下 out参数类型参数名参数数组 使用params关键字声明参数 参数个数为不确定 32 5 6 2函数的参数传递 值传递参数示例 classProgram staticvoidswap inta intb inti i a a b b i staticvoidMain string args intx y Console WriteLine 请输入x和y的值 x Convert ToInt32 Console ReadLine y Convert ToInt32 Console ReadLine swap x y Console WriteLine 转换后x和y的值为 0 1 x y Console ReadLine 33 5 6 2函数的参数传递 引用传递参数示例 classProgram staticvoidswap refinta refintb inti i a a b b i staticvoidMain string args intx y Console WriteLine 请输入x和y的值 x Convert ToInt32 Console ReadLine y Convert ToInt32 Console ReadLine swap refx refy Console WriteLine 转换后x和y的值为 0 1 x y Console ReadLine 34 5 6 2函数的参数传递 输出传递参数示例 classProgram staticvoidswap outinta outintb inti a Convert ToInt32 Console ReadLine b Convert ToInt32 Console ReadLine i a a b b i staticvoidMain string args intx y swap outx outy Console WriteLine 转换后x和y的值为 0 1 x y Console ReadLine 35 Ref与out的区别 out关键字会导致参数通过引用来传递 这与ref关键字类似 不同之处在于 1 ref传进去的参数必须在调用前初始化 而out不必 因为out的函数会先清空变量 即使变量已经赋值 inti SomeMethod refi 语法错误SomeMethod outi 通过 36 Ref与out的区别 2 ref传进去的参数在函数内部可以直接使用 而out不可 publicvoidSomeMethod refinti intj i 通过 publicvoidSomeMethod outinti intj i 语法错误 3 ref传进去的参数在函数内部可以不被修改 但out必须在离开函数体前进行赋值 37 usingsystem classtestapp staticvoidouttest outintx outinty 离开这个函数前 必须对x和y赋值 否则会报错 y x 上面这行会报错 因为使用了out后 x和y都清空了 需要重新赋值 即使调用函数前赋过值也不行x 1 y 2 staticvoidreftest refintx refinty y x 38 publicstaticvoidmain inta b out使用前 变量可以不赋值outtest outa outb console writeline a 0 b 1 a b intc 11 d 22 outtest outc outd console writeline c 0 d 1 c d intm n reftest refm refn 上面这行会出错 ref使用前 变量必须赋值into 11 p 22 reftest refo refp console writeline o 0 p 1 o p 39 4 ref 当需要通过调用某函数来改变实参变量的值时 使用ref out 主要是为了一个方法能返回两个以上的结果 Ref与out的区别 当一个方法需要多个返回值时 靠方法返回值 return 就不能胜任 幸好 Net有out和ref关键字 比如 登录方法 登录结果有成功和失败 但是如果失败还要知道原因 仅靠返回值就不行了 这个就可以用out boolLogin stringname stringpassword outstringerrMsg out方法参数传递前可以不赋值 但是方法中必须先赋值后使用 ref方法参数传递前必须赋值 方法中可以直接使用 out侧重输出 方法传递前 不知道值 调用方法后获得值 ref侧重更改 调用方法前就有明确的值 方法中发生更改 那么刚才登陆的例子到底用ref还是out呢 这样分析 如果成功是不需要errMsg的 如果失败调用前errMsg的实参是不需要赋值的 所以应该侧重于输出 使用out比较合适 40 注 对于值型变量作为方法参数时 可以有如上所述三种情况 1 没有ref和out修饰 直接传值 不能改变实参 2 使用ref修饰 引用传递 输入 可以改变实参 3 使用out修饰 引用传递 输出 可以改变实参 对于引用类型的变量的三种情况 1 没有ref和out修饰 引用传递 可以改变实参 2 使用ref修饰 与1类似 但如果在被调用函数里面把传过来的类 null 我们就可以看出区别了 3 使用out修饰 引用传递 可以改变实参 Ref与out的区别 41 5 6 2函数的参数传递 参数数组有时需要传递的参数个数不确定 例如求几个数的平均值 可以使用params关键字声明参数的个数为不确定 42 5 6 2函数的参数传递 参数数组示例 classProgram publicstaticfloatAverage paramslong array longtotal 0 i for i 0 i array Length i total total array i return float total array Length staticvoidMain string args floatx Average 1 2 3 5 Console WriteLine 1 2 3 5的平均值为 0 x x Average 10 20 35 52 Console WriteLine 10 20 35 52的平均值为 0 x Console ReadLine 43 5 6 3内联函数 对于一些功能简单 规模较小又使用频繁的函数 CLR会做出是否使用内联函数的判断 内联函数不在调用时发生控制转移 而是在编译时将函数体嵌入在每一个调用处 这样就节省了参数传递 控制转移等消耗 注意 在何处内联代码完全由CLR判断得出 无法使用诸如C 中inline的关键字来控制哪些方法是内联的 44 5 6 4函数重载 函数重载允许一个类中有同名的函数存在 即一个类中可以存在两个以上的函数名称相同 重载函数的形参必须不同 可以个数不同或者类型不同 示例 intadd intx inty intadd inta intb 错误 编译器不以形参名来区分函数intadd intx inty voidadd intx inty 错误 编译器不以返回值来区分函数 45 5 6 4函数重载 示例 classProgram publicstaticintAdd inti intj returni j publicstaticstringAdd strings1 strings2 returns1 s2 publicstaticlongAdd longx returnx 5 staticvoidMain string args Console WriteLine Add 1 2 Console WriteLine Add 1 2 Console WriteLine Add 10 Console ReadLine 46 5 7常用内部函数 5 7 1随机函数介绍在C 中要生成随机数需要使用Random类 该类的主要方法是Next方法 它生成一个介于两个整数之间的随机数 其语法形式如下 publicvirtualintNext intminValue intmaxValue 47 5 7 1随机函数介绍 示例 classProgram staticvoidMain string args Randomop1 newRandom 10 Randomop2 newRandom intresult result op1 Next 10 99 op2 Next 0 9 Console WriteLine result Console Read 由于结果是随机值 所以这里不再描述运行结果 48 5 7 2格式化函数介绍 NET为处理数字 日期以及字符串的格式化提供了WriteLine方法 Format方法和ToString方法 通过WriteLine方法和Format方法可对多个变量进行格式化 ToString方法只能对一个变量进行格式化 对于使用WriteLine方法和Format方法格式化字符串 规定格式的一般语法形式如下 N M 格式码精度 49 5 7 2格式化函数介绍 N M 格式码精度 表示其中的内容为可选项 N 表示要格式化的参数的索引 M 可选参数 表示格式化后的参数所占的宽度 如果M是负数 那么格式化后的值就是左对齐的 如果M是正数 那么格式化后的值是右对齐的 如果未指定M 则默认为零 格式码 可选的格式化代码字符串 精度 格式化输出的有效位数或小数位数 50 部分数值格式输出方式的例子usingSystem classFormating publicstaticvoidMain Console WriteLine 在宽度为的空间里靠左对齐 0 10 99 Console WriteLine 在宽度为的空间里靠右对齐 0 10 99 Console WriteLine 在宽度为的空间里靠左对齐 0 10 LLL Console WriteLine 在宽度为的空间里靠右对齐 0 10 RRR Console WriteLine 货币 0 C 1 C4 88 8 888 8 Console WriteLine 10进制整数 0 D5 88 Console WriteLine 科学计数 0 E 888 8 Console WriteLine 固定小数点 0 F3 888 8888 Console WriteLine 浮点数 0 G 888 8888 Console WriteLine 数字格式 0 N 8888888 8 Console WriteLine 16进制格式 0 X4 88 Console ReadLine intval1 0 Intval2 123 stringval3 一个占位符例子 Console WriteLine Values 0 1 这是 2 val1 val2 val3 N M 格式码精度 51 5 7 3日期函数介绍 用于处理时间和日期的对象为DateTime结构和TimeSpan类 DateTime结构用于表示日期和时间 表示范围在0001年1月1日午夜00 00 00到9999年12月31日晚上11 59 59之间的日期和时间 最小时间单位等于100纳秒 TimeSpan类可以表示一个时间间隔 表示范围可以在Int64 MinValue到Int64 MaxValue之间 52 5 7 3日期函数介绍 DateTime结构的常用方法如下 AddYears AddMonths AddDays AddHours AddMinutes AddSeconds方法 用于将指定的年 月 日 时 分 秒加到DateTime上 Substract方法 日期相减 IsLeapYear方法 判断是否为闰年 true为闰年 false为非闰年 ToLongDateString和

温馨提示

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

最新文档

评论

0/150

提交评论