流程控制语句与函数_第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使用循循环语语句语句while语句是是用来来实现现循环环的语语句,,该类类循环环先测测试循循环条条件再再执行行循环环体,,按照照不同同条件件执行行循环环体部部分零零次或或多次次。它它的语语法形形式如如下。。while(表达式式)循环体体部分分;12语句注意::循环体体如果果包含含一条条以上上的语语句,,应以以花括括号括括起来来作为为复合合语句句。在循环环体中中,通通常应应包含含改变变循环环条件件表达达式值值的语语句,,否则则便会会造成成无限限循环环。由于先先判断断条件件,可可能出出现第第一次次测试试条件件时,,表达达式的的值就就为false。此种种情况况下循循环体体将一一次也也不执执行,,又称称“允允许0次循环环”。。13语句示例::classTestWhile{staticvoidMain(string[]args){intnumber=1,sum=0;while(number<=10){sum+=number;number++;}Console.WriteLine("thesumis{0}",sum);Console.Read();}}执行上上述代代码,,运行行结果果为::thesumis55。14语句do循环语语句实实现的的是直直到型型循环环,该该类循循环先先执行行循环环体再再测试试循环环条件件。do循环体体语句句while(表达式式);15语句示例::classTestWhile{staticvoidMain(string[]args){intnumber=1,sum=0;do{sum+=number;number++;}while(number<=10);Console.WriteLine("thesumis{0}",sum);Console.Read();}}执行行上上述述代代码码,,运运行行结结果果为为::thesumis55。16语句句for(表达达式式1;表达达式式2;表达达式式3)语句句;17语句句表达达式式1、2、3都可可以以省省略略,,分分号号不不能能省省略略。。如如果果表表达达式式1、2、3都省省略略,,则则将将无无终终止止地地执执行行循循环环体体。。表达达式式2是循循环环控控制制条条件件,,如如果果省省略略,,循循环环将将无无终终止止地地进进行行下下去去。。表达达式式1一般般用用于于为为循循环环控控制制条条件件赋赋初初值值,,也也可可以以是是与与循循环环变变量量无无关关的的其其他他表表达达式式。。如如果果表表达达式式1省略略或或者者是是与与循循环环条条件件无无关关的的其其他他表表达达式式,,则则应应该该在在for语句句之之前前给给循循环环控控制制条条件件赋赋初初值值。。表达式3一般用于于改变循循环控制制条件的的值。如如果表达达式3省略或者者是其他他与循环环条件无无关的表表达式,,则应该该在循环环体中另另有语句句改变循循环条件件,以保保证循环环能正常常结束。。18语句foreach(类型标标识符符in表达式)嵌入语句句;示例:staticvoidMain(string[]args){int[]list={10,20,30,40,50,60};foreach(intiinlist)Console.Write("{0,-5}",i);Console.Read();}19语句和continue语句break语句用于于跳出包包含它的的switch、while、do、for、foreach语句。如果break不是在switch、while、do、for、foreach语句块中中,将发发生编译译错误。。当switch、while、do、for、foreach语句相互互嵌套时时,break语句只是是跳出直直接包含含它的语语句块。。20语句和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函数函数的定义义与使用函数在使用用之前必须须先定义,,函数定义义的形式如如下。函数修饰符符数据类型标标识符函函数名名(形式参数说说明列表){变量、数组组的定义语语句;其他可执行行部分}函数的返回回值是需要要返回给主主调函数的的处理结果果,由return语句给出。。对于无返回回值的函数数,其类型型标识符为为void,不需要return语句28函数的定义义与使用示例:编写写一个函数数,用于求求任意两个个整数之间间所有数的的平方和。。classProgram{privatestaticintpfh(intx,inty){inti,sum=0;for(i=x;i<=y;i++)sum=sum+i*i;return(sum);}}29函数的定义义与使用函数的使用用:在类中的某某个函数中中,调用本本类中由“函数名”指定的函数数,其语法法形式如下下:函数名([实际参数列表表])调用另一个类类的非静态函函数,其语法法形式如下::对象名.方法名([实际参数列表表])调用另一个类类的静态函数数,其语法形形式如下:类名.方法名([实际参数列表表])30函数的参数传传递参数传递中的的类型转化示例: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函数的参数传传递参数传递的类类型:值传递时参数的语法法形式如下::参数类型参参数名引用传递时参数的语法法形式如下::ref参数类型参参数名输出传递时参数的语法法形式如下::out参数类型参参数名参数数组:使用params关键字声明参参数,参数个个数为不确定定。32函数的参数传传递值传递参数示例: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函数的参数传传递引用传递参数示例: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函数的参数传传递输出传递参数示例: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的区别::41函数的参参数传递递参数数组组有时需要要传递的的参数个个数不确确定,例例如求几几个数的的平均值值。可以以使用params关键字声声明参数数的个数数为不确确定。42函数的参参数传递递参数数组组示例: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内联函数数对于一些些功能简简单、规规模较小小又使用用频繁的的函数,,CLR会做出是是否使用用内联函函数的判判断。内内联函数数不在调调用时发发生控制制转移,,而是在在编译时时将函数数体嵌入入在每一一个调用用处,这这样就节节省了参参数传递递、控制制转移等等消耗。。注意:在在何处内内联代码码完全由由CLR判断得出出,无法法使用诸诸如C++中inline的关键字字来控制制哪些方方法是内内联的。。44函数重载载函数重载载允许一一个类中中有同名名的函数数存在,,即一个个类中可可以存在在两个以以上的函函数名称称相同。。重载函数数的形参参必须不不同,可可以个数数不同或或者类型型不同。。示例:intadd(intx,inty);intadd(inta,intb);//错误!编编译器不不以形参参名来区区分函数数intadd(intx,inty);voidadd(intx,inty);//错误!编译译器不以返返回值来区区分函数45函数重载示例: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常用内部函函数随机函数介介绍在C#中要生成随随机数需要要使用Random类。该类类的主要方方法是Next方法,它生生成一个介介于两个整数之间的随机机数,其语语法形式如如下:publicvirtualintNext([intminValue,intmaxValue]);47随机函数介介绍示例: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格式化函数数介绍.NET为处理数字字、日期以以及字符串串的格式化化提供了WriteLine方法、Format方法和ToString方法。通过过WriteLine方法和Format方法可对多多个变量进进行格式化化,ToString方法只能对对一个变量量进行格式式化。对于使用WriteLine方法和Format方法格式化化字符串,,规定格式式的一般语语法形式如如下。{N,[M][:格式码精精度]}49格式化函数数介绍{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日期函数介介绍用于处理时时间和日期期的对象为为DateTime结构和TimeSpan类。DateTime结构用于表表示日期和和时间,表表示范围在在0001年1月1日午夜00:00:00到9999年12月31日晚上11:59:59之间间的的日日期期和和时时间间,,最最小小时时间间单单位位等等于于100纳秒秒。。TimeSpan类可可以以表表示示一一个个时时间间间间隔隔,,表表示示范范围围可可以以在在Int64.MinValue到Int64.MaxValue之间间。。52日期期函函数数介介绍绍DateTime结构构的的常常用用方法法如下下::AddYears、AddMonths、AddDays、AddHours、AddMinutes、AddSeconds方法法,,用用于于将将指指定定的的年年、、月月、、日日、、时时、、分分、、秒秒加加到到DateTime上。。Substract方法法::日日期期相相减减。。IsLeapYear方法法::判判断断是是否否为为闰闰年年。。true为闰闰年年,,false为非非闰闰年年。。ToLongDateString和ToLongTimeString方法法::把把DateTime转换换为为字字符符串串,,且且以以长长格格式式表表示示日日期期或或时时间间。。ToShortDateString和ToShortTimeString方法法::把把DateTime转换换为为字字符符串串,,且且以以短短格格式式表表示示日日期期或或时时间间。。==、!=、<、>、>=、<=运算算符符::用用于于比比较较日日期期。。+、-运算算符符::用用于于日日期期的的加加、、减减。。53数学学运运算算函函数数介介绍绍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为底底的的对对数数。。例例如如,,代代码码Math.Log10(100),结结果果为为2。54数学学运运算算函函数数介介绍绍Sin、Cos、Tan、Asin、Acos、Atan方法法::返返回回指指定定弧弧度度的的正正弦弦值值、、余余弦弦值值、、正正切切值值、、反反正正弦弦值值、、反反余余弦弦值值、、反反正正切切值值。。例例如如,,代代码码Math.

温馨提示

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

评论

0/150

提交评论