JAVA第四章:流程控制


       做任何事情都要遵循一定的原则。例如,到图书馆去借书,就必须要有借书证,并且借书证不能过期,这两个条件缺一不可。程序设计也是如此,需要有流程控制语句实现与用户的交流,并根据用
户的输入决定程序要“做什么”“怎么做”等。
       流程控制对于任何一门编程语言来说都是至关重要的,它提供了控制程序步骤的基本手段。如果
没有流程控制语句,整个程序将按照线性的顺序来执行,不能根据用户的输入决定执行的序列。
       本章的知识架构及重难点如下图:

4.1复合语句

与C语言及其他语言相同,Java 语言的复合语句是以整个块区为单位的语句,所以又称块语句,复合语句由开括号“{”开始,闭括号“}”结束。
       在前面的学习中我们已经接触到了这种复合语句。例如,在定义一个类或方法时,类体就是以“{”与“}”作为开始与结束的标记,方法体同样也是以“{”与“}”作为标记。复合语句中的每个语句都是从上到下被执行。复合语句以整个块为单位,能够用在任何一个单独语句可以使用的地方,并且在复合语句中还可以嵌套复合语句。

例如,下面这段代码,在主方法中定义了复合语句块,复合语句块中还可以包括另一个复合语句块。

fb82dfc3333047ec850b58e06d8565ab.jpg

     在使用复合语句时要注意,复合语句为局部变量创建了一个作用域,该作用域为程序的一部分,在该作用域中某个变量被创建并能够被使用。如果在某个变量的作用域外使用该变量,则会发生错误。例如,在上述代码中,如果在复合语句外使用变量y、Z、b将会出现错误,而变量x可在整个方法体中使用。

4.2条件语句

       条件语句可根据不同的条件执行不同的语句。条件语句包括计条件语句与 awitch 多分支语句。

4.2.1 if条件语句

        if 条件语句是一个重要的编程语句,用于告诉程序在某个条件成立的情况下执行某段语句,而在另一种情况下执行另外的语句。

       使用if条件语句,可选择是否要执行紧跟在条件之后的那个语句。关键字 if之后是作为条件的“布尔表达式”。如果该表达式返回的结果为 true,则执行其后的语句;如果为 fialse,则不执行 if条件之后的语句。if 条件语句可分为简单的 if条件语句、if..else 语句和 if..else if多分支语句。

1.简单的 if 条件语句

语法如下:

if(布尔表达式){

       语句序列

}

  • 布尔表达式:必要参数,表示最后返回的结果必须是一个布尔值。它可以是一个单纯的布尔变量或常量,也可以是使用关系或布尔运算符的表达式。
  • 语句序列:可选参数。可以是一条或多条语句,当表达式的值为 true 时执行这些语句。若语句 句序列中仅有一条语句,则可以省略条件语句中的“{ }”。

如果语句序列中只有一条语句,可以采用以下写法:

int a = 100;

if (a== 100)

System.out.print("a的值是 100%);

简单的 if 条件语句的执行过程如图 4.1 所示。
 
【例 4.1】判断手机号码是否存在(实例位置:资源包\TM\sI\4\1)
       创建 TakePhone 类,模拟拨打电话场景,如果电话号码不是 84972266,则提示拨打的号码不存在。
ac8035cffb8b4df2ae5ba576018d06a6.png

 流程图:

f4418dec5b9a40e7bbcd5c186751f49d.png

 

2.if...else 语句
        if...else 语句是条件语句中最常用的一种形式,它会针对某种条件有选择地做出处理。通常表现为"如果满足某种条件,就进行某种处理,否则就进行另一种处理"。语法如下:
if(条件表达式){
      语句序列1
}else{
     语句序列2
}
 
       if 后面“()”内的表达式的值必须是 boolean 型的。如果表达式的值为 true,则执行紧跟 if语句的复合语句;如果表达式的值为 false,则执行 else 后面的复合语句。if...else 语句的执行过程如图 4.2 所示。

      同简单的 if条件语句一样,如果if..else 语句的语句序列中只有一条语句(不包括注释),则可以省略该语句序列外面的“{ }”。有时为了编程的需要,else 或if后面的“{ }”中可以没有语句。


【例 4.2】使用 if...else 语句校验密码(实例位置:资源包\TM\sI\4\2)
       在项目中创建 Login 类,在主方法中定义变量,并通过使用 if..else 语句判断变量的值来决定输出结果。

b64d28b73dcd4166ad89b49f19451a96.png

 流程图:6c71547f1244482f95bb134efecff95b.png

 

3. if...else if 多分支语句
       if..else if 多分支语句用于针对某一事件的多种情况进行处理。通常表现为“如果满足某种条件,进行某种处理,否则如果满足另一种条件则执行另一种处理”。语法如下:


if(条件表达式 1){
       语句序列 1
} else if(条件表达式 2X){
        语句序列2
}
...
else if(条件表达式 n){
语句序列n
}

      同简单的 if条件语句一样,如果if..else 语句的语句序列中只有一条语句(不包括注释),则可以省略该语句序列外面的“{ }”。有时为了编程的需要,else 或if后面的“{ }”中可以没有语句。
【例 4.2】使用 if...else 语句校验密码(实例位置:资源包\TM\sI\4\2)
       在项目中创建 Login 类,在主方法中定义变量,并通过使用 if..else 语句判断变量的值来决定输出结果。

ffefa154f13e4b8c8562ef8d64037323.png

流程图:

b6e9b235597042cf8350b1884e16d443.png

 

3.if...else if 多分支语句
       if..else if 多分支语句用于针对某一事件的多种情况进行处理。通常表现为“如果满足某种条件,进行某种处理,否则如果满足另一种条件则执行另一种处理”。语法如下:


if(条件表达式 1){
       语句序列 1
} else if(条件表达式 2X){
        语句序列2
}
...
else if(条件表达式 n){
语句序列n
}

 

  • 条件表达式 1~条件表达式 n:必要参数。可以由多个表达式组成,但最后返回的结果一定要为boolean 类型。
  • 语句序列:可以是一条或多条语句,当条件表达式 1 的值为 true 时,执行语句序列 1;当条件表达式 2 的值为 true 时,执行语句序列 2,以此类推。当省略任意一组语句序列时,可以保留其外面"{ }",也可以将"{ }"替换";"。

if....else if多分支语句的执行过程如图4.3所示。

【例4.3】使用 if..else if语句实现饭店座位分配(实例位置:资源包\TM\sl\4\3)

       创建Restaunant类,声明整型变量 count 表示用餐人数,根据人数安排客人到 4 人桌、8 人桌或包厢用餐。

4c12dbdda34740db9aae0595ff3eb06d.png

 流程图:

c378b9493253445d876be38ce4f2d054.png

 

4.2.2 switch 多分支语句

在编程中,一个常见的问题就是检测一个变量是否符合某个条件,如果不符合,再用另一个值来检测,以此类推。当然,这种问题使用if条件语句也可以完成。

       例如,使用订语句对考试成绩进行评估,关键代码如下:

if(grade ==' A'{

System.out.println("真棒”);

}

if(grade =='B'{

System.out,println("做得不错”);

}

       这个程序显得比较笨重,程序员需要测试不同的值来给出输出语句。在 Java 中,可以用 switch 语句将动作组织起来,以一个较简单明了的方式来实现“多选一”的选择。语法如下:

switch(表达式){
case 常量值 1:
        语句块 1
[break;]
....
case 常量值 n:
        语句块 n
[break;]
defauit:
        语句块 n+1;
[break;]
}

       switch 语句中表达式的值必须是整型、字符型、字符串类型或枚举类型,常量值 1~n 的数据类型必须与表达式的值的类型相同。
       switch 语句首先计算表达式的值,如果表达式的计算结果和某个 case 后面的常量值相同,则执行该 case 语句后的若千个语句直到遇到 break 语句为止。此时,如果该 case 语句中没有 break 语句,将继续执行后面 case 中的若干个语句,直到遇到 break 语句为止。若没有一个常量的值与表达式的值相同,则执行 default 后面的语句。default 语句为可选的,如果它不存在,且 switch 语句中表达式的值不与任何case 的常量值相同,switch 语句则不做任何处理。

【例 4.4】使用 switch 语句为考试分数分级(实例位置:资源包\TM\sl\4\4)

       创建 Grade 类,使用 Scanner 类在控制台输入分数,然后用 switch 多分支语句判断输入的分数属于哪类成绩。10 分和 9分属于优,8 分属于良,7分和16分属子中,5分、4分、3分、2分、1分以及0分均属于差。

9fd0a316d86b40edadead2a3c920ef30.png

 流程图:

c2fe6b9ca6c34f3995a234c1eb4455a1.png

 


4.3循环语句
       循环语句就是在满足一定条件的情况下反复执行某一个操作的语句。Java 中提供了 3 种常用的循环语句,分别是 while 循环语句、do.. while 循环语句和 for循环语句。


4.3.1 while 循环语句
       while 语句也称条件判断语句,它的循环方式为利用一个条件来控制是否要继续反复执行这个语
句。语法如下:


while (条件表达式){
        语句序列
}


        当条件表达式的返回值为真时,则执行“{}”中的语句,当执行完“{}”中的语句后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。while 循环语句的执行过程如图4.9所示。

【例 4.5】计算 1~1000 的相加结果(实例位置:资源包\TM\sl\4\5)
       创建 GetSum 类,在主方法中通过 while 循环计算 1~1000 相加的和并输出。

63e4d0ca43f24507803d520c96655c2c.png

 流程图:

ccf636442be643d98faacbd2930cece4.png

 

4.3.2 do... while 循环语句

       do...while 循环语句与 while 循环语句类似,它们之间的区别是 while 语句为先判断条件是否成立再执行循环体,而 do...while 循环语句则先执行一次循环后,再判断条件是否成立。也就是说,do....while循环语句“{}”中的程序段至少要被执行一次。语法如下:

do{

       语句序列

}while (条件表达式);

       do...while 语句与 while 语句的一个明显区别是,do.while 语句在结尾处多了一个分号。根据do...while 循环语句的语法特点总结出do...while循环语句的执行过程如图4.10所示。

 

【例 4.6】使用 do..while语句进行用户登录验证(实例位置:资源包\TM\sI\4\6)

       创建 LoginService 类,首先提示用户输入 6 位密码,然后使用 Scanner扫描器类获取用户输入的密码,最后进入 do..wyhile 循环进行判断,如果用户输入的密码不是“931567”,则让用户反复输入,直到输入正确密码为止。

1a3a78b047f14fe68e58e0684b55f88d.png

 流程图:

9d323a9fa0374730b9ad2db9c2083f64.png

 

4.3.3 for循环语句

       for循环是Java 程序设计中最有用的循环语句之一。一个for循环可以用来重复执行某条语句,直到某个条件得到满足。for循环有两种语句,一种是传统的 for 语句,一种是foreach 语句,下面分别介绍这两种语句的使用方法。

 

1. for 语句

      传统的 for 语句中有 3 个表达式,其语法如下:

for(表达式 1;表达式 2;表达式 3){

语句序列

}

  • 表达式 1:初始化表达式,负责完成变量的初始化。
  • 表达式 2:循环条件表达式,值为 boolean 型的表达式,指定循环条件。等同于 whilc 循环里的表达式。
  • 表达式 3:每次循环结束后执行的语句,通常用来改变循环条件。

for循环语句的执行过程如图 4.12 所示。

       在执行 for 循环时,首先执行表达式 1,完成某一变量的初始化工作;下一步判断表达式 2 的值,若表达式 2 的值为 true,则进入循环体;在执行完循环体后紧接着计算表达式 3,这部分通常是增加或减少循环控制变量的一个表达式。这样一轮循环就结束了。第二轮循环从计算表达式 2 开始,若表达式 2 返回 true,则继续循环,否则跳出整个for 语句。

【例4.7】使用 for 循环计算 2~100 所有偶数之和(实例位置:资源包\TM\sl\4\7)

       创建 Ciceulate 类,编写程序,使用 for 循环语句计算 2~100 所有偶数的和并输出。

b3b2e6047eb54b47907066e10fae07c1.png

 流程图:

4a8e07f79fe341e989e0198f62bfe047.png

 

2.foreach 语句

       foreach 语句是 for 语句的特殊简化版本,不能完全取代 for 语句,但任何foreach 语句都可以改写为 for 语句版本。foreach 并不是一个关键字,习惯上将这种特殊的 for 语句格式称为 foreach 语句。foreach语句在遍历数组等方面为程序员提供了很大的方便。语法如下:

for(元素类型 ×:遍历对象 obj){

引用了x 的java 语句;

}

       foreach 语句中的元素变量 x,不必对其进行初始化。下面通过简单的例子来介绍 foreach 语句是如何遍历一维数组的。

【例 4.8】使用 foreach 语句遍历整型数组(实例位置:资源包\TM\sI\4\8)

       创建类 Repetition,在主方法中定义一维数组,并用 foreach 语句遍历该数组。

886f2032b53345d19fe30d7332af2817.png

 流程图:

b263ab14f35847d5ab35f2a24cbf1237.png

 4.4 循环控制
       循环控制包含两方面的内容,一方面是控制循环变量的变化方式,另一方面是控制循环的跳转。控制循环的跳转需要用到 break 和 continue 两个关键字,这两条跳转语句的跳转效果不同,break 语句是中断循环,continue 语句是执行下一次循环。

4.4.1 break 语句
       使用 break 语句可以跳出 switch 结构。在循环结构中,同样也可用 break 语句跳出当前循环体,从而中断当前循环。
在 3 种循环语句中使用 break 语句的形式如图 4.13 所示。
【例 4.9】输出 1~20 出现的第一个偶数(实例位置:资源包\TM\sI\4\9)
       创建 BreakTest 类,循环输出 1~20 的偶数值,在遇到第一个偶数时,使用 break 语句结束循环。

a3b29254bd8d4a6cb3ed1bcbdd9a2dd5.png

 流程图:

d619a4ee97e0428c82ad2367c236b046.png

        如果想让 break 跳出外层循环,Java 提供了“标签”的功能,语法如下:

标签名:循环体{

break标签名;

}

  • 标签名:任意标识符。
  • 循环体:任意循环语句。
  • break 标签名:break 跳出指定的循环体,此循环体的标签名必须与 break 的标签名一致。

      带有标签的 break 可以指定跳出的循环,这个循环可以是内层循环,也可以是外层循环。

【例 4.10】使用标签让 break 结束外层循环(实例位置:资源包\TM\sI\4\10)

       创建 BreakinsideNested 类,在该类中写两层 for 循环,第一层 for 语句循坏 3 次,第二层for语句循环 5 次。当第二层 for 语句循环至第 4 次时,强行用 break 中断循环。输出程序执行时外层循环和内层循环各循环了多少次。

f3c29c06f13c469fa6242a2d2e6e9ada.png

从这个运行结果可以看出:

循环中的评语句判断;如果j等于 4时,执行 bveak 语句,则中断了内层的循环,输出的j值最大到 3 为止。

外层的循环没有受任何影响,输出的 i值最大为3,正是 for 循环设定的最大值。

        现在改一下这段代码,给外层循环添加一个名为 Loop 的标签,让内层循环结束 Loop,再查看运行结果。

2004e32a99ca409fa5d1b9aa58d7bbda.png

 流程图:

2a304986ba964a2fb75fce664397a4d0.png

 4.4.2 continue 语句
       continue 语句是针对 break 语句的补充。continue 不是立即跳出循环体,而是跳过本次循环,回到循环的条件测试部分,重新开始执行循环。在 for 循环语句中遇到 continue 后,首先执行循环的增量部分,然后进行条件测试。在 while 和 do...while 循环中,continue 语句使控制直接回到条件测试部分。
       在 3 种循环语句中,使用 continuc 语句的形式如图 4.14 所示。


【例 4.11】输出 1~20 的奇数(实例位置:资源包\TM\sI\4\11)
       创建 ContinueTest类,编写一个 for 循环从1循环至20,如果当前循环的次数为偶数,则使用continue语句跳过循环。

2581597932ed4694b09401eeee482cba.png

 流程图:

901cb9f53b8f496898a7c8c23e1c105b.png

 与 break 语句一样,continue 也支持标签功能,语法如下:

标签名:循环体(

continue标签名;

}

  • 标签名:任意标识符。
  • 循环体:任意循环语句。
  • continue 标签名:continue 跳出指定的循环体,此循环体的标签名必须与 continue 的标签名一致。

 

for循环内部嵌套一个while循环

4dac7ffdeca34a4ca99addce2f42fabb.jpg

 流程图:

 

f53b3c050d9149609b89942afa8dbbd6.png 

 do   while循环里面嵌套一个for循环

9fcc7219c22c474a908e209b53dd0466.jpg

流程图: 

ddcd73b6219f4776bb5816e6268e5fc2.png

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值