Java4:Java程序逻辑控制:让代码学会思考和重复

Java4:Java程序逻辑控制:让代码学会思考和重复
目录写在前面一、程序的三种基本结构二、顺序结构最朴素的执行方式三、分支结构让代码学会选择3.1 if语句最常用的分支利器3.2 代码风格大括号应该放哪里3.3 两个常见的坑3.4 switch语句多路选择的另一种方案四、循环结构让代码学会重复4.1 while循环先判断后执行4.2 break提前跳出循环4.3 continue跳过本次循环4.4 for循环最常用的循环结构4.5 do-while循环先执行后判断五、综合练习动手写一个猜数字游戏总结写在前面经过前三篇文章的学习我们已经掌握了Java的基本数据类型、变量和运算符。但到目前为止我们写的程序都是直线执行的——从上到下一行接一行没有任何分支和转折。这就好比一台只会走直线的机器人遇到岔路口不会拐弯碰到重复劳动也不会偷懒。显然真正的程序要比这灵活得多。今天这篇文章我们来学习Java中的程序逻辑控制——让代码能够做出判断、选择路径、重复执行。这是编程从玩具走向工具的关键一步。一、程序的三种基本结构任何复杂的程序归根结底都由三种基本结构组成顺序结构代码按书写顺序逐行执行分支结构根据条件决定执行哪段代码循环结构重复执行某段代码直到条件不满足这三种结构可以组合出任意复杂的程序逻辑。我们先从最简单的顺序结构说起。二、顺序结构最朴素的执行方式顺序结构是最直观的执行方式——代码从上往下一行一行地执行。System.out.println(第一行); System.out.println(第二行); System.out.println(第三行);如果你调整代码的顺序输出结果也会随之改变。这一点看似简单但却是理解程序执行的基础。三、分支结构让代码学会选择3.1 if语句最常用的分支利器if语句有三种语法格式适用于不同场景。格式一单一判断if (布尔表达式) { // 条件为true时执行的代码 } int score 95; if (score 90) { System.out.println(奖励一个鸡腿); }格式二二选一if (布尔表达式) { // 条件为true时执行 } else { // 条件为false时执行 } int score 85; if (score 90) { System.out.println(奖励一个大鸡腿); } else { System.out.println(奖励一个大嘴巴子...); }格式三多分支判断if (布尔表达式1) { // 表达式1为true时执行 } else if (布尔表达式2) { // 表达式2为true时执行 } else { // 都不满足时执行 }来看一个实际例子根据分数评定等级。int score 85; if (score 90) { System.out.println(优秀); } else if (score 80) { System.out.println(良好); } else if (score 70) { System.out.println(中等); } else if (score 60) { System.out.println(及格); } else if (score 0) { System.out.println(不及格); } else { System.out.println(错误数据); }这里有个细节值得注意由于if-else if是按顺序判断的我们不需要在每个条件中都写上score 90这样的上限判断——因为能走到第二个分支说明前面的条件已经不成立了。3.2 代码风格大括号应该放哪里// 推荐风格 if (x 10) { // 语句 } else { // 语句 } // 另一种合法但不推荐的风格 if (x 10) { // 语句 } else { // 语句 }Java社区普遍推荐第一种风格——左大括号跟在条件表达式后面。这样代码更紧凑阅读起来也更流畅。3.3 两个常见的坑陷阱一多写分号int x 10; if (x 10); { // 注意这里多了一个分号 System.out.println(hello); }这个分号成了if语句的身体空语句而后面的大括号里的代码变成了独立代码块无论如何都会执行。陷阱二悬垂elseint x 10; int y 10; if (x 10) if (y 10) System.out.println(aaa); else System.out.println(bbb);这里的else到底和哪个if配对答案是else与最近的if匹配。所以上面代码等价于if (x 10) { if (y 10) { System.out.println(aaa); } else { System.out.println(bbb); } }为了避免这种歧义强烈建议始终加上大括号。3.4 switch语句多路选择的另一种方案当需要根据一个变量的多个取值分别执行不同逻辑时switch语句也是一种选择。int day 3; switch (day) { case 1: System.out.println(星期一); break; case 2: System.out.println(星期二); break; case 3: System.out.println(星期三); break; case 4: System.out.println(星期四); break; case 5: System.out.println(星期五); break; case 6: System.out.println(星期六); break; case 7: System.out.println(星期日); break; default: System.out.println(输入有误); break; }使用switch的几个要点break不能省略否则会发生穿透现象——匹配到一个case后会继续执行后续所有case的代码直到遇到break为止。表达式类型有限制只能是byte、char、short、int、String、枚举类型。不能是long、float、double。case值不能重复。无法表达复杂条件比如num 10 num 20这种范围判断switch无能为力。不建议嵌套使用switch套switch会让代码难以阅读和维护。总的来说switch的使用场景比较有限。能用if解决的问题尽量用if解决。四、循环结构让代码学会重复计算机最擅长的事情之一就是重复。循环结构让我们可以用几行代码完成成千上万次的重复操作。4.1 while循环先判断后执行while (循环条件) { // 循环体 }示例1打印1到10int num 1; while (num 10) { System.out.println(num); num; }示例2计算1到100的和int n 1; int sum 0; while (n 100) { sum n; n; } System.out.println(sum); // 5050示例3计算5的阶乘int n 1; int result 1; while (n 5) { result * n; n; } System.out.println(result); // 120示例4计算1! 2! 3! 4! 5!int num 1; int sum 0; while (num 5) { int factorResult 1; int tmp 1; while (tmp num) { factorResult * tmp; tmp; } sum factorResult; num; } System.out.println(sum);这里出现了嵌套循环——循环里面套循环。外层循环控制阶乘的求和内层循环计算每个数的阶乘。随着嵌套层次增加代码复杂度也会显著上升。4.2 break提前跳出循环break的作用是立即结束当前循环不管循环条件是否还满足。// 找出100到200之间第一个3的倍数 int num 100; while (num 200) { if (num % 3 0) { System.out.println(找到了 num); break; } num; }执行到break时循环立刻终止程序继续执行循环后面的代码。4.3 continue跳过本次循环continue的作用是跳过本次循环的剩余代码直接进入下一次循环的条件判断。// 打印100到200之间所有3的倍数 int num 100; while (num 200) { if (num % 3 ! 0) { num; continue; } System.out.println(找到了3的倍数 num); num; }当执行到continue时本次循环中continue之后的代码不再执行直接回到循环条件判断处。4.4 for循环最常用的循环结构for循环将循环的三个要素——初始化、条件判断、变量更新——集中在一行结构更加清晰。for (表达式1; 布尔表达式2; 表达式3) { // 循环体 }示例1打印1到10for (int i 1; i 10; i) { System.out.println(i); }示例2计算1到100的和int sum 0; for (int i 1; i 100; i) { sum i; } System.out.println(sum); // 5050示例3计算5的阶乘int result 1; for (int i 1; i 5; i) { result * i; } System.out.println(result); // 120示例4计算1! 2! ... 5!int sum 0; for (int i 1; i 5; i) { int tmp 1; for (int j 1; j i; j) { tmp * j; } sum tmp; } System.out.println(sum);使用for循环的注意事项表达式2循环条件如果缺失循环会成为死循环同样不建议在for后面多加一个分号break和continue在for循环中的行为与while一致4.5 do-while循环先执行后判断do { // 循环体 } while (循环条件);do-while的特点是至少执行一次循环体然后再判断是否继续。int num 1; do { System.out.println(num); num; } while (num 10);在实际开发中do-while的使用频率远低于for和while了解即可。五、综合练习动手写一个猜数字游戏学了这么多理论知识不妨动手实践一下。下面是一个简单的猜数字游戏综合运用了我们今天学的知识点。import java.util.Random; import java.util.Scanner; public class GuessNumber { public static void main(String[] args) { Random random new Random(); Scanner scanner new Scanner(System.in); // 生成1到100之间的随机数 int target random.nextInt(100) 1; int guessCount 0; System.out.println(欢迎来到猜数字游戏); System.out.println(我已经想好了一个1到100之间的数字请猜猜看吧。); while (true) { System.out.print(请输入你的猜测); int guess scanner.nextInt(); guessCount; if (guess target) { System.out.println(猜小了再大一点); } else if (guess target) { System.out.println(猜大了再小一点); } else { System.out.println(恭喜你猜对了); System.out.println(你一共猜了 guessCount 次。); break; } } scanner.close(); } }这个程序用到了我们之前学的变量、运算符以及今天学的if分支、while循环、break跳转。你能读懂每一行代码的含义吗总结今天我们学习了Java程序逻辑控制的三大结构顺序结构代码按顺序逐行执行分支结构if-else if-else实现多路选择switch适用于有限选项的匹配循环结构while、for最常用、do-while了解即可还学会了两个重要的控制语句break立即结束循环continue跳过本次循环剩余代码下一篇文章我们将学习Java中的方法函数——如何把重复的代码封装起来实现一次编写多次调用。敬请期待