文章目录
前言
本篇文章是韩顺平老师课程P103-P153(第五章:程序控制结构)重点内容的详细总结,包含以下内容:
- 顺序控制
- 分支控制(if, else, switch)
- 循环控制( for, while, do while, 多重循环)
- break、continue、return
从这一章开始,我们会逐步接触编程思想,正式开始敲代码实践,建议大家多练习,常写常新。
一、顺序控制
- 程序从上到下逐行执行,中间没有判断和转跳
- Java中定义变量采用合法的前向引用(所有的变量要先定义,再使用)
public class Test{
//先定义num1
int num1 = 12;
//再使用
int num2 = num1 + 2;
二、分支控制(if, else, switch)
1. if-else
- 介绍:让程序有选择的执行,分支控制有三种:单分支、双分支、多分支
1)单分支 if
- 基本语法(提示:如果{ }中只有一条语句,则可以不用{ },但建议写上{ })
// 当条件表达式为true时,就会执行{}里面的代码
// 如果为false,就不执行,直接跳出if代码
if(条件表达式) {
执行代码块;(可以有多条语句)
}
- 案例分析
import java.util.Scanner;
public class Test01{
public static void main (String[] args){
//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁, //则输出 "你年龄大于 18,要对自己的行为负责,送入监狱"
//思路分析
//1. 接收输入的年龄, 应该定义一个 Scanner 对象
//2. 把年龄保存到一个变量 int age
//3. 使用 if 判断,输出对应信息
//应该定义一个 Scanner 对象
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入年龄");
//把年龄保存到一个变量 int age
int age = myScanner.nextInt();
//使用 if 判断,输出对应信息
if(age > 18) {
System.out.println("你年龄大于 18,要对自己的行为负责,送入监狱");
}
System.out.println("程序继续...");
}
}
- 单分支执行流程图
2)双分支 if-else
- 基本语法
if(条件表达式) {
执行代码块1;
}
else {
执行代码块2;
}
- 说明
- 当表达式成立时,执行代码块1;否则,执行代码块2
- 如果执行的代码块只有一条语句,{}可以省略(建议不要省)
- 案例分析
import java.util.Scanner;//导入
public class If02 {
//编写一个 main 方法
public static void main(String[] args) {
//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁,
//则输出 "你年龄大于 18,要对自己的行为负责"。
//否则 ,输出"你的年龄不大,好好接受教育。"
//应该定义一个 Scanner 对象
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入年龄");
//把年龄保存到一个变量 int age
int age = myScanner.nextInt();
//使用 if-else 判断,输出对应信息
if(age > 18) {
System.out.println("你年龄大于 18,要对自己的行为负责");
} else {//双分支
System.out.println("你的年龄不大,好好接受教育。");
}
System.out.println("程序继续...");
}
}
- 双分支执行流程图
- 老韩单双分支练习视频课指路大家可以看看视频再练习一些案例,本篇笔记不再赘述
3)多分支
- 基本语法
if(条件表达式1) {
执行代码块1;
}
else if(条件表达式2) {
执行代码块2;
}
//……这里可以有多个else if(){}
//最后用else{}结尾
else {
执行代码块n
}
- 说明
- 多分支可以没有最后这个else{}
- 如果没有最后这个else{}
- 当所有的条件表达式都不成立时,则一个执行入口都没有,直接退出分支
- 如果有else{}
- 当以上所有else if{}条件表达式都不成立时,则默认执行else{}代码块内容
- 案例分析
/*输入保国同志的芝麻信用分:
如果:
1) 信用分为 100 分时,输出 信用极好;
2) 信用分为(80,99]时,输出 信用优秀;
3) 信用分为[60,80]时,输出 信用一般;
4) 其它情况 ,输出 信用 不及格
5) 请从键盘输入保国的芝麻信用分,并加以判断
*/
import java.util.Scanner;
public class Test01{
public static void main (String[] args){
Scanner myscanner = new Scanner(System.in);
int score = myscanner.nextInt();
//先对输入的信用分,进行一个范围的有效判断 1-100, 否则提示输入错误
if(score >= 1 && score <= 100) {
//因为有 4 种情况,所以使用多分支
if(score == 100) {
System.out.println("信用极好");
}
else if(score > 80 && score <= 99) {
System.out.println("信用优秀");
}
else if(score >=60 && score <=80) {
System.out.println("信用一般");
}
else {
System.out.println("信用不合格");
}
}else{
System.out.println("信用分输入有误");
}
}
}
- 多分支执行流程图
- 老韩多分支练习2大家看视频多练习,有很多容易踩坑的细节需要大家好好学习
4)嵌套分支
- 介绍
- 在一个分支结构中又完整嵌套了另一个完整的分支结构,里面的分支的结构成为内层分支,外面的分支结构称为外层分支。
- 规范:不要超过3层,层数太多可读性不好
- 基本语法
if() {
if() {
//if-else...
}else{
//if-else
}
}
- 案例
参加歌手比赛,如果初赛成绩大于 8.0 进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组。输入成绩和性别,进行判断和输出信息。
import java.util.Scanner;
public class NestedIf {
public static void main(String[] args) {
//思路分析
//1. 创建 Scanner 对象,接收用户输入
//2. 接收 成绩保存到 double score
//3. 使用 if-else 判断 如果初赛成绩大于 8.0 进入决赛,否则提示淘汰
//4. 如果进入到 决赛,再接收 char gender, 使用 if-else 输出信息
//代码实现 => 思路 --> java 代码
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入该歌手的成绩");
double score = myScanner.nextDouble();
if( score > 8.0 ) { //第一层分支
System.out.println("请输入性别");
char gender = myScanner.next().charAt(0);
if( gender == '男' ) { //第二层嵌套分支
System.out.println("进入男子组");
} else if(gender == '女') {
System.out.println("进入女子组");
} else {
System.out.println("你的性别有误,不能参加决赛~");
}
} else {
System.out.println("sorry ,你被淘汰了~");
}
}
}
2. switch
- 基本语法
switch(表达式){ // 1.switch是关建字,表示switch分支
case 常量1: // 2.表达式对应一个具体的值
语句块1; // 3.case常量1:当表达式的值等于常量1,就执行语句块1
break; // 4.break:表示tui出switch
case 常量2: // 5.如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配
语句块2; // case常量2
break; // 6.如果一个都没匹配上,执行default
....
case 常量n:
语句块n;
break;
default:
default 语句块;
break;
}
- 流程图
- 案例说明(快速入门)
import java.util.Scanner;
public class Switch01{
public static void main (String[] args){
/*
请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g
a 表示星期一,b 表示星期二 …
根据用户的输入显示相应的信息.要求使用 switch 语句完成
思路分析
1. 接收一个字符 , 创建 Scanner 对象
2. 使用 switch 来完成匹配,并输出对应信息
代码
*/
Scanner scan = new Scanner (System.in);
System.out.println("请输入字母");
char word = scan.next().charAt(0);
switch (word) {
case 'a':
System.out.println("星期一");
break;
case 'b':
System.out.println("星期二");
break;
//......
default:
System.out.println("输入的字符不正确");
break;
}
}
}
- switch细节
-
表达式数据类型,应和case后的常量类型一致,或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是int
-
switch表达式中的表达式返回值必须是:(byte, short, int, char, enum [枚举], String)
-
case子句中的值必须是常量或者常量表达式,而不能是变量
-
default子句是可选的,当没有匹配的case时,执行default(可以没有default)
-
break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break,程序会顺序执行到switch结尾
-
switch和if的比较
- 如果判断的具体值不多,而且符合byte, short, int, char, enum, String这六种类型。建议使用switch语句
- 对区间判断,对结果为boolean类型判断,使用if ,if-else的使用范围更广
-
三、循环控制( for, while, do while, 多重循环)
1. for
- 语法
- for 关键字,表示循环控制
- for 有四个要素:循环变量初始化;循环条件;循环操作;循环变量迭代
- 循环操作:可以有多条语句,也就是我们要循环执行的代码
- 如果循环操作(语句) 只有一条语句,可以省略{},建议不要省略
- 流程分析
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(语句);
}
- 流程图
- 细节
- 循环条件是返回一个布尔值的表达式
- for( ; 循环判断条件;) 中的初始化和条件变量迭代可以写到其他地方,但是两边的分号不能省略
int i = 1; //循环变量初始化 在for循环结束后还想使用i
for (; i <= 10; ){
System.out.println("xx" + i);
i++
}
for (;;){
System.out.println("xx"); //无限循环,死循环
}
- 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开
- 循环变量迭代也可以有多条语句,中间用逗号隔开
int count = 3;
for(int i = 0, j = 0; i < count; i++, j += 2){
System.out.println("i=" + i + "j=" + j); //i = 2; j = 6
}
- 案例
这里的案例分析可以看老韩的视频讲解,一共有两个案例
2. while
- 基本语法
说明:while循环也有四要素,只是四要素的位置不一样
循环变量初始化;
while(循环条件){
循环体(语句);
循环变量迭代;
}
- 流程图
- 案例练习:打印 1—100 之间所有能被 3 整除的数
public class Test11{
//打印 1—100 之间所有能被 3 整除的数
public static void main(String[] args){
int a = 1;
while (a <= 100){
if(a % 3 == 0){
System.out.println(a);
}
a++;
}
}
}
- 细节
- 循环条件是返回一个布尔值的表达式
- while循环是先判断再执行语句
3. do while
- 基本语法
- do while是关键字
- 也有循环四要素,只是位置不同
- 先执行,在判断,一定会执行一次
- 最后有一个分号(while结束后)
- while 和do…while 的区别
- while:要账的时候,先问还不还,如果还,就走人,不打(先判断,再执行)
- do…while:要账的时候,先打一顿,再问还不还(先执行,再判断)
循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);
- 流程图
- 细节
- 循环条件是返回一个布尔值的表达式
- do…while 循环是先执行,再判断,因此它至少执行一次
- 案例练习:统计1-200之间能被5整除但不能被3整除的数的个数
public class Test11{
public static void main(String[] args){
int i = 1;
int num = 0;
do{
if((i % 5 == 0) && (i % 3 != 0)){
num++;
}
i++;
}while(i <= 200);
System.out.println(num);
}
}
4. 多重循环(重难点,很重要)
(受篇幅限制本章的多重循环并未详细介绍,我写了一篇专题文章重点分析了老韩的四个案例,包含每一步的步骤和最终完整代码,感兴趣的朋友可以移步这篇文章:从零开始学Java——多重循环的应用保姆级拆分讲解:统计班级平均分、打印九九乘法表、实心金字塔和空心金字塔的实现)
-
介绍
- 将一个循环放在另外一个循环体内,形成嵌套循环,其中,for, while, do…while均可以作为外层循环和内层循环
- 建议一般使用两层,三层以上可读性很差
- 实际上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环
- 将一个循环放在另外一个循环体内,形成嵌套循环,其中,for, while, do…while均可以作为外层循环和内层循环
-
案例1:统计三个班成绩情况,每个班有五个同学,求出每个班的平均分和所有班级的平均分,统计及格人数
-
案例2:空心金字塔
我这里并没有把案例放完整,完整的案例可以看老韩视频
四、break、continue、return
1. break跳转语句
- 需求
- 随机生成1-100的一个数,直到生成了97这个数,看看一共用了几次?
使用(int)(Math.random() * 100) + 1
- 思路分析:循环,但是循环的次数不知道。 -> break,当某个条件满足时,终止循环,通过该需求可以说明其他流程控制的必要性
- 随机生成1-100的一个数,直到生成了97这个数,看看一共用了几次?
- 基本介绍
- break语句用于终止某个语句块的执行,一般使用在switch或者循环[for, while, do-while]中
- 基本语法
{ ...
break;
...
}
- 细节
- break语句出现在多层嵌套语句块中时,可以通过标签指明要终止的是哪一层语句块
- 标签的基本使用 & 案例
- break语句可以指定退出哪层
- label 1 是标签,名字由程序员指定
- break 后指定到哪个label就退出到哪里
- 在实际开发中,尽量不要使用标签
- 如果每日有指定的break,默认退出最近的循环体
label 1:{ ...
label 2: { ...
label 3: { ...
break label 2;
...
}
}
}
public class Asgd{
public static void main(String[] args){
label1:
for(int i = 0; i < 4; i++) {
label2:
for(int j = 0; j < 10; j++) {
if (j == 2){
break label1;
}
System.out.println(j); //只输出0,1
}
}
}
}
2. continue
- 基本介绍
- 用于结束本次循环,继续执行下一次循环
- continue语句出现在多层嵌套语句体中时,可以通过标签指明要跳过的是哪一层循环,规则同上
- 基本语法
{ ...
continue;
...
}
- 快速入门
public class Asgd{
public static void main(String[] args){
int i = 1;
while( i <= 4 ){
i++;
if (i == 2){
continue;
}
System.out.println(i); //3 4 5
}
}
}
3. return
- 介绍
- return使用在方法,表示跳出所在的方法,在讲解方法的时候会详细介绍。 如果return用在main方法,退出程序
老韩视频中的本章作业和梳理我放在这里,一定要认真看着视频敲代码哦。
总结
本篇文章是韩顺平老师课程P103-P153(第五章:程序控制结构)重点内容的详细总结,包含以下内容:
- 顺序控制
- 分支控制(if, else, switch)
- 循环控制( for, while, do while, 多重循环)
- break、continue、return
从这一章开始,我们会逐步接触编程思想,正式开始敲代码实践,建议大家多练习,常写常新。