在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。流程控制语句分类,如下所示:
顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
顺序结构执行流程图:
代码示例
public class Demo { public static void main(String[] args) { System.out.println(1); System.out.println(2); System.out.println(3); System.out.println(4); System.out.println(5); } }
根据不同的条件,执行不同的语句。在Java中分支结构又可以分为if语句和Switch语句。
格式:
执行流程:
执行流程图
代码示例
public class Demo { public static void main(String[] args) { System.out.println("开始"); int age = 17; // 如果年龄大于18岁, 就可以上网吧 if(age >= 18){ // age > 18为true 执行的语句体 System.out.println("可以上网吧"); } System.out.println("结束"); } }
格式:
执行流程:
代码示例
public class Demo { public static void main(String[] args) { // 程序判断一个数, 是奇数还是偶数 int num = 9; if(num % 2 == 0){ System.out.println("偶数"); }else{ System.out.println("奇数"); } } }
格式
执行流程:
执行流程图
代码示例
import java.util.Scanner; /* 需求:小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物 假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。 */ public class Demo { public static void main(String[] args) { // 1. 使用Scanner录入考试成绩 Scanner sc = new Scanner(System.in); System.out.println("请输入您的成绩:"); int score = sc.nextInt(); // 2. 判断成绩是否在合法范围内 0~100 if (score >= 0 && score <= 100) { // 合法成绩 // 3. 在合法的语句块中判断成绩范围符合哪一个奖励 if (score >= 95 && score <= 100) { System.out.println("自行车一辆"); } else if (score >= 90 && score <= 94) { System.out.println("游乐场一次"); } else if (score >= 80 && score <= 89) { System.out.println("变形金刚一个"); } else { System.out.println("挨顿揍, 这座城市又多了一个伤心的人~"); } } else { // 非法的话, 给出错误提示 System.out.println("您的成绩输入有误!"); } } }
注意事项:
格式:
switch语句中,表达式的数据类型,可以是byte,short,int,char,enum(枚举),JDK7后可以接收字符串。执行流程:
示例代码
import java.util.Scanner; public class TestSwitch { /* 需求:键盘录入星期数,显示今天的减肥活动。 周一:跑步 周二:游泳 周三:慢走 周四:动感单车 周五:拳击 周六:爬山 周日:好好吃一顿 分析: 1. 键盘录入星期数据,使用变量接收 2. 多情况判断,采用switch语句实现 3. 在不同的case中,输出对应的减肥计划 */ public static void main(String[] args){ // 1. 键盘录入星期数据,使用变量接收 Scanner sc = new Scanner(System.in); System.out.println("请输入"); int week = sc.nextInt(); // 2. 多情况判断,采用switch语句实现 switch(week){ // 3. 在不同的case中,输出对应的减肥计划 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语句case穿透
概述 : 如果switch语句中,case省略了break语句, 就会开始case穿透
示例代码
import java.util.Scanner; public class Demo { /* 需求: 键盘录入星期数,输出工作日、休息日 (1-5)工作日,(6-7)休息日 case穿透是如何产生的? 如果switch语句中,case省略了break语句, 就会开始case穿透. 现象: 当开始case穿透,后续的case就不会具有匹配效果,内部的语句都会执行 直到看见break,或者将整体switch语句执行完毕,才会结束。 */ public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("请输入星期数:"); int week = sc.nextInt(); switch(week){ case 1: case 2: case 3: case 4: case 5: System.out.println("工作日"); break; case 6: case 7: System.out.println("休息日"); break; default: System.out.println("您的输入有误"); break; } } }
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形 成死循环。一般情况下,循环的组成如下所示:
for循环格式:
执行流程:
代码示例
//在控制台输出所有的“水仙花数” 。水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数 public class Demo { /* 需求:在控制台输出所有的“水仙花数”,要求每行打印2个 System.out.print (打印内容); 打印后不换行 System.out.println(打印内容); 打印后换行 分析: 1. 定义变量count,用于保存“打印过”的数量,初始值为0 2. 在判定和打印水仙花数的过程中,拼接空格, 但不换行,并在打印后让count变量+1,记录打印过的数量 3. 在每一次count变量+1后,判断是否到达了2的倍数,是的话,换行。 */ public static void main(String[] args) { // 1. 定义变量count,用于保存“打印过”的数量,初始值为0 int count = 0; for (int i = 100; i <= 999; i++) { int ge = i % 10; int shi = i / 10 % 10; int bai = i / 10 / 10 % 10; if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i) { // 2. 在判定和打印水仙花数的过程中,拼接空格, 但不换行,并在打印后让count变量+1,记录打印过的数量 System.out.print(i + " "); count++; // 3. 在每一次count变量+1后,判断是否到达了2的倍数,是的话,换行 if (count % 2 == 0) { System.out.println(); } } } } }
总结:今后如果需求带有统计xxx,请先想到计数器变量.计数器变量定义的位置,必须在循环外部
while循环完整格式
while循环执行流程:
示例代码
/* 世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸, 它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度? */ public class Demo { public static void main(String[] args) { //定义一个计数器,初始值为0 int count = 0; //定义纸张厚度 double paper = 0.1; //定义珠穆朗玛峰的高度 int zf = 8844430; //因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环 //折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度 while(paper <= zf) { //循环的执行过程中每次纸张折叠,纸张的厚度要加倍 paper *= 2; //在循环中执行累加,对应折叠了多少次 count++; } //打印计数器的值 System.out.println("需要折叠:" + count + "次"); } }
完整格式:
执行流程:
代码示例
public class Demo { //需求:在控制台输出5次"HelloWorld" public static void main(String[] args) { //do...while循环实现 int j = 1; do { System.out.println("HelloWorld"); j++; } while (j <= 5); } }
格式:
注意: 无法访问的语句不能编写,否则会报错
跳出循环,结束循环
public class Demo { /* break : 终止循环体内容的执行 注意:使用是基于条件控制的 break语句只能在循环和switch中进行使用. 需求: 模拟20岁工作到80岁, 60岁退休. */ public static void main(String[] args){ for(int i = 20; i <= 80; i++){ if(i == 60){ break; // 结束整个循环 } System.out.println(i + "岁正在上班"); } } }
跳过本次循环,继续下次循环
public class Demo { /* continue : 跳过某次循环体内容的执行 注意:使用是基于条件控制, 在循环内部使用. 需求: 模拟电梯上行的过程 1-24层, 4层不停. */ public static void main(String[] args){ for(int i = 1; i <= 24; i++){ if(i == 4){ continue; } System.out.println(i + "层到了~"); } } }
综合练习
import java.util.Scanner; import java.util.Random; public class Test { /* 需求:程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少? 当猜错的时候根据不同情况给出相应的提示 如果猜的数字比真实数字大,提示你猜的数据大了 如果猜的数字比真实数字小,提示你猜的数据小了 如果猜的数字与真实数字相等,提示恭喜你猜中了 1. 准备Random和Scanner对象, 分别用于产生随机数和键盘录入 2. 使用Random产生一个1-100之间的数, 作为要猜的数 3. 键盘录入用户猜的的数据 4. 使用录入的数据(用户猜的数据)和随机数(要猜的数据)进行比较, 并给出提示 5. 以上内容需要多次进行, 但无法预估用户输入几次可以猜测正确, 使用while(true)死循环包裹 6. 猜对之后, break结束. */ public static void main(String[] args){ // 1. 准备Random和Scanner对象, 分别用于产生随机数和键盘录入 Random r = new Random(); Scanner sc = new Scanner(System.in); // 2. 使用Random产生一个1-100之间的数, 作为要猜的数 int randomNum = r.nextInt(100) + 1; // 5. 以上内容需要多次进行, 但无法预估用户输入几次可以猜测正确, 使用while(true)死循环包裹 while(true){ // 3. 键盘录入用户猜的的数据 System.out.println("请输入您猜的数据:"); int num = sc.nextInt(); // 4. 使用录入的数据(用户猜的数据)和随机数(要猜的数据)进行比较, 并给出提示 if(num > randomNum){ System.out.println("猜大了"); }else if(num < randomNum){ System.out.println("猜小了"); }else{ // 6. 猜对之后, break结束. System.out.println("恭喜,猜中了"); break; } } System.out.println("感谢您的使用"); } }