运算符表达式和语句.ppt
第三章 运算符、表达式和语句,2.3语句与流程控制,语句是java程序的基本组成部分,可以分成如下几类:1.声明创建语句:例如,String name=“Zhangsan”;int age=24;2.表达式语句 例如,a=b+(c-d);/赋值语句3.方法调用语句 System.out.print(“Hello”);,2.3语句与流程控制,4复合语句 由一对花括号把几个语句括起来,这样就构成了复合语句。复合语句内可以定义变量,但这些变量是局部变量。变量声明语句;/变量的作用范围(域)只在其 语句1;/所在的一对花括号内 语句2;,2.3语句与流程控制,5流程控制语句通常,Java程序中的语句是按顺序执行(从上到下)。Java中的控制语句控制程序执行的走向,包括分支(选择)语句、循环语句和转移语句等。本教材将介绍8种流程控制语句,见2.3节。,2.3语句与流程控制,6import语句和package语句 import语句如果用户程序要用到其他包中的类时,通常是在源文件的开始部分使用关键字import,后跟包名和句点隔开的类名导入它们,并以分号结尾,称为import语句:import 包名.类名;import 包名.*;package语句package 包名;即可把类放到包中,但上面的package语句必须是源文件的第一条语句。,2.3语句与流程控制,一、结构化程序设计中的三种控制结构 顺序结构 选择结构:单选择结构、双选择结构、多选择结构 循环结构,程序的3种基本结构,顺序结构、分支结构、循环结构,2.3语句与流程控制,if-else 选择语句,if-else 结构的语法为:,if(boolean表达式)语句1;else 语句2;,if(boolean表达式)语句组;else 语句组;,if和else块中只有一条语句,if和else块中有多条语句,if-else语句的执行流程,boolean表达式是任意一个返回布尔数据类型的表达式,而且必须是(比C或C+要严格)。与C或C+一样,每个单一语句后面都要有分号。为了增强程序的可读性,应将if或else后的语句用括起来。else子句是任选的,不能单独作为语句使用,它必须和if语句配对使用,并且总是与离它最近的if配对。,int i1=123;int i2=456;if(i1i2)System.out.println(“The bigger one is:”+i1);else System.out.println(“The bigger one is:”+i2);,补充说明:if-else选择语句,只有if 子语句,没有else子语句(单分支if-else语句)if(boolean表达式)语句序列1;,if-else 选择语句的变体情况,表达式,语句序列1,真,假,语句序列3,if-else 选择语句的变体情况,多个ifelse的嵌套(多分支if-else语句):if(boolean表达式1)语句序列1;else if(boolean表达式2)语句序列2;else 语句序列n;,多个ifelse的嵌套(多分支if-else语句),if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else语句4;,课堂练习,习题 2.17,2.3语句与流程控制,switch 选择语句(开关语句):,switch(表达式)case 常量值1:语句(组);break;case 常量值2:语句(组);break;case 常量值N:语句(组);break;default:语句(组);,表达式必须为byte,short,int,long或char类型,常量值必须是与表达式类型兼容的特定的一个常量不允许有重复的case值,2.3语句与流程控制,switch,表达式,语句1,语句2,语句n,语句n+1,.,常量值1,常量值2,常量值n,default,case,表达式expression的返回值类型必须是这几种类型之一:int、byte、char、long,short。case子句中的标号值value必须是常量,而且所有case子句中的常量值应是不同的。default子句是任选的。break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行。如果某个case分支后没有break语句,程序将不再做比较而执行下一个分支。switch语句的功能可以用if-else语句来实现,但某些情况下,使用switch语句更简炼。,2.3语句与流程控制,int a=100;int b=20;int c;char oper=+;switch(oper)case+:c=a b;break;case-:c=a-b;break;default:c=a*b;break;,举例:switch 选择语句(开关语句):,三、循环语句,while 循环 while(boolean表达式)循环语句组;do-while循环do 循环语句组;while(boolean表达式);for 循环 for(变量初始化;boolean表达式;递增变量的值)循环语句组;,/boolean表达式即为“循环条件”,/循环语句(组),也称为“循环体”,while语句,while(boolean表达式)循环语句;/boolean表达式即为,循环条件只要boolean表达式的值为非0(真),就重复执行while循环语句,直到表达式值为0(假)时止,do-while语句,do 循环语句;while(boolean表达式);首先执行语句,然后判断boolean表达式的值。如果表达式为0,结束while循环语句。否则,再次执行循环语句。语句会被至少执行一次,for语句,for(表达式1;表达式2;表达式3)循环语句;,循环变量初始化(通常对循环变量赋初值),循环控制条件(每次执行循环语句前需判断),改变循环变量的值(循环语句执行完一次后计算表达式3的值),(1)计算表达式1,计算表达式2。若表达式2的值为true(不满足结束条件),则执行循环语句,若表达式2的值为false,则结束循环;执行循环语句;(3)计算表达式3,再次判断表达式2的值.依此重复下去,直到表达式2的值为false。,注意 循环变量的使用,通过循环变量i 的值来控制循环次数。For循环的循环总次数是已知的。,for(i=1;i=100;i+)sum+=i;,for语句需要注意,变量初始化(表达式1)、循环条件(表达式2)以及改变变量值(表达式3)部分都可以为空语句(但分号不能省),三者均为空的时候,相当于一个无限循环。在初始化部分和迭代部分可以使用逗号语句,来进行多个操作。逗号语句是用逗号分隔的语句序列。for(int i=0,int j=10;ij;i+,j-),选择三种循环的一般原则,如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while这只是“一般”原则,不是“原则”,int n=1,sum=0;while(n=10)sum=sum+n;n+;,int n=10,sum=0;do sum+=n;n-;while(n0);,int sum=0;for(int i=1;i=10;i+)sum+=i;,while循环,do-while循环,for循环,三、循环语句举例,例题分析:素数问题,给定一个正整数n=91,判断它是不是素数。判断标准:素数只能被自身和1整除。例如,91%1=0,91%91=0.思路:将2至n-1之间的所有整数,同n进行求余操作,判断余数是否为0,如果发现任意一次为0,则n必然不是素数。循环语句。,程序结构,public class App3public static void main(String args)/定义变量、初始化/进行计算、处理/输出结果,public class PrimeNumpublic static void main(String args)int n=91;int x;/循环变量boolean s=true;for(x=2;x=n-1;x+)if(n%x=0)s=false;if(s)System.out.println(+n+是素数);else System.out.println(+n+非素数);,课堂练习1,数的阶乘问题对于任意一个正整数(=10),例如int n=8;求阶乘数n!,即 1x2x3x.x(n-1)xn,实验任务1,求所有的“水仙花数”“水仙花数”是一个三位数,其各位数字的立方和恰好等于该数本身。例如,153是水仙花数。,嵌套循环,While循环语句的嵌套;while()while(),for(;)while()do while();,例题循环的嵌套,在屏幕上打印如下的图案提示:尝试在屏幕上输出1行“*”,用循环实现使用System.out.print(“*”)输出一个字符*再连续的输出5行“*”?如何控制输出的*的个数及位置?,public class Triangle public static void main(String args)/i 为行的循环控制变量for(int i=1;i=5;i+)/先打印每行前的空格for(int j=1;j=10-i;j+)();/打印每行的*for(int j=1;j=2*i-1;j+)(*);();/换行,课堂练习3,将100元兑换成10元、5元和1元的硬币,要求:每种硬币至少有1个求不同的兑换方法,输出在屏幕上。,实验任务2,在屏幕上打印9x9乘法表,四、break 和 continue 语句,break 语句在循环中用于立即从当前循环终止控制。遇到 break 语句时,将跳出当前循环语句(while,dowhile,for)。continue 语句则是从当前执行位置跳至循环的开始处(重新开始下一次循环)。continue 语句之后的语句将不再执行。,阅读程序2.5,import;/引用类JOptionPanepublic class SimappApp7 public static void main(String args)String output=;for(int i=1;i=10;i+)output+=n 第+i+次循环开始;;if(i=2)continue;if(i=3)break;output+=n第+i+次循环结束!;output+=n结束整个程序的输出工作!;JOptionPane.showMessageDialog(null,output);System.exit(0);,四、break 和 continue 语句,带标号的break语句 在Java中,可以为每个语句块(组)加一个标号,一个代码块通常是用大括号 括起来的一段语句代码。加标号的格式为:BlockLabel:语句块;标号的命名规则,同标识符(字母、数字、下划线,$)break语句的第二种使用情况就是跳出它所指定的块,并从紧跟该块后的第一条语句处执行。break BlockLabel;使用在switch,for,while,dowhile循环语句中。,a:/标记代码块a b:/标记代码块b c:/标记代码块c break b;/这段语句将不执行/代码块c结束/这段语句也不执行/代码块b结束/从这段语句开始执行/代码块a结束,四、break 和 continue 语句,四、break 和 continue 语句,带标号的continue语句普通的continue语句只能结束其所在当前循环语句的一次执行。在嵌套循环结构中,带标号的continue语句能够结束标号所在的循环语句的一次执行(可能是最外层的循环语句)语法:continue BlockLable;,四、break 和 continue 语句,outer:for(int i=0;i10;i+)/外层循环 inner:for(int j=0;j10;j+)/内层循环 if(ij)continue outer;/内层循环结束/外层循环结束,实验任务3,针对之前的编写的判断素数的程序通过使用break或者continue语句,提高程序执行的效率(从减少循环次数的角度出发),本周作业,P50,习题4.(2),4.(6),2.4数组,在Java语言中,数组是一种最简单的引用数据类型,数组实际上是一组变量或对象实例,其类型是相同的。可以在程序中声明各种基本类型和引用类型的数组。与C和C+相似,Java语言数组在使用时须经过声明、创建、初始化三个步骤。,一、数组的声明、创建、初始化与释放数组的声明是定义数组变量标识符,并不为数组分配内存的存储空间。Java语言支持两种完全等价的声明格式:格式一:char s;Point p;格式二:char s;Point p;注意:Java语言在声明数组时不允许指定数组大小。,数组的创建是为数组的元素分配存储空间并进行自动初始化,创建数组使用“new”关键字,格式如下:char s;s=new char10;或者将声明和创建连在一起完成,如char s=new char10;数组的变量标识符是一个引用,数组的创建使得这个引用指向存储数组的内存的首地址。,除了自动初始化之外,还可以采用赋值初始化和静态初始化的方法。赋值初始化方法即通过执行语句为数组的元素赋值。s0=a;s1=b;静态初始化即是用大括号将数组元素的值一一列出的方式,即形如 char s=a,c,d,f;此时,可以省略数据的创建语句(需注意)。数组的释放不需要程序员显式地操作,不再使用的数组由系统作为垃圾自动处理。,数组元素的引用(访问),数组元素的引用方式为:arrayNameindex每个数组都有一个属性length指明它的长度,例如:arrayName.length指明数组arrayName的长度。index为数组下标,它可以为整型常数或表达式,下标从0开始,到length-1结束。,数组与循环的结合,输出数组的内容int a=1,2,3,4,i;for(i=0;ia.length;i+)System.out.println(ai);,编写程序,用起泡法对10个数排序(按由小到大顺序)。起泡法的思路是:将相邻两个数比较,将小的调到前头。见图5.2。然后进行第2趟比较,对余下的前面5个数按上法进行比较,见图5.3。图1 图2,可以推知,如果有n个数,则要进行n-1趟比较(和交换)。在第1趟中要进行n-1次两两比较,在第j趟中要进行n-j次两两比较。根据以上思路写出程序,今设n=10,本例定义数组长度为11,a0不用,只用a1a10,以符合人们的习惯。,实验任务4:,依据上述原理。编写程序对键盘输入的10个整数进行排序。,对数组名的理解:,内存中每个区域都有个地址。数组是在内存中开辟的一个连续区域。数组名则实际上存储的是该连续区域的首地址。下面的例子中定义了两个数组a和b,存储的实际上都是两个内存区域的首地址。,float b=new float5;,b,0 x785BA,b0,b4,float a=new float5;,a,0 x712334,a0,a4,对数组名的理解:,当执行一条 a=b;语句后。那么a实际上存储的就不是原来的地址而是b原来指向的地址 0 x785ba。那么此时a和b都指向了同一个内存区的地址。,float b=new float5;,b,0 x785BA,b0,b4,float a=new float5;,a,0 x712334,a0,a4,例子分析1,public class Example2_3 public static void main(String args)int a=100,200,300;int b=10,11,12,13,14,15,16;b=a;b0=123456;a0=500;(数组a:+a0+,+a1+,+a2);(数组b:+b0+,+b1+,+b2);(数组b的长度:+b.length);,在Java语言中没有多维数组,而是通过定义数组的数组实现多维数组,多维数组的声明、创建和初始化与一维数组相似,如int twoDim=new int4;即声明和创建了一个有4个元素的数组,每个元素都是一个数组。,二、多维数组(暂时不看),