第六章 控制语句

1 控制语句概述

1 控制语句的作用
控制语句的出现可以让我们的程序具有逻辑性/条理性,可以使用控制语句来实现一个“业务”了。

2 控制语句包括几类?
选择语句
循环语句
转向语句

3 选择语句也可以叫做分支语句
if语句
switch语句

4 循环语句:主要循环反复的去执行某段特定折代码块
for循环
while循环
do...while循环

5 转向语句
break
continue
return (这个先不讲,等讲方法的时候讲)

 

2 选择语句/分支语句if

2.1 if语句语法格式

if语句的语法结构以及运行原理?
if语句的是分支语句,也可以叫做条件语句
if语句的语法格式:
第一种写法:
if(布尔表达式){
java语句;
java语句;
}
这里的一个大括号叫做一个分支
if 这个单词翻译为如果,所以又叫做条件语句。
该语句的执行原理是:
如果布尔表达式的结果是true,则执行大括号中的程序。否则大括号中的代码不执行。

第二种写法:
if(布尔表达式){
java语句;
}else{
java语句;
}
执行原理:
如果布尔表达式的结果是true,则执行分支1,分支2不执行。
如果布尔表达式的结果是false,则执行分支2,分支1不执行。
以上的if语句可以保存一定会有一个分支执行。

第三种写法:
if(布尔表达式1){
java语句;
}else if(布尔表达式2){
java语句;
}else if(布尔表达式3){
java语句;
}...
以上if语句的执行原理?
先判断布尔表达式1,如果布尔表达式1为true,则执行分支1,然后if语句结束了。
当“布尔表达式1”的结果是false,那么会继承判断布尔表达式2的结果,如果布尔表达式2的结果是true,则执行分支2,然后整个if语句就结束了。
从上往下依次判断,主要看第一个true发生在哪个分支上,第一个true对应的分支执行,只要一个分支执行,整个if结束。

第四种写法:
if(布尔表达式1){
java语句;
}else if(布尔表达式2){
java语句;
}else if(布尔表达式3){
java语句;
}else{
java语句;
}



注意:
1、对于if语句来说,在任何情况下只能有1个分支执行,不可能存在2个或者更多个分支 执行。if语句中只要有1个分支执行,整个if语句就结束了。(对于1个完整的if语句说的)
2、以上4种语法机制中,凡是带有else分支的,一定可以保证会有一个分支执行。第一种和第三种没有else分支,这样的语句可能会导致最后一个分支都不执行。第二种和第四种肯定会有1个分支执行。
3、当分支当中“java语句”只有1条,那么大括号{}可以省略,但是为了可读性,最好不要省略。
4、控制语句和控制语句之间是可以嵌套的,但是嵌套的时候大家最好一个语句一个语句进行分析,不要冗杂在一起分析。
if(){
if(){
if(){

}else{

}
}else{

}
}else{

}


public class IfTest01{
public static void main(String[] args){

// 定义一个布尔类型的变量,表示性别。
boolean sex = true;

// 业务:当sex为true是表示男,为false表示女。
/*
if(sex == true){
System.out.println('男');
}else{
System.out.println('女');
}
*/

// 改良。
if(sex){
System.out.println('男');
}else{
System.out.println('女');
}

// 可以再进一步改良
// 可以使用三步运算符
System.out.println(sex ? '男' : '女');

// 代码可以这样写吗?
// 小括号当中最终取的值是sex变量的值。
// sex是布尔类型,所以这个可以通过。
if(sex = true){
System.out.println('男');
}else{
// 虽然这种语法可以,但是会导致else分支无法执行。
System.out.println('女');
}

int i = 100;
if(i == 100){
System.out.println("i是100");
}

// 错误:不兼容的类型:int无法转换成booelan
/*
if(i = 100){ // (i=100)整体执行完之后是一个int类型,不是布尔类型。
System.out.println('a');
}
*/

// 当分支中只有一条java语句的时候,大括号可以省略。
if(sex)
System.out.println('男');
else
System.out.println('女');

// 判断以下程序会出现问题吗?会出什么问题?哪里会报错?
if(sex)
System.out.println('男');
System.out.println("HelloWorld");  // 以上的这3行代码没有问题
else   // 这一行编译报错,因为else缺少if
System.out.println('女');

}
}

2.1 if语法练习1

业务要求:
1、从键盘上接收一个人的年龄。
2、年龄要求为[0 ~ 150],其它值表示非法,需要提示非法信息。
3、根据人的年龄来动态的判断这个人属于生命的哪个阶段?
[0 ~ 5]  婴幼儿
[6 ~ 10] 少儿
[11 ~ 18]  少年
[19 ~ 35] 青年
[36 ~ 55] 中年
[56 ~ 150] 老年
4、请使用if语句完成以上的业务逻辑。


public class IfTest02{
public static void main(String[] args){
System.out.println('肯');
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入年龄");
int age = s.nextInt();
System.out.println("你输入的年龄是: " + age);

if (age < 0 || age > 150){
System.out.println("年龄不合法");
}else{
// 能够走到这个分支当中,说明年龄是合法的。
// 可以进一步使用嵌套的if语句进行判断。
// if(age >= 0 && age <= 5){}
// System.out.println("年龄合法");
// 年龄值合法的情况下,继续判断年龄属于哪个阶段的
if(age >= 0 && age <= 5){}  // 这样写代码比较啰嗦了
if(age <= 5){
System.out.println("幼儿期");
}else if(age <= 10){
System.out.println("少儿");
}else if(age <= 18){
System.out.println("少年");
}else if(age <= 35){
System.out.println("青年");
}else if(age <= 55){
System.out.println("中年");
}else{
System.out.println("老年");
}
}

// 可以不嵌套吗?可以
if(age < 0 || age > 150){
System.out.println("年龄不合法");
}else if(age <= 5){
System.out.println("婴幼八");
}else if(age <= 10){
System.out.println("少儿");
}else if(age <= 18){
System.out.println("少年");
}else if(age <= 35){
System.out.println("青年");
}else if(age <= 55){
System.out.println("中年");
}else{
System.out.println("老年");
}

// 进一步改良
String str = "老年";
if(age < 0 || age > 150){
System.out.println("年龄不合法");
// 既然不合法,就别然程序往下继续执行了,怎么终止程序执行
return;
}else if(age <= 5){
str = "婴幼儿";
}else if(age <= 10){
str = "少儿";
}else if(age <= 18){
str = "少年";
}else if(age <= 35){
str = "青年";
}else if(age <= 55){
str = "中年"
}
System.out.println(str);

}
}

2.3 if语句练习2

    题目:
1、系统接收一个学生的考试成绩,根据考试成绩输出成绩的等级

2、等级:
优:[90 ~ 100]
良:[80 ~ 90)
中:[70 ~ 80)
及各:[60 ~ 70)
不及各:[0 ~ 60)

3、要求成绩是一个合法的数字,成绩必须在[0 ~ 100]之间,成绩可以是小数


public class IfTest03{
public static void main(String[] args){
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入你的考试成绩: ");
// 考试成绩带有小数
double score = s.nextDouble();
// 判断考试成绩
String str = "优秀";
if(score < 0 || score > 100){
str = "成绩不合法";
}else if(score < 60){
str = "不及格";
}else if(score < 70){
str = "及格";
}else if(score < 80){
str = "中";
}else if(score < 90){
str = "良";
}
System.out.println(str);

}
}

2.4 if语句练习3

题目:
业务:
从键盘上接收死而后已的信息:
1表示:雨天
0表示:晴天
同时从键盘上接收性别的信息:
1表示:男
0表示:女
业务要求:
当天气是雨天的时候:
男的:打一把大黑伞
女的:打一把小花伞
当天气是晴天的时候:
男的:直接走起,出去玩
女的:擦点防晒霜,出去玩

需要使用if语句以及嵌套的方式展现这个业务。


public class IfTest04{
public static void main(String[] args){
// 接收用户键盘输入
java.util.Scanner s = new java.util.Scanner(System.in);
// 提示信息
System.out.print("请输入你的性别,输入1表示男,0表示女: ");
// 程序停下来等待用户的输入
int gender = s.nextInt();

// 提示信息
System.out.print("请输入当前天气,1表示雨天,0表示晴天: ");
// 等待用户的输入
int weather = s.nextInt();
if(weather == 1){
System.out.println("雨天");
if(gender == 1){
System.out.println("下雨了,带一把大黑伞");
}else if(gender == 0){
System.out.println("下雨了,记得带一把小花伞");
}
}else if(weather == 0){
System.out.println("晴天");
if(gender == 1){
System.out.println("直接出去玩吧");
}else if(gender == 0){
System.out.println("天气晴朗,注意防晒");
}
}
}
}

 

3 选择语句/分支语句switch

3.1 switch语句语法格式

switch语句:
1、switch语句也是选择语句,也可以叫做分支语句。
2、switch语句的语法格式
switch(值){
case 值1:
java语句;
java语句;
...
break;
case 值2:
java语句;
java语句;
...
break;
case 值3:
java语句;
java语句;
...
break
default:
java语句;
}

以上是一个完整的switch语句:
其中:break;语句不是必须的。default语句也不是必须的。

switch语句支持的值有哪些?
支持int类型以及String类型。
但一定要注意JDK的版本,JDK8之前不支持String类型,只支持int类型。
在JDK8之后,switch语句开始支持字符串String类型。

switch语句本质上只支持int和String,但是byte,short,char也可以使用在switch语句当中,因为byte,short,char可以进行自动类型转换。
switch语句中“值”与“值1”、“值2”等比较的时候会使用“==”进行比较。

3、switch语句的执行原理
拿“值”与“值1”进行比较,如果相同,则执行该分支中的java语句,然后遇到“break;”语句,switch语句就结束了。
如果“值”与“值1”不相等,会继续拿“值”也“值2”进行比较,如果相同,则执行该分支中的java语句,然后遇到“break;”语句,switch结束。

注意:如果分支执行了,但是分支最后没有“break;”,此时会发生case穿透现象。

所有的case都没有匹配成功,那么最后defalut分支会执行。


public class SwitchTest01{
public static void main(String[] args){

// 分析这个程序是否能够编译通过?
// switch只支持int类型和String类型
// 错误:不兼容的类型:从long转换到int可能会有损失
/*
long x = 100L;
switch(x){
}
*/

// 以下几种都可以
/*
byte b = 100;
switch(b){
}

short c = 100;
switch(c){
}

char d = 'a';
switch(d){
}
*/

// 写一个完整的switch语句
// 接收键盘输入,根据输入的数字来判断星期几。
// 0 星期日
// 1 星期一
// ...
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入[0-6]的整数: ");
int num = s.nextInt();
switch(num){
case 0:
System.out.println("星期日");
break;
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
}

// case穿透现象
switch(num){
case 0:
System.out.println("星期日");
case 1:
System.out.println("星期一");
case 2:
System.out.println("星期二");
case 3:
System.out.println("星期三");
case 4:
System.out.println("星期四");
case 5:
System.out.println("星期五");
case 6:
System.out.println("星期六");
}

// 关于default语句,当所有的case都没有匹配上的螩,执行default语句。
switch(num){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
default:
System.out.println("星期日");
}

// 关于case合并的问题
switch(num){
case 1: case 2: case 3:
System.out.println("星期一");
break;
case 4: case 5: case 6:
System.out.println("星期二");
break;
case 7:
System.out.println("星期三");
break;
case 8:
System.out.println("星期四");
break;
case 9:
System.out.println("星期五");
break;
case 10:
System.out.println("星期六");
break;
default:
System.out.println("星期日");
}

}
}

3.2 switch语句练习

题目:
1、系统接收一个学生的考试成绩,根据考试成绩输出成绩的等级

2、等级:
优:[90 ~ 100]
良:[80 ~ 90)
中:[70 ~ 80)
及各:[60 ~ 70)
不及各:[0 ~ 60)

3、要求成绩是一个合法的数字,成绩必须在[0 ~ 100]之间,成绩可以是小数

4、要求使用switch语句来完成。


public class SwitchTest02{
public static void main(String[] args){
// 提示用户输入学生成绩
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入学生的成绩: ");
double score = s.nextDouble();
System.out.println(score);
if(score < 0 || score > 100){
System.out.println("成绩不合法");
return;  // 这个代码的执行,会让main结束。后面会讲
}

// 程序能够执行到这里预科成绩一定是合法的。
// grade的值可能是:0 1 2 3 4 5 6 7 8 9 10
// 0 1 2 3 4 5 不及格
// 6 及格
// 7 中
// 8 良
// 9 10 优
int grade = (int)(score / 10);  // 95.5/10结果9.55,强转为int结果为9
String str = "不及格";
switch(grade){
case 10: case 9:
str = "优";
break;
case 8:
str = "良";
break;
case 7:
str = "中";
break;
case 6:
str = "及格"
}
System.out.println("你的成绩等级为: " + str);

}
}
 

3 循环语句

3.1 循环语句的引入

关于循环语句
for循环
while循环
do...while循环

什么是循环语句,为什么要使用这种语句?
因为在现实世界中,有很多事情都是需要反复/重复的去做。
对应到程序当中,如果有一块代码需要重复执行,此时为了减少代码量,我们可以使用循环语句。


public class ForTest01{
public static void main(String[] args){
// 要求在控制台上输入10个“我爱你”
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
System.out.println("我爱你");
// 重复代码太多了

// 简化一下以上的代码,可以使用循环
// 什么时候考虑使用循环呢?相同的代码重复出现的时候,可以使用循环语句。
for(int i = 0; i < 10; i++){
System.out.println("我爱你");
}
}
}

 

4 for循环

4.1 for循环的语法结构和执行原理

1、for循环的语法机制以及运行原理?
for(初始化表达式; 布尔表达式; 更新表达式){
循环体;  // 循环体由java语句构成
java语句;
java语句;
...
}
注意:
初始化表达式最先执行,并且整个循环中只执行一次
条件表达式的结果必须是一个布尔类型。也就是:true/false
执行原理:
先执行初始表达式,并且初始表达式只执行1次。
然后判断条件表达式的结果,如果条件表达式结果为true,则执行循环体。
循环体执行结束之后,执行更新表达式。
更新完之后,再判断条件表达式的结果,如果还是true,继续执行循环体。
直到更新表达式执行结束之后,再次判断判断条件时,条件为false,for循环终止。
更新表达式的作用是:控制循环的次数,换句话说,更新表达式会更新某个变量的值,这样条件表达式的结果才有可能由true变成false,从而终止循环的执行。

4.2 for死循环及常见的简单for循环

public class ForTest02{
public static void main(String[] args){
// 最简练的for循环怎么写?
// 初始化表达式、条件表达式、更新表达式其实都不是必须的
/*
for(;;){
System.out.println("死循环");
}
*/

// 最常见的for循环
// 循环10次,输出0~9
// 对于以下的这个for循环,其中int i = 0;最先执行,并且只执行一次,而且i变量属于for循环的局部变量,for循环结束之后i的内存就释放了。
// 这个i变量只能在for循环中使用。
// 这个i变量属于for循环域,在main方法中没有办法直接使用
for(int i = 0; i < 10; i++){
System.out.println("i = " + i);
}
}
}

4.3 for循环变形


public class ForTest03{
public static void main(String[] args){
// for的其它形式
       
       int i = 0;
for(; i < 10; i++){
System.out.println("i --> " + i);
}
System.out.println(i);  // 10

// 变形
for(int k = 1; k <= 10; k++){
System.out.println("k --> " + k);  // 1 2 ... 10
}

for(int k = 1; k <= 10;){
System.out.println("k --> " + k);  // 1 2 ... 10
k++;
}

for(int k = 1; k <= 10;){
k++;
System.out.println("k --> " + k);  // 2 3 ... 11
}

       
for(int i = 10; i > 0; i--){
System.out.println("i --> " + i);  // 10 9 ... 1
}

for(int i = 0; i < 10; i += 2){
System.out.println("i --> " + i);  // 0 2 4 ... 8
}

// 注意:1对3求余数结果还是1
/*
for(int i = 100; i > 0; i %= 3){
System.out.println("i --> " + i); // 100 1
}
*/
}
}

4.4 for循环求1~100的奇数和

/*
使用for循环,实现1~100所有奇数求和
至少给出两种解决方案
*/

public class ForTest04{
public static void main(String[] args){
// 第一种方案:
// 思路:先找出1~100所有的奇数,然后再考虑求和
// 第一步:先从1取到100,一个数字一个数字的取出来。
// 第二步:既然可以得到每一个数字,那么我们进一步判断这个数字是否为奇数
// 奇数对2求余数,结果都是1
int sum = 0;  // 初始值给0
for(int i = 1; i <= 100; i++){
if(i % 2 == 1){  // i为奇数的条件
sum += i;  // 累加
}
}
// 一定在for循环全部结束之后输出的sum就是最终的结果。
System.out.println("1~100所有奇数求和结果是: " + sum);

// 第二种方案:
sum  = 0;
for(int i = 1; i < 100; i += 2){
// 这样写可以保证每一次取出的值都是奇数,不需要判断。
sum += i;
}
System.out.println("1~100所有奇数求和结果: " + sum);

}
}

4.5 for循环嵌套

1、所有合法的“控制语句”都可以嵌套使用。
2、for循环嵌套一个for循环执行的原理是什么?
提示一下:大家不要因为for循环中嵌套了一个for循环,就感觉这个程序比较特殊,实际上大家可以这样看待:
for(){
// 在分析外层for循环的时候,把时而的for就当做一段普通的java语句/s代码
for(){}
}


public class ForTest05{
public static void main(String[] args){
// 单层for循环
for(int i = 0; i < 10; i++){
System.out.println("i --> " + i);
}

for(int k = 0; k < 2; k++){
System.out.println("k --> " + k);
}

for(int k = 0; k < 2; k++){  // 循环2次
for(int i = 0; i < 10; i++){
System.out.println("i --> " + i);
}
}

int i = 0;
for(int k = 0; k < 2; k++){
for(; i < 10; i++){
System.out.println("value ---> " + i);
}
}

}
}

4.6 for嵌套实现输出九九乘法表

九九乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...
1*9=9 2*9=18..........9*9=81

九九乘法表的特点:
第一个特点:共9行。
第二个特点:第1行1个。第2行2个。第n行n个。


public class ForTest06{
public static void main(String[] args){

// 9行,循环9次
for(int i = 1; i <= 9; i++){  // 纵向循环
// 负责输出一行的。(内部for循环负责将一行上的全部输出。)
for(int j = 1; j <= i; j++){  // 横向循环
System.out.print(j + "*" + i + "=" + (i*j) + " ");
}
// 换行
System.out.println();
}
}
}

 

5 while循环

while循环:
1、while循环的语法机制以及执行原理
语法机制:
while(布尔表达式){
循环体;
}
执行原理:
判断布尔表达式的结棍,如果为true就执行循环体,
循环体结束之后,再次判断布尔表达式的结果,如果还是true,继续执行循环体。
直到布尔表达式结果为false,while循环结束。

2、while循环有没有可能循环次数为0次?
可能。
while循环的循环次数是:0~n次。


public class WhileTest01{
public static void main(String[] args){

// 死循环
/*
while(true){
System.out.println("我爱你");
}
*/

// 本质上while循环和for循环原理是相同的。
/*
for(初始化表达式; 布尔表达式; 更新表达式){
循环体;
}

初始化表达式;
while(布尔表达式){
循环体;
更新表达式;
}
*/

/*
for(int i = 0; i < 10; i++){
System.out.println("i --> " + i);
}

int i = 0;
while(i < 10){
System.out.println("i = " + i);
i++;
}
*/

/*
for(int i = 0; i < 10){
i++;System.out.println("i --> " + i);
}

int i = 0;
while(i < 10){
i++;
System.out.println("i = " + i);
}
*/
}
}

 

6 do...while循环

do...while循环语句的执行原理以及语法机制:
语法机制:
do {
循环休;
}while();
注意:do...while循环最后的时候别漏掉“分号”

执行原理:
先执行循环体当中的代码,执行一次循环体之后,判断布尔表达式的结果,如果为true,则继续执行循环体,如果为false循环结束。

对于do...while循环来说,循环体至少执行1次。循环体的执行次数是:1~n次。
对于while循环来说,循环体执行次数是:0~n次。


public class DoWhileTest01{
public static void main(String[] args){

int i = 0;
do{
System.out.println(i);  // 0 1 2 3 ... 8 9
}while(i < 10);

i = 0;
do{
System.out.println(i++);  // 0 1 2 3 ... 8 9
}while(i < 10);

i = 0;
do{
System.out.println(++i);  // 1 2 3 ... 9 10
}while(i < 10);

do{
System.out.println("hello world");
}while(false);
}
}

 

7 break转换语句

break; 语句:
1、break;语句比较特殊,特殊在:break语句是一个单词成为一个完整的java语句。

2、break 翻译为折断、弄断。

3、break;语句可以用在哪里呢?
用在两个地方,其它位置不行
第一个位置:switch语句当中,用来终止switch语句的执行。
用在switch语句当中,防止case穿透现象,用来终止switch。
第二个位置:用在循环语句当中,用来终止循环的执行。
用在for当中
用在while当中
用在do...while当中

4、以下程序主要是for循环为例学习break转向语句。

5、break; 语句的执行并不会让整个方法结束,break;语句主要是用来终止离它最近的那个循环语句。

6、怎么用break; 语句终止指定的循环呢?
第一步:你需要给循环起一个名字,例如:
a: for(){
b:for{}
}
第二步:终止
break a;

public class BreakTest01{
public static void main(String[] args){

// 输出0~9
/*
for(int i = 0; i < 10; i++){
System.out.println("i --> " + i);
}
*/

for(int i = 0; i < 10; i++){
if(i == 5){
// break; 语句会让离它最近的循环终止结束掉。
break;
}
System.out.println("i = " + i);  // 0 1 2 3 4
}

// 这里的代码照常执行,break;的执行并不会影响这里。
System.out.println("Hello World");

// 这个for循环再次
for(int k = 0; k < 2; k++){  // 外层for
for(int i = 0; i < 10; i++){  //内层for
if(i == 5){
break;  // 这个break; 语句只能终止离它最近的for
}
System.out.println("i --> " + i);
}
}

// 以下讲解的内容,以下很少用
a:for(int k = 0; k < 2; k++){
b:for(int i = 0; i < 10; i++){
if(i == 5){
break a;  // 终止指定的循环
}
System.out.println("i --> " + i);
}
}

}
}

 

8 continue转向语句

continue; 语句:
1、continue翻译为:继续
2、continue语句和break语句要对比着学习
3、continue语句的作用是:
终止当前“本次”循环,直接进入下一次循环继续执行。
for(){
if() {  // 当这个条件成立时,执行continue语句
continue;  // 当这个continue语句执行时,continue下面的代码不执行了,直接跳入下一次循环
}
// 以上的continue一旦执行,以下代码不执行,直接执行更新表达式
code1;
code2;
code3;
}

4、continue语句后面可以指定循环吗?
可以的。


public class ContinueTest01{
public static void main(String[] args){

for(int i = 0; i < 10; i++){
if(i == 5){
break;
}
System.out.println("i = " + i);  
}

for(int i = 0; i < 10; i++){
if( i == 5){
continue;
}
System.out.println("i = " + i);
}

}
}
 

 

 

posted @   路走  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示