面向对象程序设计-Java(第四版)课件 第3章 程序流程控制_第1页
面向对象程序设计-Java(第四版)课件 第3章 程序流程控制_第2页
面向对象程序设计-Java(第四版)课件 第3章 程序流程控制_第3页
面向对象程序设计-Java(第四版)课件 第3章 程序流程控制_第4页
面向对象程序设计-Java(第四版)课件 第3章 程序流程控制_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

第3章程序流程控制

3.1选择结构程序设计3.2循环结构程序设计3.3break和continue语句

3.1选择结构程序设计

Java语言提供了两条基本的分支选择语句:

if语句和switch语句。

3.1.1if语句

if语句可构造双分支选择结构程序、单分支选择结构程序及多分支选择结构程序。

1.双分支选择结构

if(布尔表达式)

   语句区块1

else

   语句区块2falsetrue布尔表达式语句区块1语句区块2离开判断式,执行分支结构后面的语句进入判断式说明:

(1)“布尔表达式”为关系表达式或逻辑表达式

(2)“语句区块”是指一条语句或多条语句。当为多条语句时,一定要用一对花括号(“{”和“}”)将其括起,使之成为一条复合语句。否则,编译时会指出语法错误;当为一条语句时可以省去花括号。第三章程序位置

【示例程序C3_1.java】判断给出的一个成绩,输出“通过”或“不及格”。

publicclassC3_1

{  publicstaticvoidmain(String[ ]args)

{intgrade;

grade=86;//读者在调试时也可赋一个小于60的成绩试试看

if(grade>=60)

{

System.out.print(“通过,成绩是:”);

System.out.println(grade);

}

else

System.out.println(“不及格”);

}//main

}

运行结果:通过,成绩是:86请注意该程序的缩进格式。这种缩进格式虽然不是必须的,但由于它突出了程序的结构,大大提高了程序的清晰度和可读性,故国际上提倡和推荐这种程序书写风格。

【示例程序C3_2.java】比较两个数的大小。

public

classC3_2

{

public

static

voidmain(String[]args)

{

double

d1=43.4;

double

d2=85.3;

if(d1>=d2)System.out.println(d1+">="+d2);

elseSystem.out.println(d1+"<"+d2);

}

}

运行结果:43.4<85.3

2.省略了else子句的if语句(单分支结构)

在if语句中,可以省略else子句以形成单分支结构。

if(布尔表达式)

   语句区块1

【示例程序C3_3.java】判断给出的一个成绩,当成绩小于60时,输出“未通过”及具体成绩,其他情况时什么也不输出。

publicclassC3_3

{ publicstaticvoidmain(String[ ]args)

{

intgrade;

grade=56;//成绩

if(grade<60)

{System.out.print(“未通过,成绩是:”);

System.out.println(grade);

}//if

}mian

}

运行结果:未通过,成绩是:56

3. if语句的嵌套(多分支结构)

其形式如下:

if(布尔表达式1)语句区块1

elseif(布尔表达式2)语句区块2

elseif(布尔表达式3)语句区块3

else语句区块n+1falsefalsefalsefalsetruetruetruetrue布尔表达式1布尔表达式2布尔表达式3布尔表达式n语句区块1语句区块2语句区块3语句区块n语句区块n+1进入判断式离开判断式,执行分支语句后面的语句if嵌套结构的一种形式

【示例程序C3_4.java】使用if嵌套将百分制转换为5分制。

publicclassC3_4

{

publicstaticvoidmain(String[ ]args)

{

intgrade=76;

if(grade>=90)System.out.println(“成绩:优”);

elseif(grade>=80)System.out.println(“成绩:良”);

elseif(grade>=70)System.out.println(“成绩:中等”);

elseif(grade>=60)System.out.println(“成绩:及格”);

elseSystem.out.println(“成绩:不及格”);

}//main

}

运行结果:成绩:中等条件满足

4.使用if嵌套时的注意事项

(1) Java编译器将else与离它最近的if组合在一起,除非用花括号“{ }”才能指定不同的匹配方式。

【示例程序C3_5.java】当x和y都大于6时,输出“设备正常”的信息;而当x不大于6时,输出“设备出错”的信息。编程如下:

publicclassC3_5

{

publicstaticvoidmain(String[ ]args)

{

intx,y;x=3;y=14;

if(x>6)

if(y>6)

System.out.println(“设备正常”);

else

System.out.println(“设备出错”);

}

}

修改程序(错)

if(x>6)

{if(y>6)

System.out.println(“设备正常”);

}

else

System.out.println("设备出错");

修改程序(对)

if(x>6)

{if(y>6)

System.out.println(“设备正常”);

elseSystem.out.println("设备出错");

}

else

System.out.println("设备出错");

x>6设备出错y>6设备出错设备正常

(2)在嵌套的if语句中,同样要注意每个“语句区块”只能是“一个语句或一个复合语句”,当“语句区块”中包含多条语句时,必须用花括号将这些语句括起来,使其构成一条复合语句,否则会导致语法错误或输出错误。

if(x>6)if(x>6)

{if(y>6) if(y>6)

System.out.print("x="+x);{System.out.print("x="+x);

System.out.print("y="+y);System.out.print("y="+y);

}

}3.1.2switch语句

switch语句可清楚地处理多分支选择问题,根据表达式的值来执行多个操作中的一个,格式如下:

switch(表达式)

{case值1:语句区块1;break; //分支1

case值2:语句区块2;break; //分支2

……

case值n:语句区块n;break; //分支n

[default:语句区块n+1;] //分支n+1

}

…falsefalsefalsetruetruetruecase值1case值2语句区块1语句区块2语句区块ndefault语句区块n+1计算switch后的表达式case值nbreakbreakbreak…说明:

(1) switch后面表达式的类型可以是byte、char、short和int(不允许是浮点数类型和long型)。

(2) case后面的值1、值2、…、值n是与表达式类型相同的常量,但它们之间的值应各不相同,否则就会出现相互矛盾的情况。case后面的语句块可以不用花括号括起。

(3) default语句可以省去不要。

(4)当表达式的值与某个case后面的常量值相等时,就执行此case后面的语句块。

(5)若去掉break语句,则执行完第一个匹配case后的语句块后,会继续执行其余case后的语句块,而不管这些语句块前的case值是否匹配。【示例程序C3_6.java】判断成绩等级。

public

classC3_6{

public

static

voidmain(String[]args)

{

int

k;

int

grade=86;

k=grade/10;

switch(k){

case10:

case9:

System.out.println(“成绩:优”);break;

case8:

case7:

System.out.println(“成绩:良”);break;

case6:

System.out.println(“成绩:及格”);break;

default:System.out.println(“成绩:不及格”);

}

}}//运行结果:成绩:良

3.1.3条件运算符

对于一些简单的if/else语句,可用条件运算符来替代。例如,若有以下if语句:

if(x>y)m=x;

elsem=y;

则可用下面的条件运算符来替代:

m=(x>y)?x:y

其中,“?:”被称为条件运算符;“(x>y)?x:y”被称为条件表达式。条件表达式的语义是:若(x>y)条件为true,则表达式的值取x的值,否则表达式的值取y的值。条件表达式的一般形式为:

布尔表达式1?表达式2:表达式3在条件表达式中:

(1)表达式2和表达式3的类型必须相同。

(2)条件运算符的执行顺序是:先求解表达式1,若值为true则执行表达式2,此时表达式2的值将作为整个条件表达式的值;否则求解表达式3,此时表达式3的值将作为整个条件表达式的值。

在实际应用中,常常将条件运算符与赋值运算符结合起来,构成赋值表达式,以替代比较简单的if/else语句。条件运算符的优先级高于赋值运算符,因此,其结合方向为“自右至左”。

【示例程序C3_7.java】条件运算符的使用。

publicclassC3_7

{

publicstaticvoidmain(Stringargs[ ])

{intx,y,z,a,b;

a=1;

b=2;

x=(a>b)?a:b;

y=(a!=b)?a:b;

z=(a<b)?a:b;

System.out.print(“\tx=”+x);

System.out.print(“\ty=”+y);

System.out.println(“\tz=”+z);

}

}

运行结果:x=2y=1z=1

3.2循环结构程序设计

循环语句的作用是反复执行一段程序代码,直到满足终止条件为止。Java语言提供的循环语句有while语句、do-while语句和for语句。这些循环语句各有其特点,用户可根据不同的需要选择使用。

3.2.1while语句

while语句的一般格式为:

while(布尔表达式)

{

循环体语句区块

}falsetrue布尔表达式循环体语句区块【示例程序C3_8.java】打印数字1~5。

publicclassC3_8

{

publicstaticvoidmain(String[ ]args)

{intcounter=1;//循环变量及其初始值

while(counter<=4) //循环条件

{System.out.println(“counter=”+counter);

counter++;//循环变量增值

}//while

}//main

}运行结果:counter=1counter=2counter=3counter=43.2.2do-while语句

do-while语句的一般格式为:

do{

循环体语句区块

}while(布尔表达式)

do-while语句执行次序是:先执行一次循环体语句区块,然后再判断布尔表达式的值,若值为false,则跳出do-while循环,执行后面的语句;若值为true,则再次执行循环体语句区块。do-while循环语句与while循环语句的区别仅在于do-while循环中的循环体至少执行一次,而while循环中的循环体可能一次也不执行。falsetrue布尔表达式循环体语句区块

【示例程序C3_9.java】计算从1开始的连续n个自然数之和,当其和值刚好超过6时结束,求这个n值。

public

classC3_9

{

public

static

voidmain(String[]args)

{

int

n=0;

int

sum=0;//循环变量及其初始值

do{

n++;sum+=n;//循环变量增值

}while(sum<=4);//循环条件

System.out.println("sum="+sum);

System.out.println("n="+n);

}//main

}

运行结果:sum=6n=3

3.2.3for语句

for语句的一般格式为:

for(初值表达式;布尔表达式;循环过程表达式)

{

循环体程序语句区块

}其中:“初值表达式”对循环变量赋初值;“布尔表达式”用来判断循环是否继续进行;“循环过程表达式”完成修改循环变量、改变循环条件的任务。falsetrue布尔表达式循环体语句区块初值表达式循环过程表达式

(1)求解初值表达式。

(2)求解布尔表达式,若值为真,则执行循环体语句区块,然后再执行第(3)步;若值为假,则跳出循环语句。

(3)求解循环过程表达式,然后转去执行第(2)步。

【示例程序C3_10.java】求自然数1~6之间所有奇数之和。

publicclassC3_10

{publicstaticvoidmain(String[ ]args)

{intsum=0,odd;

for(odd=1;odd<=6;odd+=2){sum+=odd;}

System.out.println(“sum=”+sum+“odd=”+odd);

}

}

运行结果:sum=9odd=7

【示例程序C3_11.java】求解Fibonacci数列1,1,2,3,5,8,…的前8个数。

分析该数列可以得到构造该数列的递推关系是:publicclassC3_11

{publicstaticvoidmain(String[ ]args)

{

intf1=1,f2=1; // f1为奇位项;f2为偶位项

for(inti=1;i<10/2;i++)

{

System.out.print(“\t”+f1+“\t”+f2);//每次输出两项

if(i%2==0)System.out.println(“\n”);//每输出两次共4项后换行

f1=f1+f2;f2=f2+f1;//计算下一个奇位项及偶位项

}

}

}运行结果:

1 1 2 35 8 13 21【示例程序C3_12.java】编写求解n(即1+2+3+4 )的程序。publicclassC3_12{

publicstaticvoidmain(String[ ]args)

{inti=1;//初值表达式写在循环语句之前

intsum=0;

for(;;)//for头的三个构件全部省略

{sum+=i++;//循环过程表达式i++ 写在了循环体内

if(i>4)break;//布尔表达式写在了循环体内的if语句中

}

System.out.println("sum="+sum);

}}运行结果sum=103.2.4for语句头的变化与逗号运算符

【示例程序C3_13.java】在for循环的初值表达式中使用逗号运算符。

publicclassC3_13

{

publicstaticvoidmain(String[ ]args)

{inti,sum;

for(i=1,sum=0;i<=4;i++)//初值表达式中使用了逗号运算符

sum+=i;

System.out.println(“sum=”+sum);

}

}

运行结果:sum=10

【示例程序C3_14.java】在“初值表达式”和“循环过程表达式”中都使用了逗号运算符,且省略了“布尔表达式”的情况。

publicclassC3_14

{publicstaticvoidmain(String[ ]args)

{inti,sum;

//for循环中省略了布尔表达式,其余位置使用了逗号运算符

for(i=1,sum=0;;i++,sum+=i)

if(i>3)break;

System.out.println("sum="+sum);

}

}

运行结果:sum=93.2.5循环语句比较

(1)知道执行次数的循环,使用for循环编写。

(2)不知道确切执行次数的循环,使用do-while循环(至少执行一次的循环)或使用while循环(可能一次都不执行的循环)。

3.2.6循环控制要点

循环控制主要有两种办法,一种是用计数器控制循环,另一种是用标记控制循环。设计计数器控制循环的程序,需把握几个要点:

(1)循环控制变量(或循环计数器)的名字,即循环变量名。

(2)循环控制变量的初始值。

(3)每执行一次循环,循环控制变量的增量(或减量)。

(4)测试循环控制变量的终值条件(即是否继续进行循环)。用三种不同的循环语句编写的程序都具有上述四个方面的内容,其中以for语句最为典型,它把所有这些构件都放在了for语句头中,

【示例程序C3_15.java】设有李、王、张三人竞选领导,由群众投票表决,试设计一个统计选票的程序。

packagech3;

importjava.util.Scanner;

public

classC3_15

{@SuppressWarnings("resource")

public

static

voidmain(String[]args)

{//Scanner类是一个简单的文本扫描器类,可以从键盘读入数据

Scannersc=newScanner(System.in);//创建Scanner类对象sc

int

Ltotal=0,Wtotal=0,Ztotal=0;

char

name;

Stringc1;

System.out.print("enterletterLorWorZname,#toend:");

c1=sc.next();//从键盘上读取一个字符串赋给c1

name=c1.charAt(0);//charAt(0)是从一个字符串中截取第0个字符的方法

name=c1.charAt(0);//charAt(0)是从一个字符串中截取第0个字符的方法

while(name!='#')

{

switch(name)

{

case

'L':

case

'l'://李的得票,列出两个case分别处理大、小写字母

Ltotal=Ltotal+1;break;

case

'W':

case

'w'://王的得票

Wtotal=Wtotal+1;break;

case

'Z':

case

'z'://张的得票

Ztotal=Ztotal+1;break;

}

//switch语句结束

System.out.print("enterletterLorWorZname,#toend:");

c1=sc.next();name=c1.charAt(0);

}//while循环结束

System.out.println("Ltotal="+Ltotal);

System.out.println("Wtotal="+Wtotal);

System.out.println("Ztotal="+Ztotal);

}

}

使用Scanner类的步骤:

导入系统包中的类。importjava.util.Scanner;

创建Scanner类的对象。例如:Scanner

sc=newScanner(System.in);

调用Scanner类提供的方法。例如:c1=sc.next();

sc.next():表示遇到第一个有效字符(非空格,非换行符)时开始扫描,当遇到第一个分隔符或结束符(空格或换行符)时结束扫描,获取扫描到的内容,即获得第一个扫描到的不含空格,换行符的单个字符串。3.2.7循环嵌套

循环嵌套是指在循环体内包含有循环语句的情形。Java语言提供的三种循环结构可以自身嵌套,也可以相互嵌套。注意:无论哪种嵌套关系都必须保证每一个循环结构的完整性,不能出现交叉。下面几种循环嵌套都是合法的形式。(1)while( )//外循环开始{……while( )//内循环开始{……}//内循环结束}//外循环结束(2)for(;;)//外循环开始{……for(;;)//内循环开始{……}//内循环结束}//外循环结束(3)do//外循环开始(4)for(;;)//外循环开始{……{……do//内循环开始while( )//内循环开始{……{……}//内循环结束}while( );//内循环结束……}while( );//外循环结束}//外循环结束(5)while( )(6)do{……{do……{for(;;)……{……}}while( );

……}}while( );

【示例程序C3_16.java】编程打印三角形数字图案。

publicclassC3_16

{public

static

voidmain(String[]args){

for(int

i=1;i<=10;i++)//外层for循环

{

for(int

j=1;j<=11-i;j++)//内嵌for循环

System.out.print(“*”);//内嵌for循环的循环体

for(int

j=1;j<=i;j++)//并列的内嵌for循环

{

if(i>=10)System.out.print(+i+“*”);

elseSystem.out.print(+i+“**”);

}

//并列的内嵌for循环结束

System.out.println(“”);

}

}

}运行结果:

【示例程序C3_17.java】编写求解(即1! + 2! + 3! )的程序。publicclassC3_17{publicstaticvoidmain(String[ ]args)

{intn=1,m,s,k=0;while(n<=3)

{for(s=1,m=1;m<=n;m++)s=s*m;//计算n!,结果存于s中

k=k+s;//计算前n项阶乘之和,结果存于k中

System.out.println(n+"!="+s+"k="+k);n++;

}//while

}//main}运行结果:

1!=1k=1

2!=2k=3

3!=6k=9

3.3break和continue语句

Java语言提供了4种转移语句:break、continue、return和throw。转移语句的功能是改变程序的执行流程。

3.3.1break语句

break语句通常有不带标号和带标号两种形式:

break;

breaklab;

其中:break是关键字,lab是用户定义的标号。

(2) break语句用在单层循环结构的循环体中,其作用是强制退出循环结构。若程序中有内外两重循环,而break语句写在内循环中,则执行break语句只能退出内循环,而不能退出外循环。若想要退出外循环,可使用带标号的break语句。

break语句的应用有下列三种情况:

(1) break语句用在switch语句中,其作用是强制退出switch结构,执行switch结构后的语句。(3) breaklab语句用在循环语句中(必须在外循环入口语句的前方写上lab标号),可使程序流程退出标号所指明的外循环。break语句在双循环中的执行流程

将上述伪代码写成Java程序如下:

publicclassC3_18

{  publicstaticvoidmain(String[ ]args)

{intn=0,m,j,i;

for(i=3;i<=26;i+=2)//外层循环

{m=(int)Math.sqrt((double)i);

for(j=2;j<=m;j++)//内嵌循环

if((i%j)==0)break;//内嵌循环结束

if(j>=m+1)

{

if(n%6==0)System.out.println(“\n”);

System.out.print(i+“”);n++;

}

}

}

}运行结果:

357111317

1923

【示例程序C3_19.java】求自然数1~26间的素数。

解此题可改写示例程序C3_18.java,外循环控制仍是1~26,但当外循环执行到第19次时,在内循环中利用带标号的break语句使其终止。

publicclassC3_19

{ publicstaticvoidma

温馨提示

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

评论

0/150

提交评论