目录
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
程序流程控概述
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
- 顺序结构
- 分支结构
- 循环结构
顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
分支结构
根据条件选择要执行的某段代码,有if-else和switch-case
if-else使用说明
- 条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量;
- 语句块只有一条执行语句时,一对{}可以省略,但建议保留;
- if-else语句结构,根据需要可以嵌套使用;
- 当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略;
- 当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓当多个条件是“包含”关系时,“小上大下/ 子上父下”。例如判断成绩来分等级时,如果布尔表达式是用大于号时,那么条件也要从大到小往下面写,如果布尔表达式是小于号时,条件由小到大往下写,下面RunningOrder1会演示
package javase4;
public class RunningOrder1 {
/*
分支结构中的if-else(条件判断结构)
一、三种结构
第一种:
if(条件表达式){
执行表达式
}
第二种:
if(条件表达式){
执行表达式1
}else{
执行表达式2
}
第三种:
if(条件表达式){
执行表达式1
}else if{
执行表达式2
}else if(条件表达式){
执行表达式3
}
...
else{
执行表达式n
}
*/
public static void main(String[] args) {
//if、if-else、if-else if
int heartBeats = 75;
if(heartBeats==75) System.out.println("心跳为75");//执行该代码
if(heartBeats < 60 || heartBeats >100){
System.out.println("心跳不正常");//执行该代码
}else{
System.out.println("心跳正常");
}
if(heartBeats>100){
System.out.println("心跳过快");
}else if(heartBeats>=60){
System.out.println("心跳正常");//执行该代码
}else{
System.out.println("心动过缓");
}
}
}
switch-case使用说明
-
switch结构中的表达式,只能是如下的六种数据类型之一:
byte
、short
、char
、int
、枚举类型
(JDK5.0)、String类型
(JDK7.0) -
不能是:long,float,double,boolean。
package javase4;
public class RunningOrder2 {
/*
分支结构之二:switch-case
1.格式
switch(表达式){
case 常量1:
执行语句1;
//break;
case 常量2:
执行语句2;
//break;
...
default:
执行语句n:
//break;
}
2.说明:
① 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,进入相应case结构中,执行相关语句。
当调用完执行语句后,则仍然继续向下执行其他case语句,直到遇到break关键字或末尾结束为止。
② break, 可以使用switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构。
③ switch结构中的表达式,只能是如下的六种数据类型之一:byte、short、char、int、枚举类型(JDK5.0)、String类型(JDK7.0)
④ case 之后之能声明常量。不能声明范围。
⑤ break关键字是可选的,根据业务需求设置
⑥ default:相当于if-else结构中的else。
default 结构是可选的,而且位置是灵活的。
*/
public static void main(String[] args) {
String name = "小明";
switch(name){
case "小明":
System.out.println(name+"被选中了");
break;
case "小李":
System.out.println(name+"被选中了");
break;
case "小张":
case "小黑"://case这里可以用多个!!!!
System.out.println(name+"被选中了");
break;
default:
System.out.println("没人吧,没人就默认小红被选中");
break;//这个break可写可不写,因为已经到了switch分支结构函数最后一行了
}
/*编译异常情况,只能使用'char, byte, short, int, Character, Byte, Short, Integer, String, or an enum'*/
boolean isHandSome = true;
switch(isHandSome){//编译异常,java: 不兼容的类型: boolean无法转换为int
case true:
System.out.println("可乐吗??");
break;
default:
System.out.println("输入有误!!!");
}
double d1 = 0.1;
switch(d1){//编译异常,java: 不兼容的类型: 从double转换到int可能会有损失
case 0.1:
System.out.println("可乐吗??");
break;
default:
System.out.println("输入有误!!!");
}
/*编译异常,需要与表达式相同的类型并且是常量,而不是boolean类型和变量!!*/
int age = 10;
switch(age){
case age > 18://编译异常,java: 不兼容的类型: boolean无法转换为int
System.out.println("成年了");
break;
default:
System.out.println("未成年");
}
}
}
用户输入值到控制台被程序获取Scanner
package javase4;
import java.util.Scanner;
public class ScannnerTest {
/*
如何从键盘获取不同类型的变量,需要使用Scanner类
具体步骤:
1.导包:import java.util.Scanner;
2.Scanner的实例化;
3.调用Scanner类的相关方法,来获取指定的变量。
*/
public static void main(String[] args) {
//Scanner类实例化对象
Scanner scanner = new Scanner(System.in);
//请求控制台输入你的年龄
System.out.println("请输入你的年龄");
int age = scanner.nextInt();
//请求控制台输入你的名字
System.out.println("请输入你的名字");
String name =scanner.next();
//请求控制台输入你的体重,以kg为单位
System.out.println("请输入你的体重,单位为kg");
Double weight = scanner.nextDouble();
//请求控制台输入你的婚姻状况
System.out.println("是否已婚,输入true或者false");
boolean getMarried = scanner.nextBoolean();
System.out.println("你叫"+name+",今年都"+age+"岁了.体重是"+weight+"kg,婚姻状况"+getMarried);
//Scanner类没有提供char类型的next方法,可以通过下标方式获取,后面学习数组和String时会接触到
System.out.println("请输入一个字符");
String getChar = scanner.next();
char c1 = getChar.charAt(0);
System.out.println("char的值为:"+c1);
}
}
循环结构
- 根据循环条件重复执行代码,有while、do-while、for这三种循环语句。并且在jdk1.5以后提供了foreach方便遍历集合和数组元素
- 在某些条件满足的情况下,反复执行特定代码的功能
- 循环语句分类
- for 循环
- while 循环
- do-while 循环
for循环
语法格式
for(⑴初始化部分;⑵循环条件部分;⑷迭代部分){
⑶循环体部分;
}
执行过程:⑴-⑵-⑶-⑷-⑵-⑶-⑷-⑵-⑶-⑷-......-⑵,参考下图
说明:
②循环条件部分为boolean类型表达式,当值为false时,退出循环
①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔,例如int a=1,b=2;
④可以有多个变量更新,用逗号分隔,例如a++,b++
package javase4;
public class RunningOrder3 {
/*
For循环结构的使用
一、循环结构的四个要素
① 初始化条件
② 循环条件
③ 循环体
④ 迭代条件
二、for循环的结构
for(①;②;④){
③
}
*/
public static void main(String[] args) {
//循环体执行五次,通过初始值和循环条件判断
for (int i = 0; i < 5; i++) {
System.out.println("打印了"+(i+1)+"次");//打印五次语句
}
//测试for循环执行顺序,一共循环3次
int num = 1;
for(System.out.print('a');num <= 3;System.out.print('c'),num++){
System.out.print('b');//abcbcbc
}
System.out.println();
/*拓展练习*/
//获取[0~100]的偶数和
int sum1 = 0;
for (int i = 0; i <=100 ; i++) {
if (i%2==0)sum1+=i;
}
System.out.println("0~100的偶数和为"+sum1);//0~100的偶数和为2550
}
}
while循环
语法格式
⑴初始化部分
while(⑵循环条件部分){
⑶循环体部分;
⑷迭代部分;
}
执行过程:①-②-③-④-②-③-④-②-③-④-…-②
注意事项:
- 注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。
- for循环和while循环可以相互转换。
package javase4;
public class RunningOrder4 {
public static void main(String[] args) {
//使用while循环做出[0~100]的整数和
int result = 0;
int i = 0;
while(i<=100){
result += i;
i++;//迭代部分,必须设置否则就会进入死循环
}
System.out.println("[0~100]的整数和为:"+result);//[0~100]的整数和为:5050
}
}
do-while循环
do-while循环结构的使用
一、循环结构的四个要素
⑴ 初始化条件
⑵ 循环条件 --->是boolean类型
⑶ 循环体
⑷ 迭代条件
二、do-while循环的结构
⑴
do{
⑶;
⑷;
}while(⑵);
执行过程:⑴ - ⑶- ⑷ - ⑵ - ⑴- ⑶ - ⑷- ... - ⑵
说明:do-while循环至少执行一次循环体。
package javase4;
import java.util.Scanner;
public class RunningOrder5 {
public static void main(String[] args) {
//使用do-while遍历[0,100]所有偶数
int sum = 0;
int i = 0;
do{
if(i%2==0) sum+=i;
i++;
}while(i<=100);
System.out.println("[0,100]偶数和为"+sum);//[0,100]偶数和为2550
/*拓展练习*/
//(写法1,这个兼容性更强)从键盘读入个数不确定的数,并判断读入的正数和负数的个数,输入为0时结束程序
double input = 0;
int countPositive = 0;
int countNegative = 0;
do{
System.out.println("请输入一个数:");
input=new Scanner(System.in).nextDouble();
if(input>0)countPositive+=1;
if(input<0)countNegative+=1;
}while(input!=0);
System.out.println("循环结束,正数有"+countPositive+"个,负数有"+countNegative+"个.");
//(写法2)从键盘读入个数不确定的数,并判断读入的正数和负数的个数,输入为0时结束程序
Scanner scan = new Scanner(System.in);
int Positive = 0; //正数个数
int Negative = 0; //负数个数
while(true){
int number = scan.nextInt();
if(number > 0){
Positive++;
}else if(number < 0){
Negative++;
}else{
//一旦执行,跳出循环。
break;
}
}
System.out.println("循环结束,正数有"+Positive+"个,负数有"+Negative+"个.");
}
}
for与while的区别
当知道具体要循环多少次时使用for循环,举例:计算[0~100]的偶数
当不清楚要循环多少次时使用while或者do-while循环,举例:让用户输入值,判断输入的值的正负,来统计正数和负数的个数
while和do-while循环的区别
do-while是先做后循环,也就是无论如何都要至少执行一次循环体的代码
嵌套循环
说明:
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为外层循环或内层循环。
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。外层循环控制行数,内层循环控制列数.也可以看做外层循环为局,内层循环为回合.
- 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
典型题目:
- 九九乘法表
- 金字塔
- 100以内的质数
package javase4;
public class RunningOrder6 {
/*
嵌套循环的使用
1.嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
2.
外层循环:循环结构B
内层循环:循环结构A
3.说明
① 内层循环遍历一遍,只相当于外层循环循环体执行了一次
② 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
4.技巧!!!!!!!!!!!
外层循环控制行数,内层循环控制列数
*/
public static void main(String[] args) {
//打印一个3*3的左直角三角形
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
System.out.print('*');
}
System.out.println();
}
// *
// **
// ***
//九九乘法表,逻辑与上同理
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + j * i + '\t');
}
System.out.println();
}
//[0,100]的所有质数及个数(素数:只能被1和本身整数的自然数)
int countPrime = 0;
boolean flag = true;
for (int i = 2; i <= 100; i++) {//[0,100]的自然数,从2开始
for (int j = 2; j < i; j++) {//从0~100取出的数与其相比的数从小到大开始求余
if (i % j == 0) {//一旦发现有数能被整除
flag = false;//更改操作为不允许
break;//立马终止内侧循环
}
}
if (flag == true) {//如果允许操作,也就以为着这个i值只能别自己和1整除
countPrime += 1;//质数整数+1
System.out.println("第" + countPrime + "个质数为:" + i);
}
flag = true;//将操作重新改为允许,开始下一次外部循环
}
System.out.println("[0,100]的所有质数个数是:" + countPrime);//[0,100]的所有质数个数是:25
}
}
break、continue、return的使用
break语句用于终止某个语句块的执行
{
......
break;
......
}
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ......
label2: { ......
label3: { ......
break label2;
......
}
}
}
continue的使用
- 只在循环结构中使用
- 中止continue执行所在的循环的一次循环,若后面还能执行循环则继续
- continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
label1: { ......
label2: { ......
label3: { ......
continue label2;
......
}
}
}
return
- return:并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
- 与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内
-
如果有返回值则返回调用这个方法的对象,返回调用该方法的语句处进行下一步执行
break、continue特殊流程说明:
- break只能用于switch语句和循环语句中。
- continue 只能用于循环语句中。
- 二者功能类似,但continue是终止本次循环,break是终止本层循环。
- break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
- 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的且goto在Java中属于保留字
package javase4;
public class RunningOrder7 {
/*
break和countinue关键字的使用
使用范围 循环中使用的作用(不同点) 相同点
break: switch-case 结束当前循环 关键字后面不能声明执行语句
循环结构中
countinue: 循环结构中 结束当次循环 关键字后面不能声明执行语句
*/
public static void main(String[] args) {
for(int i = 1;i <= 10;i++){
if(i % 4 == 0){
// break; //1、2、3
continue; //1、2、3、5、6、7、9、10
// System.out.println("该吃饭了!!!");
}
// System.out.println(i);
}
//********************************
for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 10; j++){
if(i % 4 == 0){
// break; //默认跳出包裹此关键字最近的一层的循环
continue;
}
System.out.print(j);
}
System.out.println();
}
}
}