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

下载本文档

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

文档简介

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

if(表达式)

语句1;else

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

语句1;

break;case常量表达式2:

语句2;

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

语句n;

break;default:

语句n+1;

break;}75.2.2switch语句在C#语言中,除使用if语句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后面必须是常量表达式,以冒号结束而不是分号。85.2.2switch语句switch表达式的类型为s95.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);}95.2.2switch语句示例: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);}105.2.3switch语句的控制类型switch语句115.3使用循环语句5.3.1while语句while语句是用来实现循环的语句,该类循环先测试循环条件再执行循环体,按照不同条件执行循环体部分零次或多次。它的语法形式如下。while(表达式)循环体部分;115.3使用循环语句5.3.1while语句125.3.1while语句注意:循环体如果包含一条以上的语句,应以花括号括起来作为复合语句。在循环体中,通常应包含改变循环条件表达式值的语句,否则便会造成无限循环。由于先判断条件,可能出现第一次测试条件时,表达式的值就为false。此种情况下循环体将一次也不执行,又称“允许0次循环”。125.3.1while语句注意: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。135.3.1while语句示例:145.3.2do语句do循环语句实现的是直到型循环,该类循环先执行循环体再测试循环条件。do循环体语句while(表达式);145.3.2do语句do循环语句实现的是直到型循环,该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。155.3.2do语句示例:165.3.3for语句for(表达式1;表达式2;表达式3)

语句;165.3.3for语句for(表达式1;表达式2;175.3.3for语句表达式1、2、3都可以省略,分号不能省略。如果表达式1、2、3都省略,则将无终止地执行循环体。表达式2是循环控制条件,如果省略,循环将无终止地进行下去。表达式1一般用于为循环控制条件赋初值,也可以是与循环变量无关的其他表达式。如果表达式1省略或者是与循环条件无关的其他表达式,则应该在for语句之前给循环控制条件赋初值。表达式3一般用于改变循环控制条件的值。如果表达式3省略或者是其他与循环条件无关的表达式,则应该在循环体中另有语句改变循环条件,以保证循环能正常结束。175.3.3for语句表达式1、2、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();}185.3.4foreach语句foreach(195.3.5break语句和continue语句break语句用于跳出包含它的switch、while、do、for、foreach语句。如果break不是在switch、while、do、for、foreach语句块中,将发生编译错误。当switch、while、do、for、foreach语句相互嵌套时,break语句只是跳出直接包含它的语句块。195.3.5break语句和continue语句bre205.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();}}205.3.5break语句和continue语句cl215.3.5break语句和continue语句continue语句类似于break语句,也必须用于while、dowhile、for、foreach语句,它只从循环的当前迭代中退出,然后在循环的下一次迭代开始重新执行,而不是退出循环。需要注意如下事项:continue语句的目标地址为直接包含它的while、dowhile、for或者foreach语句的嵌套语句结尾。假如continue语句不能被while、dowhile、for或者foreach语句包含,将发生编译错误。当有while、dowhile、for或者foreach语句相互嵌套时,continue语句只适用于直接包含它的语句块。215.3.5break语句和continue语句con225.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();}225.3.5break语句和continue语句示例235.4使用goto语句

goto语句是除选择语句、循环语句之外的控制程序流程的语句,常用于将程序流程转移出嵌套范围。goto语句的常见用法为gotolable语句。其中,lable为一个标签,其语法形式为:标签1:235.4使用goto语句goto语句是除选择语句、循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();}245.4使用goto语句示例:255.5嵌套使用流程控制语句选择结构的嵌套:if(表达式1)if(表达式2)

语句1else

语句2elseif(表达式3)

语句3else

语句4255.5嵌套使用流程控制语句选择结构的嵌套:265.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();}265.5嵌套使用流程控制语句循环结构的嵌套275.6函数5.6.1函数的定义与使用函数在使用之前必须先定义,函数定义的形式如下。函数修饰符数据类型标识符函数名(形式参数说明列表){

变量、数组的定义语句;

其他可执行部分}函数的返回值是需要返回给主调函数的处理结果,由return语句给出。对于无返回值的函数,其类型标识符为void,不需要return语句275.6函数5.6.1函数的定义与使用285.6.1函数的定义与使用示例:编写一个函数,用于求任意两个整数之间所有数的平方和。classProgram{privatestaticintpfh(intx,inty){inti,sum=0;for(i=x;i<=y;i++)sum=sum+i*i;return(sum);}}285.6.1函数的定义与使用示例:编写一个函数,用于求295.6.1函数的定义与使用函数的使用:在类中的某个函数中,调用本类中由“函数名”指定的函数,其语法形式如下:函数名([实际参数列表])调用另一个类的非静态函数,其语法形式如下:对象名.方法名([实际参数列表])调用另一个类的静态函数,其语法形式如下:类名.方法名([实际参数列表])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();}}305.6.2函数的参数传递参数传递中的类型转化315.6.2函数的参数传递参数传递的类型:值传递时参数的语法形式如下:参数类型参数名引用传递时参数的语法形式如下:ref参数类型参数名输出传递时参数的语法形式如下:out参数类型参数名参数数组:使用params关键字声明参数,参数个数为不确定。315.6.2函数的参数传递参数传递的类型: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();}}325.6.2函数的参数传递值传递参数示例: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();}}335.6.2函数的参数传递引用传递参数示例: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();}}345.6.2函数的参数传递输出传递参数示例:35Ref与out的区别:out关键字会导致参数通过引用来传递,这与ref关键字类似。不同之处在于:(1)ref传进去的参数必须在调用前初始化,而out不必,因为out的函数会先清空变量,即使变量已经赋值。

inti;SomeMethod(refi);//语法错误

SomeMethod(outi);//通过35Ref与out的区别:out关键字会导致参36Ref与out的区别:(2)ref传进去的参数在函数内部可以直接使用,而out不可。

publicvoidSomeMethod(refinti)

{

intj=i;//通过

//...

}publicvoidSomeMethod(outinti)

{

intj=i;//语法错误

}(3)ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。36Ref与out的区别:(2)ref传进去的参数在函数内部37usingsystem;

classtestapp

{

staticvoidouttest(outintx,outinty)

{//离开这个函数前,必须对x和y赋值,否则会报错。

//y=x;

//上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行

x=1;

y=2;

}

staticvoidreftest(refintx,refinty)

{

y=x;

}37usingsystem;

classtes38publicstaticvoidmain()

{

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);

}38publicstaticvoidma39(4)ref:

当需要通过调用某函数来改变实参变量的值时,使用ref。

out:主要是为了一个方法能返回两个以上的结果。Ref与out的区别:当一个方法需要多个返回值时,靠方法返回值(return)就不能胜任,幸好.Net有out和ref关键字。比如:登录方法,登录结果有成功和失败,但是如果失败还要知道原因。仅靠返回值就不行了,这个就可以用out。

boolLogin(stringname,stringpassword,outstringerrMsg){……}out方法参数传递前可以不赋值,但是方法中必须先赋值后使用;

ref方法参数传递前必须赋值,方法中可以直接使用。

out侧重输出(方法传递前,不知道值,调用方法后获得值),ref侧重更改(调用方法前就有明确的值,方法中发生更改)。那么刚才登陆的例子到底用ref还是out呢?这样分析:如果成功是不需要errMsg的,如果失败调用前errMsg的实参是不需要赋值的,所以应该侧重于输出,使用out比较合适。39(4)ref:

当需要通过调用某函数来改变实参变量的值时40注:※对于值型变量作为方法参数时,可以有如上所述三种情况:1.没有ref和out修饰(直接传值,不能改变实参)2.使用ref修饰(引用传递,输入,可以改变实参)3.使用out修饰(引用传递,输出,可以改变实参)※

对于引用类型的变量的三种情况:1.没有ref和out修饰(引用传递,可以改变实参)2.使用ref修饰(与1类似。但如果在被调用函数里面把传过来的类=null,我们就可以看出区别了)3.使用out修饰(引用传递,可以改变实参)Ref与out的区别:40注:Ref与out的区别:415.6.2函数的参数传递参数数组

有时需要传递的参数个数不确定,例如求几个数的平均值。可以使用params关键字声明参数的个数为不确定。

415.6.2函数的参数传递参数数组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();}}425.6.2函数的参数传递参数数组示例:435.6.3内联函数对于一些功能简单、规模较小又使用频繁的函数,CLR会做出是否使用内联函数的判断。内联函数不在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,这样就节省了参数传递、控制转移等消耗。注意:在何处内联代码完全由CLR判断得出,无法使用诸如C++中inline的关键字来控制哪些方法是内联的。435.6.3内联函数对于一些功能简单、规模较小又使用频445.6.4函数重载函数重载允许一个类中有同名的函数存在,即一个类中可以存在两个以上的函数名称相同。重载函数的形参必须不同,可以个数不同或者类型不同。示例:intadd(intx,inty);intadd(inta,intb); //错误!编译器不以形参名来区分函数intadd(intx,inty);voidadd(intx,inty); //错误!编译器不以返回值来区分函数445.6.4函数重载函数重载允许一个类中有同名的函数存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();}}455.6.4函数重载示例:465.7常用内部函数5.7.1随机函数介绍在C#中要生成随机数需要使用Random类。该类的主要方法是Next方法,它生成一个介于两个整数之间的随机数,其语法形式如下:publicvirtualintNext([intminValue,intmaxValue]);465.7常用内部函数5.7.1随机函数介绍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();}}由于结果是随机值,所以这里不再描述运行结果,475.7.1随机函数介绍示例:485.7.2格式化函数介绍.NET为处理数字、日期以及字符串的格式化提供了WriteLine方法、Format方法和ToString方法。通过WriteLine方法和Format方法可对多个变量进行格式化,ToString方法只能对一个变量进行格式化。对于使用WriteLine方法和Format方法格式化字符串,规定格式的一般语法形式如下。{N,[M][:格式码精度]}485.7.2格式化函数介绍.NET为处理数字、日期以及495.7.2格式化函数介绍{N,[M][:格式码精度]}[]:表示其中的内容为可选项。N:表示要格式化的参数的索引。M:可选参数,表示格式化后的参数所占的宽度。如果M是负数,那么格式化后的值就是左对齐的;如果M是正数,那么格式化后的值是右对齐的;如果未指定M,则默认为零。格式码:可选的格式化代码字符串。精度:格式化输出的有效位数或小数位数。495.7.2格式化函数介绍{N,[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][:格式码精度]}50//部分数值格式输出方式的例子{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之间。515.7.3日期函数介绍用于处理时间和日期的对象为Da525.7.3日期函数介绍DateTime结构的常用方法如下:AddYears、AddMonths、AddDays、AddHours、AddMinutes、AddSeconds方法,用于将指定的年、月、日、时、分、秒加到DateTime上。Substract方法:日期相减。IsLeapYear方法:判断是否为闰年。true为闰年,false为非闰年。ToLongDateString和ToLongTimeString方法:把DateTime转换为字符串,且以长格式表示日期或时间。ToShortDateString和ToShortTimeString方法:把DateTime转换为字符串,且以短格式表示日期或时间。==、!=、<、>、>=、<=运算符:用于比较日期。+、-运算符:用于日期的加、减。525.7.3日期函数介绍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为底的对数。例如,代码Math.Log10(100),结果为2。535.7.4数学运算函数介绍Math类属于命名空间Sy545.7.4数学运算函数介绍Sin、Cos、Tan、Asin、Acos、Atan方法:返回指定弧度的正弦值、余弦值、正切值、反正弦值、反余弦值、反正切值。例如,代码Math.Sin(30*Math.PI/180),结果为0.5。Floor方法:返回小于或等于参数的最大整数。例如,代码Math.Floor(3.5),结果为3;Math.Floor(-3.5),结果为-4。如果想得到一个四舍五入的数,可以采用式子Math.Floor(x+0.5)。Ceiling方法:返回大于或等于参数的最小整数。例如,代码Math.Ceiling(3.5),结果为4;Math.Ceiling(-3.5),结果为-3。Max方法:求两个值中的较大者。例如,代码Math.Max(-3.5,-10.4),结果为-3.5。Min方法:求两个值中的较小者。例如,代码Math.Min(-3.5,-10.4),结果为-10.4。545.7.4数学运算函数介绍Sin、Cos、Tan、A55方法功能示例Abs(x)求x的绝对值Abs(15.3)=15.3、Abs(0)=0、Abs(-5.3)=5.3Ceiling(x)求不小于x的最小整数Ceiling(7.3)=8.0、Ceiling(-9.6)=-9.0Cos(x)求x的余弦值(x为弧度)Cos(0.0)=1.0Exp(x)求指数Exp(1.0)=2.718281828Floor(x)求不大于x的最小整数Floor(7.8)=7.0、Floor(-9.2)=-10.0Log(x)求以e为底的自然对数Log(2.718281828)=1.0Max(x,y)求x和y的最大值Max(5.6,8.3)=8.3Min(x,y)求x和y的最小值Min(5.6,8.3)=5.6Pow(x,y)求x的y次幂Pow(3.0,3.0)=27.0、Pow(4.0,0.5)=2.0Sin(x)求x的正弦值(x为弧度)Sin(0.0)=0.0、Sin(3.1415929/2)=1.0Sqrt(x)求x的算术平方根Sqrt(9.0)=3.0Tan(x)求x的正切值(x为弧度)Tan(0.0)=0.0、Tan(3.1415926/4)=1.055方法功能示例Abs(x)求x的绝对值Abs(15.3)=56

调用以上数学方法的一般形式:

System.Math.方法名([参数])

在Math类中定义了两个重要的常数:Math.PI(圆周率3.14159265358979323846)

Math.E(自然对数—2.71828182845904523)56调用以上数学方法的一般形式:575.8小结本章主要介绍了流程控制语句和函数的相关知识。任何程序都有一定的流程,其中的顺序语句、循环语句和选择语句是本章介绍的重点,也是编写程序代码的基础。只需充分掌握这3种结构,再复杂的程序都能够游刃有余。另外还介绍了一些函数的基本知识以及常用的内部函数。函数的基础知识需要读者重点掌握,也是后续章节中将要介绍的类的重要组成部分。熟记常用的内部函数,能够大大提高代码编写效率。575.8小结本章主要介绍了流程控制语句和函数的相关知识演讲完毕,谢谢观看!演讲完毕,谢谢观看!59第5章流程控制语句与函数5.1控制程序流程5.2使用选择语句5.3使用循环语句5.4使用goto语句5.5嵌套使用流程控制语句5.6函数5.7常用内部函数5.8小结1第5章流程控制语句与函数5.1控制程序流程605.1控制程序流程控制程序流程的方法很多,主要有如下3种:选择语句:如同考试中的单选题目,选择执行了某条语句,另一条就不会再执行。循环语句:在需要将一个表达式进行多次重复运算时,可以使用循环语句,指定其循环次数或者界定其退出循环的条件。goto语句:即标记语句,使程序自动跳到标记语句处执行,标记语句执行完毕又直接回到调用标记语句处。需要注意的是,在程序中最好不使用goto语句,因为该语句会使得程序代码可读性很差。25.1控制程序流程控制程序流程的方法很多,主要有如下3615.2使用选择语句5.2.1if语句用if语句实现单分支选择结构:if(表达式)语句;语句中的表达式通常用于表示条件,应为关系表达式或逻辑表达式。语句只是一条语句,如果在条件满足时需要执行多条语句,应使用花括号({})括起来,使之成为语句块。“(表达式)”中的括号不能省略。35.2使用选择语句5.2.1if语句625.2.1if语句示例:staticvoidMain(string[]args){doublescore;score=Convert.ToDouble(Console.ReadLine());if(score>=60)Console.WriteLine("恭喜你,通过了这次考试!");Console.Read();}45.2.1if语句示例:635.2.1if语句用if语句实现双分支选择结构:

if(表达式)

语句1;else

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

语句1;

break;case常量表达式2:

语句2;

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

语句n;

break;default:

语句n+1;

break;}75.2.2switch语句在C#语言中,除使用if语句665.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后面必须是常量表达式,以冒号结束而不是分号。85.2.2switch语句switch表达式的类型为s675.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);}95.2.2switch语句示例:685.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);}105.2.3switch语句的控制类型switch语句695.3使用循环语句5.3.1while语句while语句是用来实现循环的语句,该类循环先测试循环条件再执行循环体,按照不同条件执行循环体部分零次或多次。它的语法形式如下。while(表达式)循环体部分;115.3使用循环语句5.3.1while语句705.3.1while语句注意:循环体如果包含一条以上的语句,应以花括号括起来作为复合语句。在循环体中,通常应包含改变循环条件表达式值的语句,否则便会造成无限循环。由于先判断条件,可能出现第一次测试条件时,表达式的值就为false。此种情况下循环体将一次也不执行,又称“允许0次循环”。125.3.1while语句注意:715.3.1while语句示例:

classTestWhile{staticvoidMain(string[]args){intnumber=1,sum=0;

while(number<=10){sum+=number;number++;}Console.WriteLine("thesumis{0}",sum);Console.Read();}}执行上述代码,运行结果为:thesumis55。135.3.1while语句示例:725.3.2do语句do循环语句实现的是直到型循环,该类循环先执行循环体再测试循环条件。do循环体语句while(表达式);145.3.2do语句do循环语句实现的是直到型循环,该735.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。155.3.2do语句示例:745.3.3for语句for(表达式1;表达式2;表达式3)

语句;165.3.3for语句for(表达式1;表达式2;755.3.3for语句表达式1、2、3都可以省略,分号不能省略。如果表达式1、2、3都省略,则将无终止地执行循环体。表达式2是循环控制条件,如果省略,循环将无终止地进行下去。表达式1一般用于为循环控制条件赋初值,也可以是与循环变量无关的其他表达式。如果表达式1省略或者是与循环条件无关的其他表达式,则应该在for语句之前给循环控制条件赋初值。表达式3一般用于改变循环控制条件的值。如果表达式3省略或者是其他与循环条件无关的表达式,则应该在循环体中另有语句改变循环条件,以保证循环能正常结束。175.3.3for语句表达式1、2、3都可以省略,分号765.3.4foreach语句foreach(类型标识符in表达式)

嵌入语句;示例:staticvoidMain(string[]args){int[]list={10,20,30,40,50,60};

foreach(intiinlist)Console.Write("{0,-5}",i);

Console.Read();}185.3.4foreach语句foreach(775.3.5break语句和continue语句break语句用于跳出包含它的switch、while、do、for、foreach语句。如果break不是在switch、while、do、for、foreach语句块中,将发生编译错误。当switch、while、do、for、foreach语句相互嵌套时,break语句只是跳出直接包含它的语句块。195.3.5break语句和continue语句bre785.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();}}205.3.5break语句和continue语句cl795.3.5break语句和continue语句continue语句类似于break语句,也必须用于while、dowhile、for、foreach语句,它只从循环的当前迭代中退出,然后在循环的下一次迭代开始重新执行,而不是退出循环。需要注意如下事项:continue语句的目标地址为直接包含它的while、dowhile、for或者foreach语句的嵌套语句结尾。假如continue语句不能被while、dowhile、for或者foreach语句包含,将发生编译错误。当有while、dowhile、for或者foreach语句相互嵌套时,continue语句只适用于直接包含它的语句块。215.3.5break语句和continue语句con805.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();}225.3.5break语句和continue语句示例815.4使用goto语句

goto语句是除选择语句、循环语句之外的控制程序流程的语句,常用于将程序流程转移出嵌套范围。goto语句的常见用法为gotolable语句。其中,lable为一个标签,其语法形式为:标签1:235.4使用goto语句goto语句是除选择语句、循825.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();}245.4使用goto语句示例:835.5嵌套使用流程控制语句选择结构的嵌套:if(表达式1)if(表达式2)

语句1else

语句2elseif(表达式3)

语句3else

语句4255.5嵌套使用流程控制语句选择结构的嵌套:845.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();}265.5嵌套使用流程控制语句循环结构的嵌套855.6函数5.6.1函数的定义与使用函数在使用之前必须先定义,函数定义的形式如下。函数修饰符数据类型标识符函数名(形式参数说明列表){

变量、数组的定义语句;

其他可执行部分}函数的返回值是需要返回给主调函数的处理结果,由return语句给出。对于无返回值的函数,其类型标识符为void,不需要return语句275.6函数5.6.1函数的定义与使用865.6.1函数的定义与使用示例:编写一个函数,用于求任意两个整数之间所有数的平方和。classProgram{privatestaticintpfh(intx,inty){inti,sum=0;for(i=x;i<=y;i++)sum=sum+i*i;return(sum);}}285.6.1函数的定义与使用示例:编写一个函数,用于求875.6.1函数的定义与使用函数的使用:在类中的某个函数中,调用本类中由“函数名”指定的函数,其语法形式如下:函数名([实际参数列表])调用另一个类的非静态函数,其语法形式如下:对象名.方法名([实际参数列表])调用另一个类的静态函数,其语法形式如下:类名.方法名([实际参数列表])295.6.1函数的定义与使用函数的使用:885.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.

温馨提示

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

评论

0/150

提交评论