流程控制语句与函数讲义_第1页
流程控制语句与函数讲义_第2页
流程控制语句与函数讲义_第3页
流程控制语句与函数讲义_第4页
流程控制语句与函数讲义_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1第5章流程控制语句与函数5.1控制程序流程5.2使用选择语句5.3使用循环语句5.4使用goto语句5.5嵌套使用流程控制语句5.6函数5.7常用内部函数5.8小结25.1控制程序流程控制程序流程的方法很多,主要有如下3种:选择语句:如同考试中的单选题目,选择执行了某条语句,另一条就不会再执行。循环语句:在需要将一个表达式进行多次重复运算时,可以使用循环语句,指定其循环次数或者界定其退出循环的条件。goto语句:即标记语句,使程序自动跳到标记语句处执行,标记语句执行完毕又直接回到调用标记语句处。需要注意的是,在程序中最好不使用goto语句,因为该语句会使得程序代码可读性很差。35.2使用选择语句5.2.1if语句用if语句实现单分支选择结构:if(表达式)语句;语句中的表达式通常用于表示条件,应为关系表达式或逻辑表达式。语句只是一条语句,如果在条件满足时需要执行多条语句,应使用花括号({})括起来,使之成为语句块。“(表达式)”中的括号不能省略。45.2.1if语句示例:staticvoidMain(string[]args){doublescore;score=Convert.ToDouble(Console.ReadLine());if(score>=60)Console.WriteLine("恭喜你,通过了这次考试!");Console.Read();}55.2.1if语句用if语句实现双分支选择结构:

if(表达式)

语句1;else

语句2;65.2.1if语句用if语句实现多分支选择结构If(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……else语句n;75.2.2switch语句在C#语言中,除使用if语句实现多分支外,也可以使用switch语句。switch(表达式){case常量表达式1:

语句1;

break;case常量表达式2:

语句2;

break;……case常量表达式n:

语句n;

break;default:

语句n+1;

break;}85.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后面必须是常量表达式,以冒号结束而不是分号。95.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);}105.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);}115.3使用循环语语句5.3.1while语句while语句是用来来实现循环环的语句,,该类循环环先测试循循环条件再再执行循环环体,按照照不同条件件执行循环环体部分零零次或多次次。它的语语法形式如如下。while(表达式)循环体部分分;125.3.1while语句注意:循环体如果果包含一条条以上的语语句,应以以花括号括括起来作为为复合语句句。在循环体中中,通常应应包含改变变循环条件件表达式值值的语句,,否则便会会造成无限限循环。由于先判断断条件,可可能出现第第一次测试试条件时,,表达式的的值就为false。此种情况况下循环体体将一次也也不执行,,又称“允允许0次循环”。。135.3.1while语句示例:classTestWhile{staticvoidMain(string[]args){intnumber=1,sum=0;while(number<=10){sum+=number;number++;}Console.WriteLine("thesumis{0}",sum);Console.Read();}}执行上述代代码,运行行结果为::thesumis55。145.3.2do语句do循环语句实实现的是直直到型循环环,该类循循环先执行行循环体再再测试循环环条件。do循环体语句句while(表达式);155.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。165.3.3for语句for(表达式1;表达式2;表达式3)语句;175.3.3for语句表达式1、2、3都可以省略略,分号不不能省略。。如果表达达式1、2、3都省略,则则将无终止止地执行循循环体。表达式2是循环控制制条件,如如果省略,,循环将无无终止地进进行下去。。表达式1一般用于为为循环控制制条件赋初初值,也可可以是与循循环变量无无关的其他他表达式。。如果表达达式1省略或者是是与循环条条件无关的的其他表达达式,则应应该在for语句之前给给循环控制制条件赋初初值。表达式3一般用于改改变循环控控制条件的的值。如果果表达式3省略或者是是其他与循循环条件无无关的表达达式,则应应该在循环环体中另有有语句改变变循环条件件,以保证证循环能正正常结束。。185.3.4foreach语句foreach(类型标标识符in表达式)嵌入语句;示例:staticvoidMain(string[]args){int[]list={10,20,30,40,50,60};foreach(intiinlist)Console.Write("{0,-5}",i);Console.Read();}195.3.5break语句和continue语句break语句用于跳跳出包含它它的switch、while、do、for、foreach语句。如果break不是在switch、while、do、for、foreach语句块中,,将发生编编译错误。。当switch、while、do、for、foreach语句相互嵌嵌套时,break语句只是跳跳出直接包包含它的语语句块。205.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();}}215.3.5break语句和continue语句continue语句类似于于break语句,也必必须用于while、dowhile、for、foreach语句,它只只从循环的的当前迭代代中退出,,然后在循循环的下一一次迭代开开始重新执执行,而不不是退出循循环。需要注意如如下事项:continue语句的目标标地址为直直接包含它它的while、dowhile、for或者foreach语句的嵌套套语句结尾尾。假如continue语句不能被被while、dowhile、for或者foreach语句包含,,将发生编编译错误。。当有while、dowhile、for或者foreach语句相互嵌嵌套时,continue语句只适用用于直接包包含它的语语句块。225.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();}235.4使用goto语句goto语句是除选选择语句、、循环语句句之外的控控制程序流流程的语句句,常用于于将程序流流程转移出出嵌套范围围。goto语句的常见见用法为gotolable语句。其中中,lable为一个标签签,其语语法形式为为:标签1:245.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();}255.5嵌套使用流流程控制语语句选择结构的的嵌套::if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4265.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();}275.6函数5.6.1函数的定义义与使用函数在使用用之前必须须先定义,,函数定义义的形式如如下。函数修饰符符数据类型标标识符函函数名名(形式参数说说明列表){变量、数组组的定义语语句;其他可执行行部分}函数的返回回值是需要要返回给主主调函数的的处理结果果,由return语句给出。。对于无返回回值的函数数,其类型型标识符为为void,不需要return语句285.6.1函数的定义义与使用示例:编写写一个函数数,用于求求任意两个个整数之间间所有数的的平方和。。classProgram{privatestaticintpfh(intx,inty){inti,sum=0;for(i=x;i<=y;i++)sum=sum+i*i;return(sum);}}295.6.1函数的定义义与使用函数的使用用:在类中的某某个函数中中,调用本本类中由“函数名”指定的函数数,其语法法形式如下下:函数名([实际参数列列表])调用另一个个类的非静静态函数,,其语法形形式如下::对象名.方法名([实际参数列列表])调用另一个个类的静态态函数,其其语法形式式如下:类名.方法名([实际参数列列表])305.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();}}315.6.2函数的参参数传递递参数传递递的类型型:值传递时参数的的语法形形式如下下:参数类型型参参数名引用传递递时参数的的语法形形式如下下:ref参数类型型参参数名名输出传递递时参数的的语法形形式如下下:out参数类型型参参数名名参数数组组:使用params关键字声声明参数数,参数数个数为为不确定定。325.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();}}335.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();}}345.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();}}35Ref与out的区别::out关键字会会导致参参数通过过引用来来传递,,这与ref关键字类类似。不同之处处在于::(1)ref传进去的的参数必必须在调调用前初初始化,,而out不必,因因为out的函数会会先清空空变量,,即使变变量已经经赋值。。inti;SomeMethod(refi);//语法错误误SomeMethod(outi);//通过36Ref与out的区别::(2)ref传进去的的参数在在函数内内部可以以直接使使用,而而out不可。publicvoidSomeMethod(refinti){intj=i;//通过//...}publicvoidSomeMethod(outinti){intj=i;//语法错误误}(3)ref传进去的的参数在在函数内内部可以以不被修修改,但但out必须在离离开函数数体前进进行赋值值。37usingsystem;

classtestapp{staticvoidouttest(outintx,outinty){//离开这个个函数前前,必须须对x和y赋值,否否则会报报错。//y=x;//上面这行行会报错错,因为为使用了了out后,x和y都清空了了,需要要重新赋赋值,即即使调用用函数前前赋过值值也不行行x=1;y=2;}staticvoidreftest(refintx,refinty){y=x;}38publicstaticvoidmain(){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的区别:415.6.2函数的参数传传递参数数组有时需要传递递的参数个数数不确定,例例如求几个数数的平均值。。可以使用params关键字声明参参数的个数为为不确定。425.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();}}435.6.3内联函数对于一些功能能简单、规模模较小又使用用频繁的函数数,CLR会做出是否使使用内联函数数的判断。内内联函数不在在调用时发生生控制转移,,而是在编译译时将函数体体嵌入在每一一个调用处,,这样就节省省了参数传递递、控制转移移等消耗。注意:在何处处内联代码完完全由CLR判断得出,无无法使用诸如如C++中inline的关键字来控控制哪些方法法是内联的。。445.6.4函数重载函数重载允许许一个类中有有同名的函数数存在,即一一个类中可以以存在两个以以上的函数名名称相同。重载函数的形形参必须不同同,可以个数数不同或者类类型不同。。示例:intadd(intx,inty);intadd(inta,intb);//错误!编译器器不以形参名名来区分函数数intadd(intx,inty);voidadd(intx,inty);//错误!编译器器不以返回值值来区分函数数455.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();}}465.7常用内部函数数5.7.1随机函数介绍绍在C#中要生成随机机数需要使用用Random类。该类的的主要方法是是Next方法,它生成成一个介于两两个整数之间的随机数数,其语法形形式如下:publicvirtualintNext([intminValue,intmaxValue]);475.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();}}由于结果是随随机值,所以以这里不再描描述运行结果果,485.7.2格式化函数介介绍.NET为处理数字、、日期以及字字符串的格式式化提供了WriteLine方法、Format方法和ToString方法。通过WriteLine方法和Format方法可对多个个变量进行格格式化,ToString方法只能对一一个变量进行行格式化。对于使用WriteLine方法和Format方法格式化字字符串,规定定格式的一般般语法形式如如下。{N,[M][:格式码精度度]}495.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][:格式码精度度]}515.7.3日期函数介绍绍用于处理时间间和日期的对对象为DateTime结构和TimeSpan类。DateTime结构用于表示示日期和时间间,表示范围围在0001年1月1日午夜00:00:00到9999年12月31日晚上11:59:59之间的日期和和时间,最小小时间单位等等于100纳秒。TimeSpan类可以表示一一个时间间隔隔,表示范围围可以在Int64.MinValue到Int64.MaxValue之间。525.7.3日期函数介绍绍DateTime结构的常用方法如下:AddYears、AddMonths、AddDays、AddHours、AddMinutes、AddSeconds方法,用于将将指定的年、、月、日、时时、分、秒加加到DateTime上。Substract方法:日期相相减。IsLeapYear方法:判断是是否为闰年。。true为闰年,false为非闰年。ToLongDateString和ToLongTimeString方法:把DateTime转换为字符串串,且以长格格式表示日期期或时间。ToShortDateString和ToShortTimeString方法:把DateTime转换为字符串串,且以短格格式表示日期期或时间。==、!=、<、>、>=、<=运算符:用于于比较日期。。+、-运算符:用于于日期的加、、减。535.7.4数学运算函数数介绍Math类属于命名名空间System,包含很多多数学函数数。常用方法如如下:Abs方法:返回回值指定数数字的绝对对值。例如如,代码Math.Abs(-3.5),结果为3.5。Sqrt方法:返回回指定数字字的平方根根。例如,,代码Math.Sqrt(9),结果为3。Pow方法:返回回指定数字字的指定次次幂。例如如,代码Math.Pow(2,3),结果为8。Log方法:返回回指定数字字的对数。。例如,代代码Math.Log(8,2),结果为3。Log10方法:返回回指定数字字以10为底的对数数。例

温馨提示

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

评论

0/150

提交评论