本章学习流程控制语句,流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。控制语句分为三类:顺序、选择和循环。
上一章讲解的数据类型和运算符是编程中的“砖块”,是编程的基础。要想开始正式编程,还需要有“水泥”,把“砖块”粘到一起,最终形成“一座大厦”。这个“水泥”就是本章的控制语句。
“顺序结构”代表“先执行a,再执行b”的逻辑。比如,先找个女朋友,再给女朋友打电话;先订婚,再结婚;
“条件判断结构”代表“如果…,则…”的逻辑。比如,如果女朋友来电,则迅速接电话;如果看到红灯,则停车;
“循环结构”代表“如果…,则重复执行…”的逻辑。比如,如果没打通女朋友电话,则再继续打一次; 如果没找到喜欢的人,则再继续找。

顺序结构即按照书写顺序执行每一条语句,比较简单,不是我们的重点。本章研究的重点是“选择结构”和“循环结构”。
很神奇的是,三种流程控制语句就能表示所有的事情!不信,你可以试试拆分你遇到的各种事情。实际上,任何软件和程序,小到一个练习,大到一个操作系统,本质上都是由“变量、选择语句、循环语句”组成。
这三种基本逻辑结构是相互支撑的,它们共同构成了算法的基本结构,无论怎样复杂的逻辑结构,都可以通过它们来表达。上述两种结构组成的程序可以解决全部的问题,所以任何一种高级语言都具备上述两种结构。
因此,本章是大家真正跨入编程界的“门槛”,是成为“程序猿”的“门票”。
一、选择结构
在还没有知道Java选择结构的时候,我们编写的程序总是从程序入口开始,顺序执行每一条语句直到执行完最后一条语句结束,但是生活中经常需要进行条件判断,根据判断结果决定是否做一件事情,这就需要选择结构。
选择结构用于判断给定的条件,然后根据判断的结果来控制程序的流程。主要的条件判断结构有:if结构和switch结构。而if结构又可以分为if单分支结构、if-else双分支结构、if-else if-else多分支结构。
1.1 if单分支结构
语法结构:

if语句对布尔表达式进行一次判定,若判定为真,则执行{}中的语句块,否则跳过该语句块。流程图如图所示。

if单选择结构流程图
使用if语句实现掷*子骰**游戏

|
Math类的使用> java.lang包中的Math类提供了一些用于数学计算的方法。> Math.random()该方法用于产生0到1区间的double类型的随机数,但是不包括1。int i = (int) (6 * Math.random()); //产生:[0,5]之间的随机整数 |
|
新*雷手**区> 如果if语句不写{},则只能作用于后面的第一条语句。> 强烈建议,任何时候都写上{},即使里面只有一句话! |
1.2 if-else双分支结构
语法结构:

当布尔表达式为真时,执行语句块1,否则,执行语句块2。也就是else部分。流程图如图所示。


条件运算符有时候可用于代替简单的if-else语句。
1.3 if-else if-else多分支结构
语法结构:

当布尔表达式1为真时,执行语句块1;否则,判断布尔表达式2,当布尔表达式2为真时,执行语句块2;否则,继续判断布尔表达式3······;如果1~n个布尔表达式均判定为假时,则执行语句块n+1,也就是else部分。流程图如图所示。

if-else if-else多分支结构流程图
根据年龄判断人生阶段

if-else if-else多分支结构既可以实现区间判断的情况,也适用等值判断的情况。而下面讲解的switch语句仅适用等值判断的情况。
1.4 switch多分支结构
语法结构:

switch语句会根据表达式的值从相匹配的case标签处开始执行,一直执行到break语句处或者是switch语句的末尾。如果表达式的值与任一case值不匹配,则进入default语句(如果存在default语句的情况)。
根据表达式值的不同可以执行许多不同的操作。 switch语句中case标签在JDK1.5之前必须是整数(long类型除外)或者枚举,不能是字符串,在JDK1.7之后允许使用字符串(String)。
大家要注意,当布尔表达式是等值判断的情况,可以使用if-else if-else多分支结构或者switch结构,如果布尔表达式区间判断的情况,则只能使用if-else if-else多分支结构。
switch多分支结构的流程图如图所示。

switch多分支结构流程图
根据分数给出等级

模拟运算器

作业
1. Math.random()是返回[0,1)之间的随机浮点数,需要[10,15]之间的随机数,如何通过Math.random()获取。
2. 完成课堂上的“掷*子骰**”游戏。
3. 键盘输入一个圆的半径或者随机生成一个半径,计算出圆的面积、周长。比较面积和周长的数字,并打印出不同的提示。
4. 生成[0,120]随机的年龄,然后根据不同的年龄段输出相应的语句(参考课上代码)
5. 生成[0,100]之间的分数。如果90以上(含90)则输出“A”,如果80-89输出“B”,如果70-79输出“C”,60-69之间“D”,60以下是“E”。
二、循环结构
2.1循环的引入
问题1:输出Hello Java 1000次

问题2:计算1+2+3....+100的和

总结:什么时候使用循环
重复执行某个操作很多次,使用循环可以简化代码
2.2 while循环
语法结构:

在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而对于后来每一次额外的循环,都会在开始前重新计算一次。
语句中应有使循环趋向于结束的语句,否则会出现无限循环–––"死"循环。
while循环结构流程图如图所示。

while流程图

总结 1:一定要明白while循环的语法结构
循环条件:i <= 100
循环体:{sum += i; i++;}
循环变量:i 循环体中要有改变循环变量值的操作,否则会导致死循环
总结2:一定要明白while循环的执行过程
2.3 do-while循环
语法结构:
do-while循环结构会先执行循环体,然后再判断布尔表达式的值,若条件为真,执行循环体,当条件为假时结束循环。do-while循环的循环体至少执行一次。do-while循环结构流程图如图所示。

do-while流程图

总结1:while循环和do-while循环区别
- while循环先判断再循环,可能循环体一次也没有执行
- do-while循环先执行再判断,循环体至少执行一次
- 如果while循环第一次判断为真,两种循环无差别;两种循环效率上没有差别
总结2:do-while循环的适用场合:
do{
考试;
判卷;
}while(不及格);
如果使用while循环实现:
考试;
判卷;
while(不及格){
考试;
判卷;
}
2.4 for循环
语法结构:

for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化,即执行初始表达式;随后,对布尔表达式进行判定,若判定结果为true,则执行循环体,否则,终止循环;最后在每一次反复的时候,进行某种形式的“步进”,即执行迭代因子。
- 初始化部分设置循环变量的初值
- 条件判断部分为任意布尔表达式
- 迭代因子控制循环变量的增减
for循环在执行条件判定后,先执行的循环体部分,再执行步进。
for循环结构的流程图如图所示。

for循环流程图

总结1:一定要明白for循环的语法结构
for( 循环变量初始化; 循环条件 ; 改变循环变量的值){
循环体
}
总结2:三种循环结构到底使用哪一个
循环次数固定,建议使用for
循环次数不固定
先执行再判断,建议使用do-while
先判断再执行,使用while
实际开发,for使用频率高,然后是while,最后是do-while
总结3:循环内部定义变量
可以在for循环的表达式1中定义变量,变量的作用范围仅限于该for循环,可以减少变量在内存中存在的时间
总结4:for是三种循环中最灵活的
表达式1,表达式2,表达式3可以省略部分或者全部,但是;不可少,如果省略,也需要写到其他位置,这是结构的变化,语句没有减少。
总结5:使用效率最高的方式计算1+2+3+4....+100=?
方法1:(1+100)*100/2
方法2:0+1+2+3+4....+100=?
方法3:100*101/2=5050
注意:循环就是欺负计算机运算速度快,任劳任怨;循环只是减轻了程序员编码的负担,没有减轻机器的负担。
2.5 循环语句更多练习
练习1:输出1-1000之间能被5整除的数,且每行输出7个。
功能1:输出1-1000之间的数
功能2:输出1-1000之间能被5整除的数
功能3:输出1-1000之间能被5整除的数,且每行输出7个

练习2:给定一个10进制数,转换成二进制数并输出。
分析1:算法
1.给定一个十进制数,作为被除数
2.循环
被除数对2取余数,余数作为二进制位,商作为下一次运算的被除数,
被除数等于0吗
不等
被除数对2取余数,余数作为二进制位,商作为下一次运算的被除数,
被除数等于0吗
不等
被除数对2取余数,余数作为二进制位,商作为下一次运算的被除数,
被除数等于0吗
.....
等于0 结束
3. 余数倒着写得到二进制
分析2:循环的提取
1.不断重复的对2取余数,不断的重复对2整除 使用循环来实现
2.循环次数不固定 排除for循环
3.先操作在判断新的被除数是否为零,可以使用do-while循环
4.循环条件: 被除数等于0吗
5.循环体:被除数对2取余数,余数作为二进制位,商作为下一次运算的被除数
分析3:小技巧,如何实现二进制位逆向获取
result = mod+result ;

作业
1. 计算1-100之间所有数字的和,所有偶数的和,所有奇数的和。
2. 输出0-120之间的数字,打印出能被5整除的数字。
3. 输出0-130之间的数字,每行显示7个数字。
4. 使用循环实现十进制数到二进制数的转换
三、循环控制语句
3.1 break语句
在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。

本来是要循环100次的,结果当i=77的时候,sum>=3000,此时break,意味着这后续的23次不执行了,提前结束循环。
break语句可以出现在循环和switch语句中
return语句作用:结束当前方法,和循环没有关系;每个方法最后都会有一个return
3.2 continue
continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

本来是循环100次的,使用了continue还是循环100次;当i=1,2,3,4,因为i%5!=0,不执行循环体后续的语句;当i=5,因为i%5==0,执行循环体后续的语句
|
注意事项continue用在while,do-while中,continue 语句立刻跳到循环首部,越过了当前循环的其余部分。continue用在for循环中,跳到for循环的迭代因子部分。 |
3.3 循环控制语句更多练习
练习:请输入10个整数,或者输入 999 中止输入。判断其中正数的个数并输出,同时要求输出退出的状态(是10次退出,还是999退出)
迭代1:请输入10个整数,判断其中正数的个数并输出

迭代2:请输入10个整数,或者输入 999 中止输入,判断其中正数的个数并输出

迭代3:同时要求输出退出的状态(是10次退出,还是999退出)

作业
1. 1+2+3....+100,当和超过3000时退出循环
2. 使用continue实现输出1--100直接能被5整除的数
3. 请输入10个整数,或者输入 999 中止输入。判断其中正数的个数并输出,同时要求输出退出的状态(是10次退出,还是999退出)
四、多重循环
在一个循环语句内部再嵌套一个或多个循环,称为多重循环/嵌套循环。while、do-while与for循环可以任意嵌套,可以嵌套任意多层。一般工作中多见的就是两层。
4.1 多重循环
打印矩形

思路: 大循环:输出四行
循环体:
1.一行20个空格(小循环)
2.输出一行10个(小循环)
3.换行

总结:一定要明白多重循环的执行过程

打印平行四边形


打印三角形


打印菱形


百钱买百鸡:
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。

思路1:三重循环
设公鸡i只,母鸡j只,小鸡k值
条件1:百钱 5*i +3*j +k/3 = 100
条件2:百鸡 i+j+k = 100
条件3:小鸡数必须是3的倍数 k%3==0

思路2:二重循环
设公鸡i只,母鸡j只,小鸡100-i-j
循环执行了多少次 20*33*2

4.2 多重循环下的控制语句
功能:有5家衣服专卖店,每家最多购买3件。用户可以选择离开,可以买衣服。最后打印总共买了几件衣服
技能:
1.多重循环
外层循环 5家专卖店 内层循环 每家3件衣服
2.多重循环中使用break
每家(最多)购买3件
迭代1:有5家衣服专卖店,每家购买3件

迭代2:有5家衣服专卖店,每家最多购买3件

迭代3:最多5家衣服专卖店,每家最多购买3件

goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在Java语言中得到正式使用;Java没有goto语句。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子---带标签的break和continue。
“标签”是指后面跟一个冒号的标识符,例如:“label:”。对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
在 “goto有害”论中,最有问题的就是标签,而非goto, 随着标签在一个程序里数量的增多,产生错误的机会也越来越多。 但Java标签不会造成这方面的问题,因为它们的活动场所已被限死,不可通过特别的方式到处传递程序的控制权。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。

作业
1. 使用多重循环实现九九乘法表

2. 使用多重循环打印矩形、平行四边形、三角形、菱形几何图形
3. 使用多重循环实现百钱买百鸡
4. 使用多重循环实现有5家衣服专卖店,每家最多购买3件。用户可以选择离开,可以买衣服。最后打印总共买了几件衣服
五、方法
方法(method)就是一段用来完成特定功能的代码片段,类似于其它语言的函数(function)。
方法用于定义该类或该类的实例的行为特征和功能实现。 方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
方法的好处
- 复用代码,便于修改
- 直接调用方法,降低难度
5.1方法定义和调用
方法声明格式:

方法的调用方式:

方法的详细说明
- 形式参数:在方法声明时用于接收外界传入的数据。
- 实参:调用方法时实际传给方法的数据。
- 返回值:方法在执行完毕后返还给调用它的环境的数据。
- 返回值类型:事先约定的返回值的数据类型,如无返回值,必须指定为void。

方法调用的内存分配图

5.2 方法重载
方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。
|
新*雷手**区重载的方法,实际是完全不同的方法,只是名称相同而已! |
构成方法重载的条件:
- 不同的含义:形参类型、形参个数、形参顺序不同
- 只有返回值不同不构成方法的重载
如:int a(String str){}与 void a(String str){}不构成方法重载
- 只有形参的名称不同,不构成方法的重载
如:int a(String str){}与int a(String s){}不构成方法重载

我们见过的方法重载
System. out .println(12);
System. out .println("12");
System. out .println(true);
5.3 方法更多练习
练习:判断并输出1--100之间的素数
什么是素数(质数)
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数。
迭代1:判断一个数是否是素数

完善1:1不是素数
完善2:2是素数
完善3:i<num效率低下 i<=sqrt(num)
迭代2:判断1-100之间有多少个素数并输出所有素数
将判断一个数是否为素数的功能提取为一个方法。

作业
1. 练习方法的定义和调用
2. 练习方法的重载
3. 判断并输出1--100之间的素数
网盘资料:
链接:https://pan.baidu.com/s/1zxHsRTYsgdghNWJLYf5ogQ
提取码:bzbj
私信或留言可获取200G视频+源码+课件哦~