目录
三、循环控制(for; while; dowhile; 多重循环)
程序运行的流程控制决定程序是如何执行的
一、顺序控制
程序从上到下逐行地执行,中间没有任何判断和跳转。(程序默认的)
- 向前引用原则:要先定义再引用。
二、分支控制(if; else; switch)
1、if else
让程序有选择的执行,分支控制有三种:
- 1、单分支
- 如下:当条件表达式为真的时候,就会执行{}中的代码,如果为false就不执行。特别说明:如果{}中只有一条语句,大括号可以省略(但是建议写上)
- 2、双分支
- 当条件表达式成立,就执行代码块1,否则执行代码块2.同样{}中只有一条语句可以省略{}
- 3、多分支
- 当条件表达式1成立时,即执行代码块1.如果表达式1不成立,再去判断表达式2,如果所有表达式都不成立的时候,才会去执行else。
- 注意:多分支可以没有else (如果前面所有条件多不成立,那么一个执行入口都没有)
- 分支结果的演示:下面这属于嵌套分支
import java.util.Scanner;
public class Example {
public static void main(String[] args){
// 多分支演示(下面有4种情况)
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入分数");
int score = myScanner.nextInt();
if (score >=1 && score<=100){ //这是双分支嵌套多分支
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("输入范围错误");
}
}
}
- 注意: 如果boolean b=true; if( b=false){} 这个if中的不会执行的,为false。
2、switch分支
- 表达式对应一个具体的值(运行之后)。
- case 常量1:xxx (当表达式的值等于常量1,就执行语句块1)
- break:表示退出switch (一般每个case下的表达式后面都跟一个break)
- default:如果一个都没匹配上,就执行default: xxx 中的语句块。
- 穿透现象:如果语句块1后面没有break,那么会直接执行语句块2(不会再判断case2)
- 要是整个switch都没有break,那么在一次执行后,陆续执行后面所有的语句块
- 演示:
import java.util.Scanner;
public class Switch01 {
public static void main(String[] args){
// 接收一个字符(a表示星期一、b表示星期二)
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入一个字符a-g");
char c1 = myScanner.next().charAt(0); //取接收到的第一个字符
switch(c1) { // 在java中有值返回,就可以认为是一个表达式
case 'a' :
System.out.println("今天星期一");
break;
case 'b' :
System.out.println("今天星期二");
break;
case 'c' :
System.out.println("今天星期三");
break;
// …… ……
default:
System.out.println("没有匹配上");
}
}
}
-
细节注意:
-
表达式的数据类型,应该和case后的常量类型一致。或者能够自动转换为可以匹配的类型(如果不匹配,会直接报错)(比如char可以自动转为int)
-
switch表达式中返回的值必须为以下类型:byte、short、int、char、enum、String
-
case子句中的值必须为常量/常量表达式,不能是变量。(即使给常量赋值了也不行)
-
default可以没有,只不过可能就是没有结果。(就像可以没有else一样)
-
如果没有写break,程序会顺序执行到switc结尾(包括default),除非又遇到break。
-
比如想123对应输出春季,就可以用穿透法。(case 1和2的时候不写输出也不写break,统一在case 3 后面再写 print(春季) break)。
-
-
-
switch 和 if else的使用选择:
-
如果判断的具体数值不多(比如坦克大战游戏开发里面只有上下左右),且符合byte、short、int、char、enum、String六种类型,建议使用switch(看起来比较简洁)。
-
如果是对区间进行判断,或者结果为bollean类型判断,使用if (if适用范围更广)。
-
三、循环控制(for; while; dowhile; 多重循环)
顾名思义,作用是可以让代码循环多次执行。
1、for循环
- 所以是初始化之后,每一轮先判断,再执行语句,再变量迭代。
- 注意点:
- 循环条件一定的返回一个boolean类型的值(i<10)
- 细节1:初始化和变量迭代可以写到其他地方,但是分号不能省略 for ( ; i<10 ; )
- 细节2:循环初始值可以有多条初始化语句,但要求类型一样。变量迭代也可以有多个
public class FOR {
public static void main(String[] args){
// 细节1
int i = 1; // 循环变量的初始化可以写在外面(这样在for之外也能使用)
for ( ; i <= 10 ; ){ // 如果是for(;;)就是无限循环,也有配合break的使用场景
System.out.println("你好"+i);
i++; // 变量迭代也可以写在这里
}
System.out.println("你好"+i); //输出11
// 细节2
for (int i = 0,j = 0; i<3; i++,j+=2){
System.out.println(i,j); // 最后输出2,4
}
}
}
2、while循环
所以while循环也有四要素,只是每个要素放的位置和for不一样。
注意:while循环的判断仍然为Boolean值,先判断再执行。
public class WHILE {
public static void main(String[] args){
// 打印1-100之间所有能被3整除的数
int i = 1;
while(i <= 100){
if(i % 3 ==0){
System.out.println("i="+i);
}
i++; // 主意i++要写在语句的外面,因为他和是否能被整除无关,都要迭代。
}
}
}
3、do while
也有四要素,位置也发生了变化。先执行再判断(和while不同),所以至少会执行一次。
public class DOWHILE {
public static void main(String[] args){
// 统计1-200之间能被5整除但是不能被3整除的数
int i = 1;
do {
if(i % 5 ==0 && i % 3 != 0){
System.out.println("i="+i);
}
i++;
}while(i <= 200);
}
}
4、多重循环(重难点)
- 定义:将一个循环放在另一个循环体内,就形成了嵌套循环。(for, while, do while均可以作为外层循环或内层循环)
- 建议一般使用2层,不要超过3层(否则代码可读性很差)。
- 实质上嵌套循环,就是把内层循环当成外层循环的循环体。(把内层循环完之后才会跳出来循环外层。m×n次)
- 比如看下面这个例子(编写逻辑是化繁为简! 先假设只有一个班,计算一个班的平均分,再加上外层循环,共有3个班)
import java.util.Scanner;
// 一共有3个班,一个班有5名同学
// 求出各个班的平均分和所有班级的平均分、统计3个班的及格人数
public class MulForExercise01 {
public static void main(String[] args){
Scanner myScanner = new Scanner(System.in);
double allsum = 0;
int passnum = 0; // 及格人数
for(int i=1; i<=3; i++){ // 3个班
double sum = 0;
for(int j=1; j<=5; j++){ // 每个班5个学生
System.out.println("请输入第"+i+"个班的第"+j+"个学生的成绩");
double score = myScanner.nextDouble();
if(score >= 60){
passnum++; // 统计及格人数
}
sum += score; // 单个班级总分的累计
}
System.out.println("第"+i+"个班的平均分为:"+ (sum/5));
allsum += sum; // 所有班级总分的累计
}
System.out.println("所有班级的平均分为:"+ (allsum/15));
System.out.println("所有班级的及格人数为:"+ passnum);
}
}
- 练习之打印空心金字塔(这是一个比较经典的例题):println是换行,print是不换行
public class MulForExercise01 {
public static void main(String[] args){
// 打印完整的金字塔
// * 第1层:1 空4格; 2*层数-1个星星,
// *** 第2层:3 空3格; 总层数-当前层数
// ***** 第3层:5 空2格;
// ******* 第4层:7
// ********* 第5层:9
for(int i=1; i<=5; i++){
for(int k=1; k<=5-i; k++){
System.out.print(" "); // 打印空格
}
for(int j=1; j<=2*i-1; j++){
System.out.print("*"); // 打印星
}
System.out.println(""); // 换个行
}
// 打印空心金字塔 (除首行和尾行,每行的第一个位置和最后一个位置是*)
// * 第1层:1 空4格; 2*层数-1个星星,
// * * 第2层:3 空3格; 总层数-当前层数
// * * 第3层:5 空2格;
// * * 第4层:7
// ********* 第5层:9
for(int i=1; i<=5; i++){
for(int k=1; k<=5-i; k++){
System.out.print(" "); // 空格还是一样的打
}
for(int j=1; j<=2*i-1; j++){
// 如果当前行的第一个和最后一个位置,或者是最后一行就打*,否则就打空格
if(j==1 || j=2*i-1 || i=5){
System.out.print("*");
}
else{
System.out.print(" ");
}
}
System.out.println(""); // 换个行
}
}
}
四、break(跳转控制语句)
比如有这种需求:随机生成1-100个数,直到生成了97这个数,看看一共用了几次。
break可以 在循环中当某个条件满足时,就终止循环。(for、while、do-while都行)
// 1-100内的数求和,当和第一次大于20的当前数
public class break01 {
public static void main(String[] args){
int sum = 0;
for(int i=1; i<=100; i++){
sum += i; // 累计
if(sum > 20){
System.out.println("和>20的时候,当前数为:"+i);
break; // 跳出for循环
}
}
System.out.println("继续执行"); // break后,循环外面的还是会继续执行
}
}
- break语句出现在多层嵌套的语句块中的时候,可以通过标签指明要终止的是哪一层循环。
- 可以对每层循环定义一个标签(自己定义,可以是abc),然后 break abc 退出对应的循环。
- 在实际的开发中,尽量不要使用标签。可读性很差。
- 如果没有指定break,默认退出最近的循环。
public class breakdetail {
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; //默认 break label2; 结果就会输出4个01
// 要是写break label1,那么只会输出一个01,就跳出了外层循环
// 直接跳到“继续执行”的这一行
}
System.out.println("j="+j);
}
}
System.out.println("继续执行"); // break后,循环外面的还是会继续执行
}
}
五、continue
- 用于结束本次循环,继续执行下一次循环。(也就是仅仅本次的后续语句不会再执行了)
- 同样可以用标签来制定要跳过的是哪一层循环,也是尽量不要用。
public class Contiune01 {
public static void main(String[] args){
int i = 1;
while(i<=4){
i++;
if(i==2){
continue; // 即i=2的时候,跳出本次循环,不会执行后面的打印语句
}
System.out.println("i="+i);
// 会输出3 4 5
}
}
}
下面这个就只会输出2次01
六、return
- 如果使用在方法里面,就表示跳出所在的方法。(如果写在main方法,就退出程序)
public class Return01 {
public static void main(String[] args){
for(int i=1; i<=5; i++){
if(i==3){
System.out.println("你好"+i);
//break; 最后输出:再见 再见 你好3 继续
//continue; 最后输出:再见 再见 你好3 再见 再见 继续
return; // 这是用在main方法中,即直接跳出程序
// 输出:再见 再见 你好3
}
System.out.println("再见");
}
System.out.println("继续");
}
}