文章
时间轴
标签
音乐室
友人帐
一刻时光
清单
留言板
相册
算法海洋
关于
Slcpの童话镇 🏰
写文章
Java基础知识及细节之流程控制语句
原创
Java
后端
发布日期:
2019年03月23日
文章字数:
5.1k
阅读次数:
812
阅读时长:
0小时0分0秒
## 流程控制语句 流程控制语句分类: * 顺序结构 * 选择结构(if,switch) * 循环结构(for,while,do...while) ### 顺序结构: 顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数代码都是这样执行的。 ### 选择结构 #### if语句 ##### 格式1 ~~~java if(关系表达式) { 语句体; } ~~~ 执行流程: 1. 首先计算关系表达式的值 2. 如果关系表达式为true,执行语句体 3. 如果关系表达式为false,不执行语句体 4. 继续执行其他语句 **注意事项:** ` 在使用格式1的情况下,如果语句体只有一行,那么可以省略大括号,不建议这么写。` ~~~java if(true) System.out.println(“可运行!”); //不会报错,运行结果会输出两条语句。 System.out.println(“可运行!”); //如果if中判断的结果是false,那么只会输出第二条语句。 ~~~ `不要在if小括号后加分号。` ~~~java if(关系表达式); { System.out.println(“可运行!”); } //不管关系表达式是true,还是false,都会执行大括号里的语句。 ~~~ ##### 格式2 ~~~java if(关系表达式) { 语句体1; }else { 语句体2; } ~~~ 执行流程: 1. 首先计算关系表达式的值 2. 如果关系表达式为true,执行语句体1 3. 如果关系表达式为false,执行语句体2 4. 继续执行其他语句 ##### 格式3 ~~~java if(关系表达式1) { 语句体1; }else if(关系表达式2){ 语句体2; } ... else { 语句体n; } ~~~ 执行流程: ①首先计算关系表达式1的值 ②如果值为true就执行语句体1;如果值为false就计算关系表达式2的值 ③如果值为true就执行语句体2;如果值为false就计算关系表达式3的值 ④… ⑤如果没有任何关系表达式为true,就执行语句体n。 #### switch语句 ##### 格式 ~~~java switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; case 值3: 语句体3; break; ... default: 语句体n; [break;] } ~~~ **格式说明:** * switch中的表达式取值为byte、short、char、int ,JDK5以后可以是枚举,JDK7以后可以是String。 * case后面接的是要和表达式进行比较的值。 * break:表示总断的意思,也就是结束switch语句。 * default:表示默认情况下执行语句体n,也就是说当所有情况都不匹配的时候,就执行default中的语句。 和if语句中的else相似。 **执行流程:** 1. 首先计算表达式的值 2. 依次和case后面的值进行比较,如果有相同的值,就会执行相应的语句,在执行过程中,遇到break就会结束。 3. 如果`所有的case后面的值都不与表达式的值相匹配,那么就会执行default里面的语句`,然后程序结束掉(当其语句体后没有break;将继续往下执行)。 **注意事项** ` 1.case后面的值不能重复。` `2.case后面的值只是常量,不能是变量。` `3.default可以省略,不建议。` ##### case穿透 在switch语句中,当case控制的语句体后面没有break时,将出现穿透现象。 `穿透现象`当开始case穿透时,后续的case都将不具备匹配能力,并且内部的语句体都将执行。直到遇到break,或者switch语句执行完成,才会结束。 > 应用场景:当发现switch语句中,有多个case控制的语句体出现了重复,就可以使用case穿透来优化代码。 ~~~java import java.util.Scanner; /* case穿透 案例:键盘录入星期数,输出工作日[1-5]、休息日[6-7] */ public class CaseTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); switch (sc.nextInt()) { 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("你输入的代码有误!"); } } } ~~~ ### 循环结构 #### for循环 for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。 ##### 基础知识 ~~~java for(初始化语句;条件判断语句;条件控制语句) { 循环语句体; } ~~~ 格式解释: * 初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样 * 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去 * 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情 * 条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去 执行流程: 1. 执行初始化语句。 2. 判断条件判断语句是true还是false; 如果是true,继续执行。 如果是false,结束循环。 3. 执行循环语句体。 4. 执行条件控制语句。 5. 返回②,继续依次往下执行。 ##### 案例-求1-5数据和 * 需求:求1-5之间的数据和,并把求和结果在控制台输出 * 示例代码: ```java public class ForTest02 { public static void main(String[] args) { //求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0 int sum = 0; //从1开始到5结束的数据,使用循环结构完成 for(int i=1; i<=5; i++) { sum += i; } //当循环执行完毕时,将最终数据打印出来 System.out.println("1-5之间的数据和是:" + sum); } } ``` * 本题要点: * 今后遇到的需求中,如果带有求和二字,请立即联想到求和变量 * 求和变量的定义位置,必须在循环外部,如果在循环内部则计算出的数据将是错误的 ##### 案例-每行打印2个水仙花数(统计) * 需求:在控制台输出所有的“水仙花数”,要求每行打印2个 某个三位数的个位、十位、百位各自的立方和等于原值就是水仙花数。 * 示例代码: ```java public class Demo { /* 需求:在控制台输出所有的“水仙花数”,要求每行打印2个 */ public static void main(String[] args){ // 1. 定义变量count,用于保存“打印过”的数量,初始值为0 int count = 0; for(int i = 100; i < 1000; 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 + "\t"); count++; // 3. 在每一次count变量+1后,判断是否到达了2的倍数,是的话,换行 if(count % 2 == 0){ System.out.println("\n"); } } } } } ``` * 本题要点: * 今后如果需求带有统计xxx,请先想到计数器变量 * 计数器变量定义的位置,必须在循环外部 #### while循环 ##### 基础知识 while循环是最基础的循环结构。 `基本格式` ~~~java while(条件判断语句) { 语句体; } ~~~ `完整格式` ~~~java 初始化语句; while(条件判断语句) { 语句体; 条件控制语句; } ~~~ 执行流程: 1. 执行初始化语句。 2. 执行条件判断语句。 3. 判断条件判断语句是true还是false; 如果是true,继续执行。 如果是false,结束循环。 4. 执行条件控制语句。 5. 返回②,继续依次往下执行。 示例代码: ```java public class Demo { public static void main(String[] args) { //需求:在控制台输出5次"HelloWorld" int i = 1; while(i<=5) { System.out.println("HelloWorld"); i++; } } } ``` ##### 案例-珠穆朗玛峰 * 需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度? * 示例代码: ```java public class WhileTest { 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 + "次"); } } ``` ### 循环细节 #### do...while循环 对于while而言,如果不满足条件,那么就不能进入循环。有的时候,我们需要即使不满足条件也要循环一次。 do...while循环和while循环很相似,唯一的区别是do...while循环至少执行一次。 `基本格式` ~~~java do{ 语句体; }while(条件判断语句); ~~~ `完整格式` ~~~java 初始化语句; do{ 语句体; 条件控制语句; }while(条件判断语句); ~~~ 执行流程: 1. 执行初始化语句。 2. 执行循环语句体。 3. 执行条件控制语句。 4. 执行条件判断语句。 如果为true,继续执行。 如果为false,结束循环。 5. 回到②,继续执行。 #### 三种循环的区别 * `三种循环的区别` * for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行) * do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断) * `for循环和while的区别` * 条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了 * 条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用 > 应用场景: > > 知道循环次数,建议使用for循环 > > 不知道循环次数,建议使用while循环 > > 至少执行一次,建议使用do...while循环,不常用 #### 死循环(无限循环) 第一种格式: ~~~java for(;;) { 语句体; } ~~~ 第二种格式: ~~~java while(true) { 语句体; } ~~~ 第三种格式: ~~~java do{ 语句体; }while(true); ~~~ #### 跳转控制语句循环嵌套 * break:用在循环中,基于条件控制,终止循环体内容的执行,也就是说结束`当前`的整个循环。 * continue:用在循环中,基于条件控制,跳出循环体内容的执行,继续执行下一次。 **注意事项** `1.break可以在循环或者switch中进行使用,而continue只能是循环中使用。` `2.break和continue只能跳出、跳过当前所在的那一层关系,如果想跳出、跳过指定的一层可以加入标号。` ~~~java 标号名.while(true) { switch(表达式) { case 常量值: break 标号名; ... } } ~~~ #### 循环标号 break和continue只能跳出、跳过自己所在的那一层关系,如果想要跳出、跳过指定的某一层循环就可以加入标号。 ~~~java 标号名:while(true) { switch(关系表达式) { case 1: break 标号名; } } ~~~ ## Random ### Random产生随机数 * 概述: * Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能 * API后续课程详细讲解,现在可以简单理解为Java已经写好的代码 * 使用步骤: 1. 导入包 import java.util.Random; 2. 创建对象 Random r = new Random(); 3. 产生随机数 int num = r.nextInt(10); 解释: `10代表的是一个范围,如果括号写10,产生的随机数就是0-9,括号写20,参数的随机数则是0-19` * 示例代码: ```java import java.util.Random; public class Demo1Random { /* Random : 产生随机数 1. 导包 : import java.util.Random; 导包的动作必须出现在类定义的上面 2. 创建对象 : Random r = new Random(); 上面这个格式里面,r 是变量名,可以变,其他的都不允许变 3. 获取随机数 : int number = r.nextInt(10); //获取数据的范围:[0,10) 包括0,不包括10 上面这个格式里面,number是变量名,可以变,数字10可以变。其他的都不允许变 需求: 产生随机数1-10之间的 */ public static void main(String[] args){ // 2. 创建对象 Random r = new Random(); for(int i = 1; i <= 10; i++){ // 3. 获取随机数 int num = r.nextInt(10) + 1; // 1-10 System.out.println(num); } } } ``` ### Random练习-猜数字 * 需求: 程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少? 当猜错的时候根据不同情况给出相应的提示 A. 如果猜的数字比真实数字大,提示你猜的数据大了 B. 如果猜的数字比真实数字小,提示你猜的数据小了 C. 如果猜的数字与真实数字相等,提示恭喜你猜中了 * 示例代码: ```java 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("感谢您的使用"); } } ```
您阅读这篇文章共耗时:
0小时16分34秒
文章链接:
https://www.slcp.top/article/read/17
版权声明:
本博客所有文章除特別声明外,均采用
CC BY 4.0
许可协议。转载请注明来源
Slcp
!
转载文章以及部分引用均为自己整理记录学习而用,若有侵权,请联系删除。
Java
评论
Valine
Gitalk
目录
搜索
首页
前进
后退
刷新
申请友链
在线联系