第7章程序结构和常用算法分支控制结构循环(或重复)结构其他辅助语句应用举例课程内容二三四一一、分支控制结构在程序的执行过程中,可根据不同的条件选择不同语句,也可以在两种及两种以上的分支中选择一个,执行相应的语句,而跳过另外一些分支的语句。在分支结构中分成if结构和switch结构,其中if语句使用布尔表达式或布尔值作为分支条件来进行分支控制;而switch语句则用于对多个值进行匹配,从而实现分支控制。一、分支控制结构1if结构常用于执行“二选一”的操作,即满足条件时执行一个分支,不满足条件时执行另外一个分支。此外还有几种特殊用法,如if结构的嵌套、省略一个分支等。格式一:if(relation_expression){statementblock1;}else{statementblock2;}一、分支控制结构这是if语句最基本用法,从两个分支中选择一个执行。功能如图所示:一、分支控制结构求两个数值的最大值为例,可以给出下面的代码:intnum1=45326,num2=54321,max;if(num1num2){max=num1;}else{max=num2;}System.out.println(“max=”+max);一、分支控制结构格式二:if(relation_expression){statementblock;}这是最简单的if语句,其功能如图所示:一、分支控制结构求两个数值的最大值时,也可以改写为下面的代码:intnum1=45326,num2=54321,max;max=num1;//先假定最大值是num1if(num2num1){max=num2;}System.out.println(“max=”+max);格式三if(relation_expression1){statementblock1;}elseif(relation_expression2){statementblock2:}……一、分支控制结构elseif(relation_expressionM-1){statementblockM-1;}else{statementblockM;}这是一个多者选择一的if语句,其功能如图所示一、分支控制结构例3-1:比较两个数的大小,并从小到大排序输出一、分支控制结构PublicclassCompareTwo{publicstaticvoidmain(String[]args){doublenum1=23.4;doublenum2=35.1;if(num1=num2){System.out.println(num2+=+num1);}else{System.out.println(num1+=+num2);}}}结果是“23.4=35.1”一、分支控制结构2switch结构这也是一个多分支结构,实现“多选一”功能。switch结构和格式三的if结构类似。在现实应用中,常常会遇到多种可能性的情况,如果用格式三的if语句来处理,大多数时候会显得麻烦,使用switch语句则简单明了。switch语句也称为开关语句。switch语句由一个控制表达式和多个case标签组成,和if语句不同的是,switch语句后面的控制表达式的数据类型只能是byte,short,char,int四个整数类型和枚举类型,不能是boolean类型。Java7之后改进了switch分支语句,Java7允许switch语句中的控制表达式可以为java.lang.String类型。switch语句往往需要在case标签后紧跟一个代码块,case标签作为这个代码块的标识。switch的语法格式如下:switch(expression){casecondition1:statementblock1;break;casecondition2:statementblock2;break;……caseconditionN:statementblockN;break;[default:defaultstatementblock;break;]}一、分支控制结构一、分支控制结构这个switch功能如图所示一、分支控制结构例3-2:根据考试等级(A,B,C,D,E)、打印百分制分数段。//GradeLevel.javaimportjava.io.*;publicclassGradeLevel{publicstaticvoidmain(String[]args){//TODO:Addyourownimplementation.System.out.println(*******firstsituation******);chargrade='C';System.out.print(PleaseenterA---D:);//提示输入信息try{grade=(char)System.in.read();//读取的字符对应的ASCII转换成字符}catch(IOExceptione){一、分支控制结构///}switch(Character.toUpperCase(grade)){case'A'://A表示优,System.out.println(grade+is90---100);break;case'B'://B表示良System.out.println(grade+is80---89);break;case'C'://中System.out.println(grade+is70---79);break;case'D'://及格System.out.println(grade+is60---69);break;case'E'://不及格System.out.println(grade+is60);break;一、分支控制结构default:System.out.println(You'veenterediserror);}}}运行程序,输入等级B,则显示“Bis80---89”。该例中如果5个break语句均去掉不要,并输入字符“A”,显示:显然不是期望的结果。但是在某些特殊情况下,就需要省略break语句,反而可方便程序的编写,因此应该视具体情况而定一、分支控制结构例3-3:输入春夏秋冬四季,输出对应的描述。//FourSeason.javapackagech3;publicclassFourSeason{publicstaticvoidmain(String[]arguments){Stringseason=春天;switch(season){case春天:System.out.println(春暖花开);break;case夏天:System.out.println(夏日炎炎);break;case秋天:System.out.println(秋高气爽);break;一、分支控制结构case冬天:System.out.println(冬雪飘飘);break;}}}运行程序,结果显示“春暖花开”。注意:在Java7中增强了switch语句的功能,允许switch语句的控制表达式是java.lang.String类型的变量或表达式—--只能是java.lang.String类型,不能是StringBuffer或StringBuilder这两种字符串类型。二、循环(或重复)结构在一定条件下,反复执行某段程序(称循环体),直到条件不成立为止。循环结构(repetitionstructure)分为三种:for循环、while(当)循环、do…while(直到)循环。循环语句可能包括如下4个部分:初始化语句(init_statement):一条或多条语句,这些语句用于完成一些初始化工作,初始化语句在循环开始之前执行。循环条件(test_expression):这是一个boolean表达式,这个表达式决定是否执行循环体。循环体(body_statement):这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行。如果这个代码块只有一行语句,则这个代码块的花括号是可以省略的。二、循环(或重复)结构1for结构迭代语句(iteration_statement):这个部分是描述在一次循环体执行结束之后,对循环条件求值之前执行,通常用于控制循环条件中的变量,使得循环在合适的时候结束。上面4个部分只是一般的分类,并不是每个循环中都非常清晰的分出了这4个部分。与C/C++语言相同,是在已知循环次数的条件下使用的循环,即是循环的初始值和终止值在循环执行前是确定的。for循环也是使用灵活、功能很强的一种循环结构。格式:for(inifialization;termination;iteration){//循环体circlebody}二、循环(或重复)结构for循环的执行流程如图所示:二、循环(或重复)结构如计算1到10的和的程序代码:intsum=0;for(inti=1;i=10;i++){sum+=i;}System.out.println(“1到10的和=”+sum);实际应用时,for中的三个表达式中的任意一个可以为空或多个语句。如:for(intn=0,m=0;m+n10;m++,n++){System.out.println{“current&nis”+n+”&m”+m};}几个常用的for循环://1m=0;//在for结构前面赋初值for(;m3;m++)//无初始值表达式{二、循环(或重复)结构//repetitionbody}//2for(m=0;;m++)//无条件判断表达式{//repetitionbodyif(m=3)break;}//3for(m=0;m3;)//无累加表达式{//repetitionbodym++;}//4m=0for(;m3;)//只有条件表达式{//repetitionbodym++;}二、循环(或重复)结构//5m=0;for(;;m++)//只有增减表达式{//repetitionbodyif(m=3)break;}//6m=0;for(;;;)//三个表达式全省略{//repetitionbodyif(m=3)break;m++;}注意:无论for中的三个表达式中是否为空,三个表达式之间的“;”分隔符必不可少,否则在编译时会出现错误。二、循环(或重复)结构例3-4:打印5到10的阶乘://ForExam.javapublicclassForExam{publicstaticvoidmain(String[]args){longfactorial;for(intn=5;n=10;n++){factorial=1;for(intj=2;j=n;j++)factorial*=j;//部分积System.out.println(n+!=+factorial);//打印阶乘}}}程序的运行结果为:二、循环(或重复)结构2while结构实现“当”循环,即当循环条件成立时,重复执行循环体。否则退出while结构。先进行条件判断,然后决定是否执行循环体。格式:while(logicorconditionalexpression){repeat_statement}while结构循环的执行流程如图所示:二、循环(或重复)结构如求1到100的和:intn=1,sum=0;while(true){sum+=n;n++;if(n100)break;}System.out.println(“1~100的和=”+sum);例3-5:输入一串字符,判断每个字符类型,遇到q(Q)时结束判断。//WhileEaxm.javaimportjava.io.*;publicclassWhileExam{publicstaticvoidmain(String[]args)throwsIOException{二、循环(或重复)结构charc;System.out.println(输入一个字符,输入q时Quit!);while((Character.toU