zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C++ 实现B+树
    SSM项目--
    spring+mybatis使用MapperScannerConfigurer简化配置
    SpringMVC复习总结
    MyBatis复习总结
    ajax
    几种常用页面的跳转
    MyShop-不用框架的基础javaweb项目
    jsp
    Guava 工具类之joiner的使用
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/11297402.html
Copyright © 2011-2022 走看看