第3章流程控制学习目标:掌握if和switch条件分支语句的使用方法掌握do、while和for循环语句的使用方法掌握break和continue语句掌握goto跳转语句的使用方法掌握控制程序结构的方法和技巧分支C#通过条件语句来控制程序的分支,它要求条件表达式必须为布尔运算,也就是说运算结果必须为真或为假,这与C、C++有很大不同。在C或C++中,只要条件表达式的运算结果为零或非零便可以控制程序的分支,而C#对于这种情况则会发出编译错误信息。C#提供了3中分支技术:if语句Switch语句三元运算符流程控制1.用if语句实现单分支选择结构流程控制单分支选择结构执行流程图流程if(条件表达式)代码;//如果条件表达式为ture,执行该行代码,否则直接执行后面的代码……if(条件表达式){代码;//如果条件表达式为ture,执行该代码块,否则直接执行后面的代码代码;……}……或者【例3-1】编写一个程序实现如下功能:输入一个成绩,如果成绩大于等于60则输出“恭喜您,您通过了这次考试!”,否则不输出任何信息。要求编写成控制台应用程序。流程控制流程控制2.用if语句实现双分支选择结构:流程控制双分支选择结构执行流程图流程控制格式:if(表达式)语句1;else语句2;[功能]:首先计算表达式的值,如果表达式的值为true,则执行语句1,如果表达式为false,则执行语句2。或者if(条件表达式){代码;//如果条件表达式为ture,执行该代码块代码;……}else{代码;//如果条件表达式为false,执行该代码块代码;……}……流程控制流程控制【例3-2】编写一个程序实现如下功能:输入一个成绩,如果成绩大于等于60则输出“恭喜您,您通过了这次考试!”,否则输出“对不起,准备补考吧!”。要求编写成Windows应用程序,程序的设计界面如下图所示:流程控制界面1流程控制界面2流程控制流程控制【例3-2】程序代码privatevoidbutton1_Click(objectsender,System.EventArgse){doublecj;cj=Convert.ToSingle(textBox1.Textif(cj=60)textBox2.Text=恭喜您,您通过了这次考试!;elsetextBox2.Text=对不起,准备补考吧!;}Privatevoidbutton2_Click(objectsender,System.EventArgse){Application.Exit();}3.用if语句实现多分支选择结构[格式]:if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……else语句n;流程控制嵌套的if语句流程控制【例3-3】编写一个求成绩等级的程序。要求输入一个学生的考试成绩,输出其分数和对应的等级。共分五个等级:小于60分的为“E”;60~69分为“D”;70~79分为“C”;80~89分为“B”;90分以上为“A”。要求编写成控制台应用程序。流程控制用if语句实现多分支选择结构流程控制格式:if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……else语句n;4.用switch语句实现多分支选择结构switch语句流程控制switch语句执行流程图switch(测试表达式){case表达式1:……//如果测试表达式的值等于表达式1的值,则执行该代码行或代码块break;case表达式2:……//如果测试表达式的值等于表达式2的值,则执行该代码行或代码块break;……case表达式n:……//如果测试表达式的值等于表达式n的值,则执行该代码行或代码块break;default:……//如果测试表达式的值不等于任何case表达式的值,则执行该代码行或代码块}流程控制测试表达式可以是整型、字符型、字符串型或枚举,而每一个case表达式则必须是常量,即这个值是在编译时定义的,而不是在程序运行时定义的。switch语句会计算每个case表达式的值,直至找到相匹配的项,并执行该匹配提供的代码行或代码块,如果没有匹配,就执行default部分的代码行或代码块。流程控制使用switch语句时应注意以下几点:每个case语句体中必须包含一个break语句,default语句体也一样,通过该break语句来中断switch语句的执行,并执行该分支结构后面的语句,否则系统在执行完一个case语句体后,将运行另外一个case语句体。只有当case语句体为空时,即case语句体中没有语句时,才允许将多个case语句放在一起使用,其后加一句代码,此时系统将一次检查多个case表达式,如果满足这些条件中的一个,就执行代码。如果要从一个case语句体跳转到另外一个case语句体,可以使用goto跳转语句,但goto语句很容易造成程序流程的混乱,降低程序的可读性,一般情况不建议用户使用。【例3-4】用switch语句重写例3-3。要求编写控制台应用程序。流程控制流程控制流程控制练习:请输入年月日,求出该日是该年的第几天?闰年的条件是:1、能被4整除,但不能被100整除的年份都是闰年,如1996年,2004年是闰年。2、能被100整除,又能被400整除的年份是闰年,如1600年、2000年是闰年。不符合这两个条件的年份不是闰年。①能被4整除,但不能被100整除。②能被100整除,又能被400整除。可以用一个逻辑表达式来表示:(year%4==0&&year%100!=0)||year%400==0当year为某一整数值时,如果上述表达式值为真(1),则year为闰年;否则year为非闰年。流程控制三元运算符三元运算符有3个操作数,其本质上是ifelse语句的一个简化版本,语法如下:通过计算测试表达式可获得一个布尔值,当值为true时,执行语句1,否则就执行语句2。注意三元运算符始终要求返回一个结果,因而对于实现“如果顾客一次性购买10件以上该商品,打8折,否则不打折”这样的情况,代码会十分简短:流程控制测试表达式?语句1:语句2doubleproductDiscount=productOderNumber10?0.8:1.0;循环在什么情况下使用循环当需要对某些语句重复执行,或需要多次执行同一任务,直到完成另一个比较大的任务时,可以使用循环结构。C#提供了3种循环结构,用来实现重复性的任务:do循环while循环for循环流程控制do….while循环do循环保证循环体至少执行一次do循环的执行方式为:首先执行标记为do循环的代码,然后计算布尔表达式的值,如果为true,则再次执行循环代码,直到布尔表达式的值为false时退出循环。需要注意的是while语句后面的分号不能省略,否则会产生错误。流程控制do{……//代码或代码块}while(布尔表达式);do…while语句执行流程语句执行流程图流程控制流程控制【例3-5】编一个程序按下列公式求e的值(要求精度达到1e-6)。流程控制【例3-5】程序代码usingSystem;classWhileTest{publicstaticvoidMain(){doublesum,t=1;inti=1;sum=1.0;do{t=t/i;sum=sum+t;i=i+1;}while(t=1.0e-6);Console.WriteLine(e={0},sum);}}while循环流程图:流程控制while语句执行流程while(布尔表达式){……//代码或代码块}while循环非常类似于do循环,它和do循环的重要区别在于:while循环在每个循环的开始对布尔表达式进行计算和判断,因此有可能完全不执行循环,而直接跳转到循环后面的代码。流程控制流程控制【例3-6】编程求下式的值(要求编写成控制台应用程序):【例3-6】程序代码usingSystem;classWhileTest{publicstaticvoidMain(){intsum,i=1,t;sum=0;//和赋初值0while(i=10)//循环,循环条件为“i=10”{t=i*i;//求第i项的值放在t中sum=sum+t;//把该项的值加到和sum中i=i+1;//i的值加1准备加下一项}Console.WriteLine(1*1+2*2+…+10*10={0},sum);}}for循环流程图流程控制for循环do循环和while循环可以用于执行不知道循环次数的任务,如果事先知道语句要重复执行的次数,则可通过for循环来实现。要定义for循环,需要以下信息:初始化计数器变量的一个起始值;继续循环的条件,即测试值,该测试值应涉及到计数器变量;每次循环结束后,对计数器变量的值通常步长来进行改变。流程控制for(初始值;测试值;步长){……//代码行或代码块}流程控制【例3-7】一张单据上有一个5位数的号码为6**42,其中百位数和千位数已模糊不清,但知道该数能被57和67除尽。设计一个算法,找出该单据所有可能的号码。usingSystem;classForTest{publicstaticvoidMain(){inthm,i,j;//hm代表要求的号码,i代表千位数,j代表百位数for(i=0;i=9;i++)//千位数从0~9for(j=0;j=9;j++)//百位数从0~9{hm=6*10000+i*1000+j*100+42;//根据规律形成可能的号码if(hm%57==0&&hm%67==0)//是要求的号码吗?Console.WriteLine(号码={0},hm);//输出结果}}}【例3-7】程序代码无限循环当由于编写代码错误或程序逻辑错误而定义了永远无法终止的循环时,便成了无限循环,又称为死循环。死循环将长期占用系统资源,并有可能造成系统死机,虽然在一些特殊情况下,使用死循环可以解决某些特定问题,但还是建议用户不要使用。可通过C#提供的循环中断技术来对循环进行更为精细的控制,避免死循环的发生。流程控制inti=1;while(i0){i++;}循环的中断C#提供了4个命令,来控制循环的执行:break——立即终止循环;continue——立即终止当前循环,而进行下一次循环;goto——可以跳出循环,到已经标记好的代码位置上;return——跳出循环及其所包含的函数体。break命令可直接退出循环;continue命令仅仅终止当前循环,而不是整个循环;goto命令可跳转到指定的标签位置。另外,使用goto命令可以退出循环,但不可以从外部跳入循环中。另外,使用goto语句虽然可以改变程序的流程,但过多使用会造成程序的混乱,因而要慎用。流程控制1.break语句【例3-8】输入一个整数X,如果该数是质数,则显示“是质数.”,如果不是则显示“不是质数.”。要求编写成Windows应用程序:【例3-8】程序代码privatevoidbutton1_Click(objectsender,System.EventArgse){intx,i;x=Convert.ToInt32(textBox1.Text);//输入的数for(i=2;ix;i++)//x被2~x-1之间的每个数除除看if(x%i==0)break;//如果有一个数能够整除,则退出循环if(i==x)textBox2.Text=是素数;elsetextBox2.Text=不是素数;//否则不是素数}privatevoidbutton2_Click(objectsender,System.EventArgse){Application.Exit();//结束}2.continue流程控制流程控制随机数的产生方法在程序设计中,经常需要产生随机数。在C#中要产生随机数需要使用Random类,该类位于命名空间System中。要使用Random类,应首先生成该类的一个对象。如:RandomrandomObj=newRandom();生成随机