- 顺序结构
- 循环结构(for, while, do…while)
代码示例
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); } }
执行流程:
- 首先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体
- 如果关系表达式的值为false就不执行语句体
- 继续执行后面的语句内容
执行流程图
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("结束"); } }
执行流程:
- 首先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体1
- 如果关系表达式的值为false就执行语句体2
- 继续执行后面的语句内容
代码示例
public class Demo { public static void main(String[] args) { // 程序判断一个数, 是奇数还是偶数 int num = 9; if(num % 2 == 0){ System.out.println("偶数"); }else{ System.out.println("奇数"); } } }
执行流程:
- 首先计算关系表达式1的值
- 如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
- 如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
- …
- 如果没有任何关系表达式为true,就执行语句体n+1。
执行流程图
代码示例
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("您的成绩输入有误!"); } } }
注意事项:
- 如果if语句所控制的语句体, 是一条语句, 大括可以省略不写但是强烈建议不神虐!
格式:
switch语句中,表达式的数据类型,可以是byte,short,int,char,enum(枚举),JDK7后可以接收字符串。
- 首先计算出表达式的值
- 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。
示例代码
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; } } }
示例代码
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,从而结束循环,否则循环将一直执行下去,形 成死循环。一般情况下,循环的组成如下所示:
- 初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
- 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
- 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
- 执行初始化语句
- 执行条件判断语句,看其结果是true还是false。如果是false,循环结束。如果是true,继续执行
- 执行循环体语句
- 执行条件控制语句
代码示例
//在控制台输出所有的“水仙花数” 。水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数 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循环完整格式
- 执行初始化语句
- 执行条件判断语句,看其结果是true还是false。如果是false,循环结束。如果是true,继续执行
- 执行循环体语句
- 执行条件控制语句
示例代码
/* 世界最高山峰是珠穆朗玛峰(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 + "次"); } }
- 执行初始化语句
- 执行循环体语句
- 执行条件控制语句
- 执行条件判断语句,看其结果是true还是false。如果是false,循环结束。如果是true,继续执行
代码示例
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); } }
- for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
- do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)
for循环和while的区别
注意: 无法访问的语句不能编写,否则会报错
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 + "岁正在上班"); } } }
跳转控制语句(continue)
跳过本次循环,继续下次循环
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("感谢您的使用"); } }