Java流程控制语句
接下来记录一下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 import java.util.Scanner; 2 public class IfCase{ 3 public static void main(String[] args){ 4 //使用if判断一个数是奇数还是偶数 5 Scanner scan=new Scanner(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 import java.util.Scanner; 2 public class IfCase1{ 3 public static void main(String[] args){ 4 //使用if-else判断三个数中的最大数 5 Scanner scan=new Scanner(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效果更好。
1 import java.util.Scanner; 2 public class IfCase2{ 3 public static void main(String[] args){ 4 //使用if-else if来输出分数的等级 5 Scanner scan=new Scanner(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 import java.util.Scanner; 2 public class SwitchCase{ 3 public static void main(String[] args){ 4 //使用switch-case语句输出星期 5 Scanner scan=new Scanner(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 import java.util.Scanner; 2 public class MonthDay{ 3 public static void main(String[] args){ 4 //灵活使用break的位置 5 Scanner scan=new Scanner(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 import java.util.Scanner; 2 public class DayCalculate{ 3 public static void main(String[] args){ 4 //计算这天是第多少天 5 Scanner scan=new Scanner(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 import java.util.Scanner; 2 public class GetMaxNumber{ 3 public static void main(String[] args){ 4 //使用while循环 5 Scanner scan=new Scanner(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<num){ 12 max=num; 13 } 14 count++; 15 } 16 //输出 17 System.out.println("最大的值是"+max); 18 } 19 }
测试结果
案例2:输入一个整数,判断它是一个几位数,如输入98999,得到5位数的结果。
1 import java.util.Scanner; 2 public class GetBitNumber{ 3 public static void main(String[] args){ 4 //判断一个数有多少位 5 Scanner scan=new Scanner(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 import java.util.Scanner; 2 public class GetFactor{ 3 public static void main(String[] args){ 4 //判断一个数的所有公约数 5 Scanner scan=new Scanner(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 class DrawTriangle{ 2 public static void main(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 class BreakDemo{ 2 public static void main(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 class ContinueDemo{ 2 public static void main(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 class MoneyAndChick{ 2 public static void main(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 import java.util.Scanner; 2 public class PrimeNumber{ 3 public static void main(String[] args){ 4 //判断是否为质数 5 System.out.println("请输入数字"); 6 Scanner scan=new Scanner(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 import java.util.Scanner; 2 public class PrimeFactor{ 3 public static void main(String[] args){ 4 //求出一个数所有的质因数 5 /** 6 质因数:因数全为质数 7 */ 8 System.out.println("请输入一个数"); 9 Scanner scan=new Scanner(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 class NinePlusNine{ 2 public static void main(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 }
结论
流程控制语句是程序基本语句,复习用。
参考博客: