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 }

结论

流程控制语句是程序基本语句,复习用。

 

参考博客:

(1)https://www.cnblogs.com/adamjwh/p/8329496.html

posted @ 2019-08-04 23:56  斐波那切  阅读(563)  评论(0编辑  收藏  举报