接下来记录一下Java流程控制语句,包括条件语句(if-else)、选择语句(switch-case)和循环语句(while和for)。全文使用例子来记录,可以更好的理解上述流程控制语句。
流程控制语句
流程控制结构有顺序结构,分支结构和循环结构。
(1)顺序结构,代码从上到下从左到右执行
(2)分支结构,有if、if-else、if-else if,switch-case
(3)循环结构,有while,do-while和for
if
语法格式为:
if(逻辑判断){
代码块;
}
案例 判断一个数是奇数还是偶数,使用if可以完成。
1 importjava.util.Scanner;2 public classIfCase{3 public static voidmain(String[] args){4 //使用if判断一个数是奇数还是偶数
5 Scanner scan=newScanner(System.in);6 int inputNumber=scan.nextInt();7 if(inputNumber%2==0){8 System.out.println("这个数是偶数");9 }10 if(inputNumber%2==1){11 System.out.println("这个数是奇数");12 }13 }14 }
测试结果
if是最简单的逻辑判断,如果有多个条件则需要写多个if判断。
if-else
语法格式为:
if(逻辑判断){
代码块1;
}else{
代码块2;
}
如果逻辑判断为true,则执行代码块1,否则执行代码块2。
案例:输入三个整数,得到三个数中的最大值。
1 importjava.util.Scanner;2 public classIfCase1{3 public static voidmain(String[] args){4 //使用if-else判断三个数中的最大数
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入三个整数");7 int a=scan.nextInt();8 int b=scan.nextInt();9 int c=scan.nextInt();10
11 //比较
12 if(a>=b){13 if(a>=c){14 System.out.println("最大是为"+a);15 }else{16 System.out.println("最大是为"+c);17 }18 }else{19 if(b>=c){20 System.out.println("最大是为"+b);21 }else{22 System.out.println("最大是为"+c);23 }24 }25 }26 }
测试结果
if-else整体上让代码看上去有两条分支。
if-else if
语法格式为:
if(逻辑判断1){
代码块1;
}else if(逻辑判断2){
代码块2;
}
...
else{
最后代码块;
}
案例:根据分数大小定等级,如90→A,80→B,70→C等,这个如果用if-else来实现,会显得代码可阅读性很差,使用if-else if效果更好。
1importjava.util.Scanner;2 public classIfCase2{3 public static voidmain(String[] args){4 //使用if-else if来输出分数的等级
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入分数");7 int score=scan.nextInt();8
9 //给分数分级
10 if(score>100||score<0){11 System.out.println("非法的分数");12 }else if(score>=90){13 System.out.println("A");14 }else if(score>=80){15 System.out.println("B");16 }else if(score>=70){17 System.out.println("C");18 }else if(score>=60){19 System.out.println("D");20 }else{21 System.out.println("E");22 }23 }24 }
测试结果
if-else if代码看起来更加的有层次感,可读性较好,另外如果if或者else中代码块只有一句话,大括号可以省略。
switch-case
语法格式为:
switch(选项){
case 选项1: 代码块1;break;
case 选项2: 代码块2;break;
case 选项3: 代码块3;break;
...
default: 代码块;break;
}
案例1:根据输入的数字1~7,输出对应的星期英文名。
1 importjava.util.Scanner;2 public classSwitchCase{3 public static voidmain(String[] args){4 //使用switch-case语句输出星期
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入数字1~7");7 int num=scan.nextInt();8
9 //先限定
10 if(num<1||num>7){11 System.out.println("不是范围内数字");12 return;13 }14
15 switch(num){16 case 1:17 System.out.println("Monday");18 break;19
20 case 2:21 System.out.println("Tuesday");22 break;23
24 case 3:25 System.out.println("Wednesday");26 break;27
28 case 4:29 System.out.println("Thursday");30 break;31
32 case 5:33 System.out.println("Friday");34 break;35
36 case 6:37 System.out.println("Saturday");38 break;39 //case 7 最后一个写成default也可以,前面加个限定就行
40 default:41 System.out.println("Sunday");42 break;43 }44 }45 }
测试结果
switch-case中,switch中的选项只能是byte,short,char和int,在JDK1.7之后可以使用String。另外break的位置对执行结果也有影响,case后的条件满足,就寻找到了程序入口,代码块什么时候停由后面的break决定,或者执行到最后停止,具体参考如下案例。
案例2:输入月份,判断这个月有多少天。
1 importjava.util.Scanner;2 public classMonthDay{3 public static voidmain(String[] args){4 //灵活使用break的位置
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入月份");7 int month=scan.nextInt();8 //只考虑break的用法暂时不考虑是否严谨
9 switch(month){10 case 1:11 case 3:12 case 5:13 case 7:14 case 8:15 case 10:16 case 12:17 System.out.println("这个月有31天");18 break;19
20 case 4:21 case 6:22 case 9:23 case 11:24 System.out.println("这个月有30天");25 break;26
27 //暂时按照28天来处理
28 case 2:29 System.out.println("这个月有28天");30
31 default:32 System.out.println("输入月份不合法");33 }34 }35 }
测试结果
案例3:根据输入的年月日,计算这天在这一年中是第多少天。
1 importjava.util.Scanner;2 public classDayCalculate{3 public static voidmain(String[] args){4 //计算这天是第多少天
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入年");7 int year=scan.nextInt();8 System.out.println("请输入月");9 int month=scan.nextInt();10 System.out.println("请输入日");11 int day=scan.nextInt();12
13 //临时变量
14 int sum=0;15
16 //年的作用是为了判断2月有多少天,日的作用是判断当月的天数,月的作用是判断前几个月一共有多少天
17 switch(month){18 //进入多少月份,先计算这个月前面月份的总天数
19 case 12:sum+=30;20 case 11:sum+=31;21 case 10:sum+=30;22 case 9:sum+=31;23 case 8:sum+=31;24 case 7:sum+=30;25 case 6:sum+=31;26 case 5:sum+=30;27 case 4:sum+=31;28 //3月进入,需要看2月的天数,需要判断闰年和平年
29 case 3:30 if(year%400==0||(year%4==0&&year%100!=0)){31 sum+=29;32 }else{33 sum+=28;34 }35 case 2:sum+=31;36 case 1:sum+=0;37 //break可以不用加
38 break;39 }40 //输出
41 System.out.println("这是"+year+"年的第"+(sum+day)+"天");42 }43 }
测试结果
while
语法格式为:
while(逻辑值){
代码块;
新的逻辑值;
}
逻辑值为true,才能执行代码块,然后更新逻辑值再次判断是否为true,如此反复循环,适用于不知道次数的循环案例。
案例1:输入5个数,得到其中最大的值。
1 importjava.util.Scanner;2 public classGetMaxNumber{3 public static voidmain(String[] args){4 //使用while循环
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入5个数");7 int max=scan.nextInt();8 int count=0;9 while(count<4){10 int num=scan.nextInt();11 if(max
17 System.out.println("最大的值是"+max);18 }19 }
测试结果
案例2:输入一个整数,判断它是一个几位数,如输入98999,得到5位数的结果。
1 importjava.util.Scanner;2 public classGetBitNumber{3 public static voidmain(String[] args){4 //判断一个数有多少位
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入一个整数");7 int num=scan.nextInt();8 int bitNum=0;//位数9 //int
10 while(true){11 num=num/10;12 if(num>0){13 bitNum++;14 }15 if(num==0){16 bitNum++;17 break;18 }19 }20 System.out.println("这个数位数为"+bitNum);21 }22 }
测试结果
案例3:输入一个整数,打印这个数的所有因数,如输入8,需打印出1,2,4,8。
1 importjava.util.Scanner;2 public classGetFactor{3 public static voidmain(String[] args){4 //判断一个数的所有公约数
5 Scanner scan=newScanner(System.in);6 System.out.println("请输入一个整数");7 int num=scan.nextInt();8 int index=1;9 while(index<=num){10 if(num%index==0){11 System.out.print(index+" ");12 }13 index++;14 }15 System.out.println();16 }17 }
测试结果
while循环使用比较多,还有一个do-while循环,这个用的比较少,就先不说明了,反正是不管while中逻辑判断是否满足,都至少需要执行完一次do中的代码块。
for
语法格式为:
for(循环变量定义:控制条件:循环变量变化){
代码块;
}
接下来使用打印星星来理解for循环。
案例1:打印一个星星图案,要是直角三角形的,再倒过来打印。
案例2:打印一个星星图案,要是菱形。
1 public classDrawTriangle{2 public static voidmain(String[] args){3 //1 打印一个直角三角形,左边直角
4 for(int i=1;i<=8;i++){5 for(int j=1;j<=i;j++){6 System.out.print("*");7 }8 System.out.println();9 }10
11 System.out.println();12
13 //2 将上面三角形倒过来
14 for(int i=8;i>=1;i--){15 for(int j=i;j>=1;j--){16 System.out.print("*");17 }18 System.out.println();19 }20
21 System.out.println();22
23 //3 打印一个直角三角形,右边直角
24 for(int i=1;i<=8;i++){25 //打印空格的次数
26 for(int j=1;j<=8-i;j++){27 System.out.print(" ");28 }29 //打印星星的次数
30 for(int j=1;j<=i;j++){31 System.out.print("*");32 }33 System.out.println();34 }35
36 System.out.println();37
38 //4 将上面三角形倒过来
39 for(int i=8;i>=1;i--){40 //打印空格的次数
41 for(int j=1;j<=8-i;j++){42 System.out.print(" ");43 }44 //打印星星的次数
45 for(int j=1;j<=i;j++){46 System.out.print("*");47 }48 System.out.println();49 }50
51 //打印一个等腰三角
52 for(int i=1;i<=8;i++){53 //打印空格的次数
54 for(int j=1;j<=8-i;j++){55 System.out.print(" ");56 }57 //打印星星的次数
58 for(int j=1;j<=i;j++){59 System.out.print("*"+" ");60 }61 System.out.println();62 }63
64 //5 打印一个等腰三角形,但是这个星星数是按照1 3 5 7 9增加,如下图所示
65 /*
66 *67 * * *68 * * * * *69 * * *70 *71 */
72 //上面四个例子其实已经给了提示,可以组合起来就是一个菱形
73 for(int i=1;i<=8;i++){74 //打印左边75 //打印空格的次数
76 for(int j=1;j<=8-i;j++){77 System.out.print(" ");78 }79 //打印星星的次数
80 for(int j=1;j<=i;j++){81 System.out.print("*");82 }83 //打印右边,只打印出星星,空格可以不用管
84 for(int j=1;j<=i-1;j++){85 //i-1:最左边的星星不需要打印
86 System.out.print("*");87 }88
89 System.out.println();90 }91 //将上面三角形倒过来
92 for(int i=8;i>=1;i--){93 //打印左边94 //打印空格的次数
95 for(int j=1;j<=8-i;j++){96 System.out.print(" ");97 }98 //打印星星的次数
99 for(int j=1;j<=i;j++){100 System.out.print("*");101 }102 //打印右边,空格的数目不需要管
103 for(int j=1;j<=i-1;j++){104 //i-1:最左边的星星不打印
105 System.out.print("*");106 }107 System.out.println();108 }109 }110 }
测试结果
break&continue关键字
break关键字用于switch-case和循环语句,用于终止当前层的循环,外层循环不受影响。
continue关键字也用于switch-case和循环语句,用于终止当前的循环逻辑,当前循环后面的代码不再执行,继续进行下一次循环。
案例1:break关键字使用
1 public classBreakDemo{2 public static voidmain(String[] args){3 //测试break
4 for(int i=0;i<9;i++){5 System.out.println(i);6 if(i%2==1){7 break;8 }9 }10 //两层循环测试,只结束内存循环
11 for(int i=0;i<9;i++){12 for(int j=0;j<9;j++){13 if(j%2==1){14 break;15 }16 System.out.println(i+"|"+j);17 }18 }19 }20 }
测试结果
可以看出break后,break所属层的代码都不再继续执行。
案例2:continue关键字使用
1 public classContinueDemo{2 public static voidmain(String[] args){3 //测试continue
4 for(int i=0;i<9;i++){5 if(i%2==1){6 continue;7 }8 System.out.println(i);9 }10 //两层循环测试,只影响continue所在的循环
11 for(int i=0;i<9;i++){12 for(int j=0;j<9;j++){13 if(j%2==1){14 continue;15 }16 //如果是奇数,后面不再打印
17 System.out.println(i+"|"+j);18 }19 }20 }21 }
测试结果
可以看出,continue关键字使用后,当前循环逻辑终止,但是不影响下一个循环逻辑的继续执行,因此继续输出后面的偶数。
经典练习
(1)百钱百鸡,即用100文钱买100只鸡,具体参考代码解释
1 public classMoneyAndChick{2 public static voidmain(String[] args){3 //百钱白鸡
4 /**
5 3文钱-1只公鸡6 2文钱-1只母鸡7 1文钱-3只小鸡8 */
9 int numberCock;//公鸡数目
10 int numberBiddy;//母鸡数目
11 for(numberCock=0;numberCock<=33;numberCock++){12 for(numberBiddy=0;numberBiddy<=50;numberBiddy++){13 //小鸡一定是3的倍数
14 if((100-numberCock-numberBiddy)%3==0){15 int price=numberCock*3+numberBiddy*2+(100-numberCock-numberBiddy)/3;16 //System.out.println("开始判断");
17 if(price==100){18 System.out.println("公鸡数"+numberCock);19 System.out.println("母鸡数"+numberBiddy);20 System.out.println("小鸡数"+(100-numberCock-numberBiddy));21 System.out.println("---------------------分割线---------------------");22 }23 }24 }25 }26 }27 }
(2)判断一个数是否为质数,这个代码有优化,以前是没考虑到一个数一半以后的数不需要考虑。
1 importjava.util.Scanner;2 public classPrimeNumber{3 public static voidmain(String[] args){4 //判断是否为质数
5 System.out.println("请输入数字");6 Scanner scan=newScanner(System.in);7 int number=scan.nextInt();8 //质数只能被1和本身整除,并且只需要比较2~number/2的即可,后面的数除了肯定是一点几的数,无需考虑
9 boolean flag=true;10 for(int i=2;i<=number/2;i++){11 if(number%i==0){12 flag=false;13 break;14 }15 }16 if(flag){17 System.out.println(number+"是质数");18 }else{19 System.out.println(number+"不是质数");20 }21 }22 }
(3)求一个数所有的质因数
1 importjava.util.Scanner;2 public classPrimeFactor{3 public static voidmain(String[] args){4 //求出一个数所有的质因数
5 /**
6 质因数:因数全为质数7 */
8 System.out.println("请输入一个数");9 Scanner scan=newScanner(System.in);10 int number=scan.nextInt();11 for(int factor=2; number!=1; ){12 if(number%factor==0){13 System.out.println(factor);14 number/=factor;15 }else{16 factor++;17 }18 }19 }20 }
(4)使用一个for循环完成九九乘法表
1 public classNinePlusNine{2 public static voidmain(String[] args){3 //两个for循环打印9*9循环表
4 System.out.println("两个for循环打印9*9循环表");5 for(int i=1;i<=9;i++){6 for(int j=1;j<=i;j++){7 System.out.print(j+"*"+i+"="+i*j+" ");8 }9 System.out.println();10 }11 //一个for循环打印9*9循环表
12 System.out.println("一个for循环打印9*9循环表");13 for(int i=1,j=1;i<=9;j++){14 System.out.print(j+"*"+i+"="+i*j+" ");15 if(i==j){16 i++;17 j=0;18 //换行
19 System.out.println();20 }21 }22 //一个for循环打印9*9循环表,换一种写法
23 System.out.println("一个for循环打印9*9循环表");24 for(int i=1,j=1;i<=9; ){25 System.out.print(j+"*"+i+"="+i*j+" ");26 if(i==j){27 i++;28 j=0;29 //换行
30 System.out.println();31 }32 //j自增
33 j++;34 }35 }36 }
结论
流程控制语句是程序基本语句,复习用。
参考博客: