Java程序逻辑控制

在程序开发的过程之中一共会存在有三种程序逻辑:顺序结构、分支结构、循环结构,对于之前所编写的代码大部分都是顺序结构的定义,即:所有的程序将按照定义的代码顺序依次执行。

IF分支结构

if分支结构主要是针对于关系表达式进行判断处理的分支操作。对于分支语句主要有三类的使用形式,使用的关键字:if、else。

if判断:

if (布尔表达式) {
    条件满足时执行 ;
}


if..else判断:

if (布尔表达式) {
    条件满足时执行 ;
} [else {
    条件不满足时执行 ;
}]
注意:else部分是可选[]部分,但是建议加上


多条件判断:

if (布尔表达式) {
    条件满足时执行 ;
} else if (布尔表达式) {
    条件满足时执行 ;
} else if (布尔表达式) {
    条件满足时执行 ;
} ... [else {
    条件不满足时执行 ;
}]

... 省略号表示可以继续加多个条件

if判断:只判断一次,满足就执行满足条件的语句,不满足就算了

public class JavaDemo {
    public static void main(String args[]) {
        int age = 18 ;  // 18换成21
        if (age >= 18 && age <= 20) {
            System.out.println("光荣的参与为人民服务的志愿活动!") ;
        }
        System.out.println("回到正常的生活轨迹!") ;
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
光荣的参与为人民服务的志愿活动!
回到正常的生活轨迹!

age的18换成21后代码执行:

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
回到正常的生活轨迹!

现在要进行不满足条件时的执行可以使用if..else操作。

范例:使用if..else

public class JavaDemo {
    public static void main(String args[]) {
        double money = 20.00 ;  // 把20.00换成2再次执行
        if (money >= 19.8) {
            System.out.println("很牛x走到售卖处,很霸气拿出20元,说不用找了。") ;
        } else {
            System.out.println("在昏暗的角落,等待别人剩下的东西。") ;
        }
        System.out.println("好好吃饭,好好的喝!") ;
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
很牛x走到售卖处,很霸气拿出20元,说不用找了。
好好吃饭,好好的喝!

把20.00换成2再次执行:
D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
在昏暗的角落,等待别人剩下的东西。
好好吃饭,好好的喝!

在使用if的时候最主要的特点是它可以进行若干个条件判断。在Java里面只有if..else能够执行多个条件判断。

范例:多条件判断

public class JavaDemo {
    public static void main(String args[]) {
        double score = 90 ;
        if (score >= 90 && score <= 100) {
            System.out.println("优等生。") ;
        } else if(score >= 60 && score < 90) {
            System.out.println("良等生。") ;
        } else {
            System.out.println("差等生。") ;
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
优等生。

在进行多条件判断的时候可以不写上else语句,但是好的习惯一定要写上else语句。

SWITCH开关语句

switch是一个开关语句,它主要是根据内容来进行的判断,需要注意的是 switch 中可以判断的只能够是数据(int、char、枚举、String)而不能够使用逻辑判断,它的语法如下:

switch(数据) {
    case 数值 : {
        数值满足时执行 ;
        [break ;]
    }
    case 数值 : 
        数值满足时执行 ;
        [break ;]
    [default: 
        所有判断数值不满足时的执行 ;
        [break ;]
    ]
}

case处的大括号{}是可选的。根据习惯来操作。
default也是可选[]的。

范例:观察switch语句

public class JavaDemo {
    public static void main(String args[]) {
        int ch = 2 ;  // 把2换成1再次执行
        switch (ch) {
            case 2 :
                System.out.println("设置的内容是2。") ;
            case 1 : {
                System.out.println("设置的内容是1。") ;
            }
            default : {
                System.out.println("没有内容满足。") ;
            }
        }
    }
}


D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
设置的内容是2。
设置的内容是1。
没有内容满足。

ch的2换成1再次执行:
D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
设置的内容是1。
没有内容满足。

switch语句在进行设计的时候,如果你在每一个case后面没有追加break语句,那么会在第一个匹配的case之后继续执行,一直到全部的switch中后续代码执行完毕或者遇见break。

范例:使用break

public class JavaDemo {
    public static void main(String args[]) {
        int ch = 2 ;
        switch (ch) {
            case 2 :
                System.out.println("设置的内容是2。") ;
                break ;
            case 1 : {
                System.out.println("设置的内容是1。") ;
                break ;
            }
            default : {
                System.out.println("没有内容满足。") ;
                break ;
            }
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
设置的内容是2。


这个语句什么时候会用到?
dos界面(命令行界面)会让你选择1234...的功能。
此时输入一个数字来表示选项。这个选项可以通过switch来实现。
但是它不能判断非int、非char、非枚举、非String类型。

从 JDK1.7 的时代开始,Oracle公司推出的 JDK1.7 版本里面将开发者呼吁10年以上的功能加入到了系统之中,可以进行字符串数据的判断。

范例:判断字符串

public class JavaDemo {
    public static void main(String args[]) {
        String str = "hello" ;
        switch(str) {
            case "Hello" : {
                System.out.println("Hello") ;
                break ;
            }
            case "hello" : {
                System.out.println("hello") ;
                break ;
            }
            default : {
                System.out.println("No Match") ;
            }
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
hello

switch这个语句是一个编程语言发展的重要技术。支持的常用类型String是在 JDK1.7 之后。

while循环

所谓的循环结构指的是某一段代码被重复执行的处理操作,在程序之中提供有while语句来实现循环的定义,该语句有两类使用形式:

while循环:

while (布尔表达式) {
    条件满足时执行 ;
    修改循环条件 ;
}


do...while循环:

do {
    条件满足时执行 ;
    修改循环条件 ;
} while (布尔表达式) ;
注意while最后面有一个分号

范例:实现1~100的累加

public class JavaDemo {
    public static void main(String args[]) {
        int sum = 0 ;   // 保存最终的计算总和
        int num = 1 ;   // 进行循环控制
        while (num <= 100) {    // 循环的执行条件
            sum += num ;    // 累加,与"sum = sum + num"效果类似
            num ++ ;    // 修改循环条件,然后再把这一行注释掉,没有循环条件,此时会导致死循环
        }
        System.out.println(sum) ;
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
5050


把代码中的"num ++ ; " 这一行注释掉,此时没有循环条件,再次执行代码,会导致死循环
D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
......


把代码中的"int num = 1 ;"  中的1换成200,执行代码:
D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
0

除了使用while循环之外也可以使用do...while来进行处理。

范例:使用do...while实现数字累加

public class JavaDemo {
    public static void main(String args[]) {
        int sum = 0 ;   // 保存最终的计算总和
        int num = 1 ;   // 进行循环控制
        do {
            sum += num ;    // 累加,与"sum = sum + num"效果类似
            num ++ ;    // 修改循环条件
        } while (num <= 100) ;  // 循环的执行条件
        System.out.println(sum) ;
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
5050


把代码中的"int num = 1 ;"  中的1换成200,执行代码:
D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
200

比较 while 和 do...while 二者中 "int num = 200 ;" 的结果:
while ——> 0
do...while ——> 200
此时可以看出while和do...while二者的区别

while 循环与 do...while 循环的最大差别:
while 循环是先判断后执行,而 do...while 先执行一次后判断。开发中能见到 do...while 循环的几率几乎为1%左右,99%的情况下首选的肯定是 while 循环。

for循环

for 循环也是一种常规的使用结构,其使用语法如下:

for (定义循环的初始化数值 ; 循环判断 ; 修改循环数据) {
    循环语句的执行 ;
}

范例:使用for循环实现1~100的累加

public class JavaDemo {
    public static void main(String args[]) {
        int sum = 0 ;   // 保存最终的计算总和
        for (int x = 1 ; x <= 100 ; x ++) {
            sum += x ;  // 累加
        }
        System.out.println(sum) ;
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
5050

如果现在要想更加清楚的观察到三个操作定义,可以拆开处理。

强烈不建议这种写法,了解即可。

for 循环拆开处理:

public class JavaDemo {
    public static void main(String args[]) {
        int sum = 0 ;   // 保存最终的计算总和
        int x = 1 ;     // 循环条件初始化
        for ( ; x <= 100 ; ) {  // 循环判断
            sum += x ;  // 累加
            x ++ ;      // 修改循环条件
        }
        System.out.println(sum) ;
    }
}


D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
5050

对于 while 和 for 循环的选择只有一个参考标准:
在明确确定循环次数的情况下优先选择for循环;
在不知道循环次数但是知道循环结束条件的情况下使用 while 循环;

循环控制

在循环语句定义的时候还有两个控制语句:break、continue;

1、break 主要的功能是退出整个循环结构;

public class JavaDemo {
    public static void main(String args[]) {
        for (int x = 0 ; x < 10 ; x ++) {
            System.out.print(x + "、") ;
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
0、1、2、3、4、5、6、7、8、9、


添加 break 操作后,执行代码:

public class JavaDemo {
    public static void main(String args[]) {
        for (int x = 0 ; x < 10 ; x ++) {
            if (x == 3) {   // 此处的双等不能换成单等,单等是赋值,双等是逻辑关系比较
                break ; // 整个循环结束
            }
            System.out.print(x + "、") ;
        }
    }
}


D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
0、1、2、

2、continue严格来讲只是结束当前的一次调用(结束当前循环)

public class JavaDemo {
    public static void main(String args[]) {
        for (int x = 0 ; x < 10 ; x ++) {
            if (x == 3) {
                continue ; // 退出x为3的这个循环,继续下面的条件判断
            }
            System.out.print(x + "、") ;
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
0、1、2、4、5、6、7、8、9、

当执行到了 continue 的时候就表示在当前的语句之中后续代码不再执行,而直接进行后续的判断处理

在C语言里面有一个 goto 的指令,这个指令会直接造成代码的混乱,所以在开发中一般都对其深恶痛绝,但是在Java里面可以利用 continue 实现部分 goto 的功能。最好不要用 goto 这个指令,了解即可。

public class JavaDemo {
    public static void main(String args[]) {
        point: for (int x = 0 ; x < 10 ; x ++) {
            for (int y = 0 ; y < 10 ; y ++) {
                if (x == y) {
                    continue point ;    //循环结束
                }
                System.out.print(x + "、") ;
            }
            System.out.println() ;
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
1、2、2、3、3、3、4、4、4、4、5、5、5、5、5、6、6、6、6、6、6、7、7、7、7、7、7、7、8、8、8、8、8、8、8、8、9、9、9、9、9、9、9、9、9、

解析:
当x=0,y=0,此时x与y相等,continue point ——> 执行point代码(进行x的下一个循环),所有结果中没有0出现
当x=1,y=0,此时x与y不等,System.out.print(x + "、") ——> 执行此代码后,结果:1、
接下来进行y的循环
当x=1,y=1,此时x与y相等,continue point ——> 执行point代码(进行x的下一个循环),所有结果中不会再出现第二个 1、
当x=2,y=0,此时x与y不等,System.out.print(x + "、") ——> 执行此代码后,结果:2、
接下来进行y的循环
当x=2,y=1,此时x与y不等,System.out.print(x + "、") ——> 执行此代码后,结果:2、
接下来继续y的循环
当x=2,y=2,此时x与y相等,continue point ——> 执行point代码(进行x的下一个循环),所有结果中不会再出现第三个 2、
...  ...
依次进行下去

对于此类代码强烈不建议开发者在你的开发代码中出现。
只是部分的恢复了goto功能,但是这个功能是要结合continue去用的。不到万不得已 千万不要用,程序代码会非常混乱。

了解即可
public class JavaDemo {
    public static void main(String args[]) {
        point: for (int x = 0 ; x < 10 ; x ++) {
            for (int y = 0 ; y < 3 ; y ++) {
                if (x == 3) {
                    continue point ;    //循环结束
                }
                System.out.print(x + "、") ;
            }
            System.out.println() ;
        }
    }
}


D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
0、0、0、
1、1、1、
2、2、2、
4、4、4、
5、5、5、
6、6、6、
7、7、7、
8、8、8、
9、9、9、


把上述代码 (int y = 0 ; y < 3 ; y ++) 中的"y < 3"换成"y<10",执行代码:
D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
0、0、0、0、0、0、0、0、0、0、
1、1、1、1、1、1、1、1、1、1、
2、2、2、2、2、2、2、2、2、2、
4、4、4、4、4、4、4、4、4、4、
5、5、5、5、5、5、5、5、5、5、
6、6、6、6、6、6、6、6、6、6、
7、7、7、7、7、7、7、7、7、7、
8、8、8、8、8、8、8、8、8、8、
9、9、9、9、9、9、9、9、9、9、
循环嵌套

在一个循环语句中嵌套其它的循环语句就称为循环嵌套处理,循环嵌套层次越多时间复杂度就越高,那么下面通过循环的嵌套观察两个简单的程序。

范例:打印乘法口诀表

y*x=...
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
随着x的增加,y才会增加,所以y应该受到x的控制


public class JavaDemo {
    public static void main(String args[]) {
        for (int x = 1 ; x <= 9 ; x++) {    // 口诀表最多9行
            for (int y = 1 ; y <= x ; y++) {    // 为什么y要小于等于x,因为y应该受到x的限制,才会呈现乘法表的形状
                System.out.print(y + "*" + x + "=" + (x * y) + "\t") ;
            }
            System.out.println() ;  // 换行
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
-----------------------------------------------------------------------
把上述代码 (int y = 1 ; y <= x ; y++) 中的 y<=x 换成 y<=9,执行代码:
D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
1*1=1   2*1=2   3*1=3   4*1=4   5*1=5   6*1=6   7*1=7   8*1=8   9*1=9
1*2=2   2*2=4   3*2=6   4*2=8   5*2=10  6*2=12  7*2=14  8*2=16  9*2=18
1*3=3   2*3=6   3*3=9   4*3=12  5*3=15  6*3=18  7*3=21  8*3=24  9*3=27
1*4=4   2*4=8   3*4=12  4*4=16  5*4=20  6*4=24  7*4=28  8*4=32  9*4=36
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  6*5=30  7*5=35  8*5=40  9*5=45
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  7*6=42  8*6=48  9*6=54
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  8*7=56  9*7=63
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  9*8=72
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
其中 1*2 和 2*1 这种类似情况重复了,所以乘法表中y要受到x的控制。

范例:打印三角形

        *
       * *
      * * *
     * * * * 
    * * * * *
   * * * * * *
  * * * * * * *
 * * * * * * * *
* * * * * * * * *

行数增加,星数也增加
每个星后面都有一个空格
把星前面的输出当做空格,会发现:行数增加的同时,空格在减少
public class JavaDemo {
    public static void main(String args[]) {
        int line = 5 ;  // 总行数
        for (int x = 0 ; x < line ; x ++) {
            for (int y = 0 ; y < line - x ; y ++) {
                System.out.print(" ") ;  // 随着x的增加,y再减小,即:输出的空格数在减小
            }
            for (int y = 0 ; y <= x ; y ++) {
                System.out.print("* ") ;  // 随着x的增加,y也增加,即:输出*数在增加;每个*后面有一个空格
            }
            System.out.println() ;
        }
    }
}

D:\fgqjava>javac JavaDemo.java

D:\fgqjava>java JavaDemo
     *
    * *
   * * *
  * * * *
 * * * * *

这些是留给你上学时做的程序逻辑的训练。跟我们开发的紧密程度不大,一般不会写太复杂的代码。有时候可能需要,出现应届生考题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 77,946评论 1 169
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 26,265评论 1 142
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 29,362评论 0 100
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 16,287评论 0 86
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 21,542评论 0 144
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 17,714评论 0 87
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 10,515评论 2 161
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 9,917评论 0 77
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 8,437评论 5 111
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 11,699评论 0 128
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 10,468评论 1 124
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 11,267评论 0 127
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 6,122评论 0 17
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 8,922评论 2 114
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 12,006评论 3 121
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 7,762评论 0 3
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 7,980评论 0 76
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 12,445评论 2 132
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 13,111评论 2 130

推荐阅读更多精彩内容

  • Swift 提供了类似 C 语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行...
    穷人家的孩纸阅读 647评论 1 1
  • [The Swift Programming Language 中文版]本页包含内容: Swift提供了多种流程控...
    风林山火阅读 485评论 0 0
  • Swift提供了多种控制流声明。包括while循环来多次执行一个任务;if,guard和switch声明来根据确定...
    BoomLee阅读 1,824评论 0 3
  • 控制流 [TOC] Swift提供了多种流程控制结构,包括可以多次执行任务的while循环,基于特定条件选择执行不...
    伍哥___阅读 399评论 0 0
  • 坐在20楼的窗户边上,看外面秋雨绵绵,远处薄薄的雾气飘着,天空有些微的昏暗,从玻璃缝隙透进来的空气都是满满的凉意。...
    玉山红叶稀阅读 203评论 9 3