第三章java流程控制语句.ppt
第三章 JAVA流程控制语句,主讲教师:毛科亮,本章内容,语句概述 Java语言的语句分类 结构化程序设计的三种基本流程分支语句 If语句 If-else语句 Switch语句循环语句 while循环语句 do-while语句 for语句转移语句 break语句 continue语句 return语句常用的程序设计方法枚举法、地推法、递归法 简单图形的输出 格式化的输入与输出从键盘输入数据格式化的输出,语句的概念,java程序的执行遵循一定的流程,流程是程序执行的顺序。流程控制语句是控制程序中各语句执行顺序的语句,是程序中非常关键和基本的部分。流程控制语句可以把单个的语句组合成有意义的、能够完成一定功能的小逻辑块。,一、Java语句概述,语句与结构化程序设计在算法语言中,数据类型描述数据的性质,表达式描述对数据的运算,语句描述对数据的操作。程序由一系列语句组成。Java语言虽然是一种面向对象的计算机语言,但在一个局部,例如方法内、块语句内仍然需要面向过程的程序设计和方法。作为面向过程程序设计精华的结构化程序设计思想,仍然是面向对象程序设计方法的基石。,一、Java语句概述,结构化程序设计的三种基本流程:尽管现实世界的问题是复杂的、千变万化的,但与之相对应的计算机算法流程,只有三种基本结构-顺序结构、选择结构、循环结构。每种结构都是单入口、单出口;每一部分都会被执行到;没有死循环。,A,B,P,A,B,P,循环体,真,假,假,真,Java语言提供支持结构化程序设计的所有语言。,一、Java语句概述,Java语言提供结构化语句实现程序的流程控制。表达式语句 顺序结构 空语句 复合语句 条件语句 选择语句语句 开关 语句 switch while 循环语句 do-while for break 转移语句 continue return,一、Java语句概述,一、Java语句概述,在java语言中,语句以分号“;”为结束标志。特殊的是,块语由其他语句组成,其本身不用分号结束。内嵌有块语句并以块语句结尾的语句,也不需要用分号结尾。ava语句按性质可分为:说明性语句、操作性语句。Java语句按功能可分为:空语句、标号语句、声明语句、表达式语句、分支语句、循 环语句、断言语句、跳转语句、同步语句、异常语句、块语 句等。,一、Java语句概述,一、Java语句概述,空语句:仅包含一个分号。例如:for(int i=1;i=1000;i+);标号语句:标号:语句 标号的作用域是他所在的块语句,在作用 域内不能够有同名的其他标号或局部变量;标号语句的作用在break、continue两条跳 转语句上体现。断言语句:用于校验类的方法是否被正确调用。语法为:assert 表达式1;assert 表达式1:表达式2;其中,表达式1必须是boolean表达式,表 达式2可以是任何类型。,一、Java语句概述,一、Java语句概述,(Java程序通过控制语句来执行程序流,完成一定的任务。程序流是由若干个语句组成的,语句可以是单一的一条语句,如c=a+b,也可以是用大括号括起来的一个复合语句)。语句块可以嵌套,嵌套层数无限制定义类时类体必须采用语句块形式 定义方法时方法体必须采用语句块的形式,语句块,一、Java语句概述,一、Java语句概述,表达式语句,表达式是由运算符、操作数和函数等组成的算式。其显著特点是有返回值,即表达式的值。表达式返回值的数据类型取决于表达式的操作数和运算类型。表达式语句可分为以下几类:表达式语句:赋值表达式语句、方法调用语句、对象创建 语句、变量声明语句、自增语句。,一、Java语句概述,一、Java语句概述,分支语句实现程序流程控制的功能,即根据一定的条件有选择地执行或跳过特定的语句Java分支语句分类:if语句 if-else 语句 if-else if语句 switch 语句,分支语句,二、Java分支语句,一、Java语句概述,格式:if(表达式)语句功能:首先计算表达式,若值为真,则执行语句,否则结束执行if语句,执行if语句的后续语句。思考:int a=2;if(a3)System.out.println(a3);System.out.print(ok!);上面的执行结果是什么?,IF语句,二、Java分支语句,一、Java语句概述,class Maxpublic double getMax(double a,double b)double max;max=a;if(maxb)max=b;return max;public class Ex3_1public static void main(String args)Max obj=new Max();System.out.println(max=+obj.getMax(3.14,3.1415926);,判断两个数的最大值,格式:if(表达件)语句1;else 语句2;功能:首先计算表达式,若值为真,则执行语句1,否则执行语句2。,IF-else语句,二、Java分支语句,一、Java语句概述,import java.util.*;class Leappublic boolean isLeap(int year)if(year%4=0),闰年问题,if(条件1)/程序代码;else if(条件2)/程序代码;else if(条件3)/程序代码;注意:只要任何一个条件成立.程序就不会对下一个条件进行判断和再执行了。,IF-else if 语句,二、Java分支语句,public class Ex3_3public static void main(String args)(new Letter().judgeLetter();class Letterpublic void judgeLetter()char ch;ch=(char)(java.lang.Math.random()*128);if(ch=a,检查用random()方法产生的一个字符,判断是否为英文大写字母、小写字母、数字或是其他符号,并输出相应信息。,IF嵌套语句if(条件1)if(条件2)/程序代码;else/程序代码;else if(条件3)/程序代码;else/程序代码;.,IF嵌套语句,二、Java分支语句,switch(表达式)case 值1:语句1;break;case 值2:语句2;break;case 值3:语句3;break;.case 值N:语句N;break;default:语句N+1,多分支语句 switch,二、Java分支语句,二、Java分支语句,功能:首先计算表达式的值,然后在switch语句中寻找与该表达式的值相匹配的case值。,表达式的返回值类型必须是这几种类型一 int,byte,char,short。case子句中的值必须是常量,而且所有case子句中的值应是不同的。default子句是可选的。break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行(在一些特殊情况下,多个不同的case值要执行一组相同的操作这时可以不用break,不写break时执行自该case开始到下一次找到break语句为止),多分支语句 switch,二、Java分支语句,二、Java分支语句,import java.util.*;public class Ex3_4public static void main(String args)(new Grade().toGrade();class Gradepublic void toGrade()int score,m;Scanner reader=new Scanner(System.in);System.out.println(输入成绩:);score=reader.nextInt();if(score100)System.out.println(data error!);else m=score/10;switch(m)case 9:case 10:System.out.println(The grade is A.);break;case 8:System.out.println(The grade is B.);break;case 7:System.out.println(The grade is C.);break;case 6:System.out.println(The grade is D.);break;default:System.out.println(The grade is E.);break;,输入百分成绩,输出成绩等级。,循环语句的作用是反复执行一段代码,直到满足终止循环的条件为止。Java语言中提供的循环语句有:while语句 do-while语句 for语句,循环语句,三、Java循环语句,三、Java循环语句,While(条件)/循环体 注意:(1)此语句是先判断条件,再确定是否执行语句或程 序块。(2)条件为true时,执行循环体的语句或程序块。反 之,不执行循环体。(3)在循环体中要有改变条件的语句,否则会成为死 循环。,while语句,三、Java循环语句,do/循环体;while(条件);注意:(1)此语句是先执行一次循环体,再判断条件。(2)条件为true时,再次执行 循环体的语句或程序块。(3)在循环体中要有改变条件的语句,否则会成为死循环。(4)do-while循环语句即是至少都要执行一次的。,do-while语句,三、Java循环语句,三、Java循环语句,for(设定初始值;条件限定;修改控制变量)/程序代码;不限定的循环(死循环)for(;)/程序代码;多个变量进行定义 for(int i=0,j=100;ij;i+,j-)/程序代码;,For语句,三、Java循环语句,三、Java循环语句,for(int i=0;i100;i+)for(int j=0;ji;j+)/程序块;注意:在我们的实际开发过程中,for循环语句使用的比较多,重点把握!,For循环嵌套,三、Java循环语句,三、Java循环语句,/输出1100内前5个可以被3整除的数。public class Ex3_5 public static void main(String args)int num=0,i=1;while(i=100)if(i%3=0)System.out.print(i+);num+;if(num=5)break;i+;,/输出101200内的质数,public class Ex3_6 public static void main(String args)for(int i=101;i200;i+=2)boolean f=true;for(int j=2;j i;j+)if(i%j=0)f=false;break;if(!f)continue;System.out.print(+i);,三、Java循环语句,三、Java循环语句,JAVA中的跳转语句有:break语句 continue语句 返回语句return,跳转语句,四、Java跳转语句,break语句用于终止某个语句块或循环体的执行 break;break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块 label1:label2:label3:break label2;,break语句,四、Java跳转语句,四、Java跳转语句,break语句示例,public class Ex3_7 public static void main(String args)for(int i=1;i=10;i+)if(i=5)break;System.out.println(i=+i);System.out.println(Done);,四、Java跳转语句,四、Java跳转语句,外层跳转:break语句,在switch语中,break语句用来终止switch语句的执行。在Java中,可以为每个代码块加一个标号,一个代码块通常是用大括号括起来的一段代码。加标号的格式如下:BlockLabel:codeBlock break语句的第二种使用情况就是跳出它所指定的块,并从紧跟该块的第一条语句处执行。例如:break BlockLabel;break语句a:/标记代码块ab:/标记代码块bc:/标记代码块cbreak b;/此处的语句块不被执行/此处的语句块不被执行/从此处开始执行,四、Java跳转语句,四、Java跳转语句,break 语句用于终止某个语句块的执行。用在循环语句体中,可以强行退出循环;例如:public class Ex3_8 public static void main(String args)int stop=4;for(int i=1;i=10;i+)/当i等于stop时,退出循环 if(i=stop)break;System.out.println(i=+i);,i=1i=2i=3,continue 语句用在循环语句体中,用于终止某次循环过程,跳过循环体中 continue 语句下面未执行的循环,开始下一次循环过程;例如:public class Ex3_9 public static void main(String args)int skip=4;for(int i=1;i=5;i+)/当i等于skip时,跳过当次循环 if(i=skip)continue;System.out.println(i=+i);,i=1i=2i=3i=5,2.5.4,四、Java跳转语句,四、Java跳转语句,continue语句,continue语句用于跳过某个循环语句块的一次执行 continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环。,四、Java跳转语句,四、Java跳转语句,continue语句实例,public class Ex3_10 public static void main(String args)for(int i=1;i=10;i+)if(i=5|i=7)continue;System.out.println(i=+i);System.out.println(Done);,四、Java跳转语句,四、Java跳转语句,外层跳转:continue语句,continue语句用来结束本次循环,跳过循环体中下面尚未执行的语 句,接着进行终止条件的判断,以决定是否继续循环。对于for语 句在进行终止条件的判断前,还要先执行迭代语句。也可以用continue 跳转到括号指明的外层循环中 格式为 continue outerLable;例如 outer:for(int i=0;i10;i+)/外层循环inner:for(int j=0;j10;j+)/内层循环if(ij)continue outer;,四、Java跳转语句,四、Java跳转语句,返回语句return,return语句从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续程序的执行。返回语句有两种格式:returnexpression;return;return语句通常用在一个方法体的最后,否则会产生编译错误,除非用在if-else语句中。,四、Java跳转语句,1、枚举法(穷举法),就是把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。,五、常用的程序设计方法,38,常用算法,1、枚举法(穷举法)“笨人之法”:把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。【例一】百元买百鸡:用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,小鸡1元/3只。分析:这是个不定方程三元一次方程组问题(三个变量,两个方程)xyz=100 5x3yz/3=100 设公鸡为x只,母鸡为y只,小鸡为z只。,五、常用的程序设计方法,class Ex3_11 public static void main(String arg)int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)z=100-x-y;if(5*x+3*y+z/3.0=100)System.out.println(cocks=+x+,+hens=+y+,+chickens=+z);,结果:cocks=0,hens=25,chickens=75 cocks=4,hens=18,chickens=78 cocks=8,hens=11,chickens=81 cocks=12,hens=4,chickens=84,五、常用的程序设计方法,另一种计算方法:,class HundredYuanChicken public void printChicken()int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(x+y+z=100,五、常用的程序设计方法,41,2、递推法(迭代法)基本思想:不断由已知值推出新值,直到求得解为止。迭代初值、迭代公式和迭代终止条件是迭代法的三要素例:斐波纳契数列。前两个数都是1,第三个数是前两个数之和,以后的每个数都是其前两个数之和。各数之间的一种递推关系,即:Fn=Fn-1+Fn-2,F1=F2=1本题的三要素是:迭代初值:x=1,y=1 迭代公式:z=y+x 终止条件:共计算n-2次,五、常用的程序设计方法,42,public class Ex3_12 static int fib(int n)int first=1;int second=1;int sum=first+second;int i=2;while(+i n)first=second;second=sum;sum=first+second;return sum;public static void main(String args)System.out.println(f20=+fib(20);,程序的运行结果如下:java FibIterative f20=6765,五、常用的程序设计方法,【累加型】类型诸如+求其前n项之和的编程题。,累加型算法 若设i为循环变量,s为前n项累加之和,则程序的基本结构为:s=0;for(i=1;i=n;i+)s=s+;,五、常用的程序设计方法,44,编程求11/2+1/31/4+1/5+1/991/100,累加型算法程序基本结构为:s=0;for(i=1;i=n;i+)s=s+;,运行结果:Sum=0.6881719,五、常用的程序设计方法,45,1)class Ex3_132)static float mySum(int n)3)float k=1f;4)float sum=0.0f;5)for(int i=1;i=n;i+)6)7)sum=sum+k/i;8)k=-k;9)10)return sum;11)12)public static void main(String args)13)System.out.println(Sum100=+mySum(100);14),五、常用的程序设计方法,46,【阶乘型】类型诸如 求其前n项之积的编程题。,阶乘型算法 若设i为循环变量,s为前n项相乘之积,则程序的基本结构为:s=1;for(i=1;i=n;i+)s=s*;,五、常用的程序设计方法,47,class Ex3_14 static int myFac(int n)int fac=1;for(int i=1;i=n;i+)fac=fac*i;return fac;public static void main(String args)System.out.println(Fac10=+myFac(5);,n!运行结果:Fac10=3628800.0,五、常用的程序设计方法,48,编程求n!=1!+2!+3!+n!(n由键盘输入),在同一个循环中 先阶乘,后累加,五、常用的程序设计方法,49,1)class Ex3_15 2)static int method(int n)3)int s=0,p=1;4)for(int i=1;i=n;i+)5)p=p*i;/i!6)s=s+p;7)8)return s;9)10)public static void main(String args)11)int r=method(5);12)System.out.println(r=+r);13)14),运行结果:r=153,五、常用的程序设计方法,50,a+aa+aaa+aa=?,import java.io.*;class Ex3_16 public static void main(String args)throws IOException BufferedReader br=new BufferedReader(new InputStreamReader(System.in);System.out.print(请输入一个长度n:);String str=br.readLine();/转换字符串为整型数 int n=Integer.parseInt(str);,五、常用的程序设计方法,51,System.out.print(请输入一个整数a:);str=br.readLine();/输入字符存入字符串int a=Integer.parseInt(str);/转换字符串为整型数据int i=1,sn=0,tn=0;while(i=n)tn=tn+a;sn=sn+tn;a=a*10;+i;System.out.println(a+aa+aaa+.=+sn);,五、常用的程序设计方法,52,3、递归法 基本思想是不断把问题分解成规模较小的同类问题,直到分解形成的问题因规模足够小而能直接求得解为止。,1)class FibRecursion 2)static int fib(int n)3)if(n=1|n=2)return 1;4)return fib(n-1)+fib(n-2);5)6)public static void main(String args)7)System.out.println(f21=+fib(21);8)9),一般来说,使用递归的程序代码会更简捷,也更容易理解,但递归代码的执行效率却非常低,所以应尽量避免使用。,五、常用的程序设计方法,/分析下面程序的运行结果。public class Ex3_17 public static void main(String arge)System.out.println(method(3);public static int method(int n)if(n=1)return 1;else return n*method(n-1);,2.8,五、常用的程序设计方法,递归调用指在方法执行过程中出现该方法本身的调用例如:求Fibonacci数列:1,1,2,3,5,8,第40个数的值。数列满足递推公式:F1=1,F2=1 Fn=Fn 1+Fn 2(n 2),public class Ex3_18 public static void main(String arg)System.out.println(f(40);public static int f(int n)if(n=1|n=2)return 1;else return f(n-1)+f(n-2);,五、常用的程序设计方法,main,f5,f4,f3,f2,f1,f2,f3,f2,f1,public static int f(int n)if(n=1|n=2)return 1;else return f(n-1)+f(n-2);,五、常用的程序设计方法,56,4、简单图形的输出编程显示以下图形(共N 行,N 由键盘输入)。*,此类题目分析的要点是:通过分析,找出每行空格、*与行号i、列号j及总行数N的关系。其循环结构可用右图表示。,分析:(设N=5)第1行 4个空格=5-1 1个“*”=2*行号-1第2行 3个空格=5-2 3个“*”=2*行号-1第3行 2个空格=5-3 5个“*”=2*行号-1第4行 1个空格=5-4 7个“*”=2*行号-1第5行 0个空格=5-5 9个“*”=2*行号-1,由此归纳出:第i行的空格数N-i个;第i行的“*”数是2i-1个。,五、常用的程序设计方法,57,编程显示以下图形(共N 行,N 由键盘输入)。*算法:分成两部分完成:N=9行 N1=(N+1)/2=5 N2=N-N1=4,五、常用的程序设计方法,58,public class Ex3_19public static void main(String args)int n=9;int middle=(n+1)/2,spaceNum;for(int i=1;i=middle;i+)/打印星号前的空格 spaceNum=middle-i;for(int j=1;j=spaceNum;j+)System.out.print();/打印星号 for(int k=1;k=2*i-1;k+)System.out.print(*);System.out.println();middle=(n+1)/2;for(int i=1;i=middle;i+)/打印星号前的空格 spaceNum=middle-i;for(int j=1;j=i;j+)System.out.print();/打印星号 for(int k=1;k=2*spaceNum-1;k+)System.out.print(*);System.out.println();,五、常用的程序设计方法,59,/第一部分,输入*个数import java.io.*;public class Ex3_20public static void main(String args)throws IOException int n;BufferedReader br=new BufferedReader(new InputStreamReader(System.in);do System.out.print(input a odd number:);String str=br.readLine();n=Integer.parseInt(str);while(n%2=0);/条件值为false时结束循环,五、常用的程序设计方法,60,/第二部分,打印上半部分 int middle=(n+1)/2,spaceNum;for(int i=1;i=middle;i+)/打印星号前的空格 spaceNum=middle-i;for(int j=1;j=spaceNum;j+)System.out.print();/打印星号 for(int k=1;k=2*i-1;k+)System.out.print(*);System.out.println();,五、常用的程序设计方法,61,/第二部分,打印下半部分 for(int i=1;i=n-middle;i+)/打印星号前的空格 spaceNum=i;for(int j=1;j=spaceNum;j+)System.out.print();/打印星号 for(int k=1;k=2*(middle-i)-1;k+)System.out.print(*);System.out.println();,五、常用的程序设计方法,/第二部分另一种实现方法 int middle=(n+1)/2,spaceNum,maxLetterNum=n,letterNum;for(int i=1;i=n;i+)/打印星号前的空格spaceNum=Math.abs(middle-i);for(int j=1;j=spaceNum;j+)System.out.print();/打印星号letterNum=maxLetterNum-2*spaceNum;for(int j=1;j=letterNum;j+)System.out.print(*);System.out.println();,五、常用的程序设计方法,从命令行输入、输出数据,Scanner是JDK1.5新增的一个类,可以使用该类创建一个对象。如:Scanner reader=new Scanner(System.in);reader对象可调用下列方法,读取用户在命令行输入的各种数据:nextBoolean();nextByte();nextShort();nextInt();nextLong();nextFloat();nextDouble();System.out.println或System.out.print可输出串值、表达式的值。可使用并置符号“+”将变量、表达式值或一个常数值与一个字符串并置一起输出。JDK1.5新增了printf函数类似的数据输出方法,格式为:System.out.printf(“格式控制部分”,表达式1,表达式2,.)格式符号:%d输出int型数据;%c输出char型数据%f输出float型数据,小数部分最多保留6位;%s输出字符串数据;%md输出的int型数据占m列;%m.nf输出fload型数据占m列,小数点保留n位。,六、格式化的输入与输出,import java.util.Scanner;public class Ex3_21 public static void main(String args)System.out.println(请输入);System.out.println(请输入0结束);Scanner reader=new Scanner(System.in);double sum=0;int m=0;double x=reader.nextDouble();while(x!=0)m=m+1;sum=sum+1;x=reader.nextDouble();System.out.println(m+个数的和为+sum);System.out.println(m+个数的平均值为+sum/m);,六、格式化的输入与输出,课后作业,1、求水仙花数水仙花数的定义:/*运算规则:*水仙花数是三位数,它的个、十、百位数字的立方的和等于该数本身,*例如:371=27+343+1,课后作业,2、求100以内的质数质数的定义:只能被1或自身整除的数3、输出等腰三角形*4.输出倒等腰三角形*,课后作业,5.输出菱形*6.输出乘法表,课后作业,7、编一程序实现以下功能:运行时输出下列结果。图示:/a b c d e f g/a b c d e/a b c/a8、编一程序实现以下功能:求输入的整数各位数字之和,如输入234则输出9,输入-312则输出69、编一程序实现以下功能:将一个整数首尾倒置,若程序输入12345,则输出54321;若程序输入-34567,则输出-76543,做成一个方法传参数!,课后作业,10、编一程序实现以下功能:输入的一个小写字母、将字母后移5个位置后输出,如a变成f,w变成b。11、计算1!+2!+3!+.+10!,其中阶乘的计算用方 法实现。,Thank You,