35-程序控制结构
顺序控制
- 介绍:程序从上到下的执行,中间没有任何判断和跳转
- 顺序控制举例和注意事项
java中定义成员变量时采用合法的向前引用
分支控制
- 介绍:让程序有选择的执行,分支控制有三种:单分支,双分支,多分支
单分支
- 基本语法:
if(条件表达式){
执行代码块;
}
- 说明:
当条件表达式为ture时,就会执行{}的代码。如果为false,就不执行 - 特别说明:
如果{}中只有一条语句,则可以不用写{},但建议写上 - 案例:
- 单分支流程图
双分支
- 基本语法:
if(条件表达式){
执行代码块一;
}else{
执行代码块二;
}
- 说明:
当条件表达式成立,及执行代码块一,否则执行代码块二。如果执行代码块只有一条语句,则{}可以不用写,但建议写上。
eg:
- 双分支流程图
多分支
- 基本语法:
if(条件表达式1){
执行代码块1;
}else if(条件表达式2){
执行代码块2;
//....
}else{
执行代码块n;
}
- 多分支流程图:
- 说明:
- 当条件表达式1成立时,即执行代码块一。
- 如果表达式1不成立,才去判断表达式2是否成立
- 如果表达式2成立,就执行代码块2
- 以此类推,如果所有的表达式都不成立
- 则执行else的代码块,注意:只能有一个执行入口
- 特别说明:
- 多分支可以没有else,如果所有条件表达式都不成立,则一个执行入口都没有
- 如果有else,如果所有条件表达式都不成立,则默认为执行else代码块
- 多分支案例
案例2:
主代码:
嵌套分支
- 基本介绍:
在一个分支结构完整的嵌套了另一个完整的分支结构,里面的分支结构成为内层分支,外面的分支结构称为外层分支(最好不要超过三层) - 基本语法:
if(){
if(){
if-esle
}else{
if-else
}
}
- 案例1:
- 案例2:
import java.util.Scanner;
public class Homework06{
public static void main(String[] args){
Scanner myScanner = new Scanner(System.in);
String season = myScanner.next();
int age = myScanner.nextInt();
if(season.equals("旺季")){ //这里注意字符串的比较(equals)的使用方法
if(age < 18 ){
System.out.println("票价为半价");
}else if(age >=18 && age <= 60){
System.out.println("票价为60");
}else if(age >60 ){
System.out.println("票价为20");
}
}else if(season.equals("淡季")){
if(age >=18 & age <=60){
System.out.println("票价为40");
}else{
System.out.println("票价为20");
}
}
}
}
注意:
equals 比较两个字符串的形式是否一样而
== 比较两个字符串的地址是否相同
switch分支
- 基本语法:
switch(表达式){
case 常量1 :
语句块1;
break;
case 常量2 :
语句块2;
break;
//...
case 常量n :
语句块n;
break;
default :
default 语句块;
break;
}
- 解读:
- switch关键字,表示switch分支
- 表达式对应一个值
3 .case常量1:当表达式的值等于常量1,就执行语句块1 - break:表示退出switch
- 如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配case常量2
- 如果一个都没有匹配上,执行default语句
- switch细节
- 表达式数据类型,应和case后的常量类型一致,或者是可以自动转换成可以比较的类型,比如输入的是字符,而常量是 int
- switch(表达式)中的表达式的返回值必须是:(byte,short,int,enum,String)
- case句子中的值必须是常量,而不能是变量
- default子句是可选的,当没有匹配的case时,执行default
- break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break程序会顺序执行到switch结尾
- 案例:
import java.util.Scanner;
public class Homework09{
public static void main(String[] args){
Scanner myScanner = new Scanner(System.in);
int month = myScanner.nextInt();
switch(month){
case 3 :
case 4 :
case 5 :
System.out.println("春季");
break;
case 6 :
case 7 :
case 8 :
System.out.println("夏季");
break;
case 9 :
case 10 :
case 11 :
System.out.println("秋季");
break;
case 12 :
case 1 :
case 2 :
System.out.println("冬季");
break;
}
}
}
switch和if的比较
- 如果判断的具体数值不多,而且符合byte,short,int,char,enum,String这六种类型。虽然两个语句都可以用,建议使用switch语句。
- 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的范围很广泛
for循环控制
- 基本语法:
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(可以多条语句);
}
- 说明:
- for关键字,表示循环控制
- for有四要素:(1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代
- 循环操作,这里可以有多条语句,也就是我们要循环的代码
- 如果循环操作(语句)只有一条语句,可以省略{},但建议不要省略
-
for循环流程图
-
for循环细节
- 循环条件时返回一个布尔值的表达式
- for(;循环条件;)中的初始化和变量迭代可以写到其他地方,但是两边的分号不能省略
- 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
- 使用内存分析法:
- for循环练习
- 打印1~100之间所有时9的倍数的整数统计个数及总和【化繁为简,先死后活】
while 循环控制
- 基本语法:
循环变量的初始化;
while(循环条件){
循环体(语句);
循环变量迭代;
}
- 说明:
- while 循环也有四要素
- 只是四要素放的位置不一样
- while循环流程图
- while 循环细节说明
- 循环条件是返回一个布尔值的表达式
- while 循环是先判断再执行语句
- 案例
do-while循环控制
- 基本语法:
循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件); //注意这里的分号
- 说明:
- do-while是关键字
- 也有循环四要素,只是位置不一样
- 限制性,再判断,也就是说,一定会执行一次
- 最后有一个分号;
- while和do-while区别,在于有没有执行
-
do-while流程图
-
案例:
-
do-while循环控制细节:
1.循环条件是返回一个布尔类型的表达式
2.do-while循环是先执行,再判断,因此它至少执行一次 -
do-while练习
多重控制
- 介绍:
1.将一个循环放在另一个循环体内,就形成了嵌套循环。其中for,while,do-while均可以作为外层循环和内层循环。【建议一般最多不要超过三层,否则代码的可读性很差】
2.设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次 - 多重循环步骤分析(内存分析法)
- 案例:
下面是韩老师源代码(有编程思想):
import java.util.Scanner;
public class MulForExercise01 {
//编写一个main方法
public static void main(String[] args) {
//统计3个班成绩情况,每个班有5名同学,
//求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
//统计三个班及格人数,每个班有5名同学。
//
//思路分析:
//化繁为简
//(1) 先计算一个班 , 5个学生的成绩和平均分 , 使用for
//1.1 创建 Scanner 对象然后,接收用户输入
//1.2 得到该班级的平均分 , 定义一个 doubel sum 把该班级5个学生的成绩累积
//(2) 统计3个班(每个班5个学生) 平均分
//(3) 所有班级的平均分
//3.1 定义一个变量,double totalScore 累积所有学生的成绩
//3.2 当多重循环结束后,totalScore / (3 * 5)
//(4) 统计三个班及格人数
//4.1 定义变量 int passNum = 0; 当有一个学生成绩>=60, passNum++
//4.2 如果 >= 60 passNum++
//(5) 可以优化[效率,可读性, 结构]
//创建 Scanner 对象
Scanner myScanner = new Scanner(System.in);
double totalScore = 0; //累积所有学生的成绩
int passNum = 0;//累积 及格人数
int classNum = 3; //班级个数
int stuNum = 5;//学生个数
for( int i = 1; i <= classNum; i++) {//i 表示班级
double sum = 0; //一个班级的总分
for( int j = 1; j <= stuNum; j++) {//j 表示学生
System.out.println("请数第"+i+"个班的第"+j+"个学生的成绩");
double score = myScanner.nextDouble();
//当有一个学生成绩>=60, passNum++
if(score >= 60) {
passNum++;
}
sum += score; //累积
System.out.println("成绩为" + score);
}
//因为sum 是 5个学生的总成绩
System.out.println("sum=" + sum + " 平均分=" + (sum / stuNum));
//把 sum 累积到 totalScore
totalScore += sum;
}
System.out.println("三个班总分="+ totalScore
+ " 平均分=" + totalScore / (classNum*stuNum));
System.out.println("及格人数=" + passNum);
}
}
- 案例2:
下面是韩老师源代码(有编程思想):
public class Stars {
//编写一个main方法
public static void main(String[] args) {
/*
*
* *
* *
********
思路分析
化繁为简
1. 先打印一个矩形
*****
*****
*****
*****
*****
2. 打印半个金字塔
* //第1层 有 1个*
** //第2层 有 2个*
*** //第3层 有 3个*
**** //第4层 有 4个*
***** //第5层 有 5个*
3. 打印整个金字塔
* //第1层 有 1个* 2 * 1 -1 有4=(总层数-1)个空格
*** //第2层 有 3个* 2 * 2 -1 有3=(总层数-2)个空格
***** //第3层 有 5个* 2 * 3 -1 有2=(总层数-3)个空格
******* //第4层 有 7个* 2 * 4 -1 有1=(总层数-4)个空格
********* //第5层 有 9个* 2 * 5 -1 有0=(总层数-5)个空格
4. 打印空心的金字塔 [最难的]
* //第1层 有 1个* 当前行的第一个位置是*,最后一个位置也是*
* * //第2层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
* * //第3层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
* * //第4层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
********* //第5层 有 9个* 全部输出*
先死后活
5 层数做成变量 int totalLevel = 5;
//小伙伴 技术到位,就可以很快的把代码写出
*/
int totalLevel = 20; //层数
for(int i = 1; i <= totalLevel; i++) { //i 表示层数
//在输出*之前,还有输出 对应空格 = 总层数-当前层
for(int k = 1; k <= totalLevel - i; k++ ) {
System.out.print(" ");
}
//控制打印每层的*个数
for(int j = 1;j <= 2 * i - 1;j++) {
//当前行的第一个位置是*,最后一个位置也是*, 最后一层全部 *
if(j == 1 || j == 2 * i - 1 || i == totalLevel) {
System.out.print("*");
} else { //其他情况输出空格
System.out.print(" ");
}
}
//每打印完一层的*后,就换行 println本身会换行
System.out.println("");
}
}
}
转跳控制语句
break
- 基本介绍:
break语句用于终止某个语句块的执行,一般使用在switch或者循环中 - 基本语法
{
....
break;
....
}
- 以while使用break为例,流程图:
- 快速入门
- 案例(有random的使用):
random返回的数在[0,1)内,要随机生成0~100的数要×100 - brea语句细节:
1.break语句出现在多重循环嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
2.标签的使用
注:
1.break语句可以指定退出那一层
2.label1是标签,由程序员绝指定
3.break后指定到哪个label就是退出到哪里
4.在实际的开发中,尽量不要使用标签
5.如果没有指定break。默认退出最近的循环体
continue
- 基本介绍:
1.continue语句用于结束本次循环,继续执行下一次循环
2.continue语句出现在多重嵌套循环的循环语句体中时,可以通过标签指明要跳过的时哪一层循环 - 基本语法
{
....
continue;
....
}
- 以switch使用continue举例,画出流程图:
- 案例:
return
- 介绍:
return使用在方法,表示跳出当前所在的方法,后面学习方法详细介绍。注:如果return写在main方法中,退出程序
最后
附上韩顺平老师这节内容的章节总结原视频有助于知识梳理
进度153/910 ,学习永无止境!!!