打怪升级之小白的大数据之旅(四)
Java基础语法之流程控制
上次回顾
小伙伴们,还记得前面说过的知识点么?我来简单回顾一下,上次,我们提到数据类型中的基本数据类型和数据类型的转换,之后提到了运算符以及其运算符的优先级.这里的难点就是位运算符的使用以及了解其他位运算在底层的转换方式.不用刻意记住它,有个印象就好啦
这一次,我会分享一下Java的流程控制,如分支判断,循环,有了这些知识点,就可以做一些奇奇怪怪的练习题了,比如打印正三角形,打印菱形,做一个简易的计算器,做一个个人信息的录入输出等等.好了,下面开始进入正题
Java的流程控制
介绍流程控制前,我先扩展一个小的知识点:键盘录入,为了我们以后的代码测试做铺垫,也为了讲IO流中的知识点做个引子。
Scanner 键盘录入
我想在运行程序的时候,根据实际的输入的两个数,进行求和,就跟计算器一样,任意给两个数,计算得出结果,如何做?
完成键盘输入的代码步骤:
(1)准备一个键盘扫描器(先导包或直接使用包名+类名)
(2)提示要输入的信息
(3)接收输入内容
示例代码:
//1、准备Scanner类型的变量
//Scanner是一个引用数据类型,它的全名称是java.util.Scanner
//input就是一个引用数据类型的变量了,赋给它的值是一个对象
java.util.Scanner input = new java.util.Scanner(System.in);//System.in默认代表键盘输入
//2、提示输入xx
System.out.print("请输入一个整数:");
//3、接收输入内容
int num = input.nextInt();
//列出各种数据类型的输入
int num = input.nextInt();
long bigNum = input.nextLong();
double d = input.nextDouble();
boolean b = input.nextBoolean();
String s = input.next();
char c = input.next().charAt(0);//先按照字符串接收,然后再取字符串的第一个字符(下标为0)
流程控制概述
流程控制是什么?个人理解就是:
我们想让计算机做一件事情,它可能会被"现实生活的各种变化"所打乱,不可能完全你让它走直线,当遇到墙,它就自己会绕过去.还有一些重复性的功能,想让计算机自己去做,然后我们挂机去看电影,去快乐的玩耍~~
在Java中,流程控制分为三大类:
- 顺序结构
- 分支(选择结构)
- 循环结构
顺序结构
当我们写好一段程序后,运行这段程序,它代码的运行顺序是自上而下的顺序运行的
代码示例:
public static void main(String[] args){
//顺序执行,根据编写的顺序,从上到下运行
System.out.println("程序开始:");
int a=10;
int b=20;
int sum=a+b;
System.out.println("sum="+sum);//求两个数的和
System.out.println("程序结束!");
}
好了,顺序结构就这么简单,有的小伙伴可能会有疑问了,那么当我一行代码有很多表达式,那么它的执行顺序是什么?
很简单,根据前面提到的优先级,它默认是从左至右运行的,当有优先级高的表达式/数据类型等等时,就会优先执行优先级高的代码
选择(分支)结构
- 定义: 根据条件不同,选择执行不同的分支语句
- 分支结构分为 if 条件分支和 switch 条件分支,下面我们首先介绍 if 条件分支
If 条件分支
- if 分支结构的格式一
执行流程:if(关系表达式){ 语句体; }
①首先判断条件表达式看其结果是true还是false
②如果是true就执行语句体
③如果是false就不执行语句体
示例代码:public static void main(String[] args){ System.out.println("开始"); // 定义两个变量 int a = 10; int b = 20; //变量使用if判断 if (a == b){ System.out.println("a等于b"); } int c = 10; if(a == c){ System.out.println("a等于c"); } System.out.println("结束"); }
- if 分支结构的格式二
执行流程:if(关系表达式) { 语句体1; }else { 语句体2; }
①首先判断关系表达式看其结果是true还是false
②如果是true就执行语句体1
③如果是false就执行语句体2
示例代码:// 输入一个整数,判断是奇数还是偶数? public static void main(String[] args){ // 判断给定的数据是奇数还是偶数 // 定义变量 int a = 1; if(a % 2 == 0) { System.out.println("a是偶数"); } else{ System.out.println("a是奇数"); } System.out.println("结束");
- if 分支结构的格式三
执行流程:if (判断条件1) { 执行语句1; } else if (判断条件2) { 执行语句2; } ... }else if (判断条件n) { 执行语句n; } else { 执行语句n+1; }
①首先判断关系表达式1看其结果是true还是false
②如果是true就执行语句体1,然后结束当前多分支
③如果是false就继续判断关系表达式2看其结果是true还是false
④如果是true就执行语句体2,然后结束当前多分支
⑤如果是false就继续判断关系表达式…看其结果是true还是false
⑥…
⑦如果没有任何关系表达式为true,就执行语句体n+1,然后结束当前多分支
示例代码:计算如下函数:x和y的关系满足如下: (1)x>=3; y = 2x + 1; (2)-1<=x<3; y = 2x; (3)x<-1; y = 2x – 1; 从键盘输入x的值,计算出y的值并输出。 public static void main(String[] args) { java.util.Scanner input = new java.util.Scanner(System.in); System.out.print("请输入x的值:"); int x = input.nextInt(); int y; if (x>= 3) { y = 2 * x + 1; } else if (x >= -1 && x < 3) { y = 2 * x; } else { y = 2 * x - 1; } System.out.println("y的值是:"+y); } 改造: public static void main(String[] args) { java.util.Scanner input = new java.util.Scanner(System.in); System.out.print("请输入x的值:"); int x = input.nextInt(); int y; if (x>= 3) { y = 2 * x + 1; } else if (x >= -1) {//优化条件 y = 2 * x; } else { y = 2 * x - 1; } System.out.println("y的值是:"+y) } }
- if 分支结构的格式四
1) 在 if 的语句块中,或者在else语句块中,又包含了另一个条件判断(可以是单分支、双分支、多分支)
2) 如果是嵌套在if语句块中的 只有当外部的if条件满足,才会去判断内部的条件
3) 如果是嵌套在else语句块中的 只有当外部的if条件不满足,进入else后,才会去判断内部的条件
示例代码:public static void main(String[] args) { int score = 89; if(score<0 || score>100){ System.out.println("你的成绩是错误的"); }else{ 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 { System.out.println("你的成绩属于不及格"); } }
switch分支
- 格式
switch(表达式){ case 常量值1; 语句块1; break; case 常量值2; 语句块2; break; .… default: 语句块 n+1; break; }
- 执行流程:
- 入口
- 当switch(表达式)的值与case后面的某个常量值匹配,就从这个case进入;
- 当switch(表达式)的值与case后面的所有常量值都不匹配,寻找default分支进入;不管default在哪里
- 一旦从“入口”进入switch,就会顺序往下执行,直到遇到“出口”,即可能发生贯穿
- 出口
- 自然出口:遇到了switch的结束}
- 中断出口:遇到了break等
- 注意事项:
1. 小括号内是常量表达式即结果必须是一个常量值
2. 常量值限定是: byte short char int String 枚举等
3. break 用于跳出swich语句,如果没有break,程序会继续执行到下一个case语句块中
4. 如果swich中case不加break,那么程序会继续执行,直到遇到break或者程序结束
5. case后面的常量值不能重复 - 示例代码:
public class SwitchDemo01 { public static void main(String[] args) { //定义指定的星期 int weekday = 5; //switch语句实现选择 switch(weekday) { 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条件分支可以转换为if条件分支,但是if条件分支不一定可以转换为if条件分支,因为上面提到了,switch语句判定的是常量值哈,下面,给大家介绍一下循环~
循环结构
- 定义: 需要重复执行特定的代码
-
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要通过修改循环变量使得循环判断条件为false,从而结束循环,否则循环将一直执行下去,形成死循环
-
循环的分类:循环分为for 循环,while循环和do...while循环
for循环
- 语句格式一
for(初始化语句①; 循环条件语句②; 迭代语句④){ 循环体语句③ } for(;;){ 循环体语句块;//如果循环体中没有跳出循环体的语,那么就是死循环
- 执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。
- 第三步:执行循环体语句③
- 第四步:执行迭代语句④,针对循环变量重新赋值
- 第五步:根据循环变量的新值,重新从第二步开始再执行一遍
- 示例代码:
/* * 练习:利用for语句打印1-5和5-1 */ public class ForTest01 { 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); System.out.println("==============="); //用循环改进 for(int x=1; x<=5; x++) { System.out.println(x); } System.out.println("==============="); //1-5的数据我们获取到了,如何获取5-1呢? for(int x=5; x>=1; x--){ System.out.println(x); } } }
- 注意事项:
(1)for(;;)中的两个;是不能多也不能少
(2)循环条件必须是boolean类型
(3)如果循环条件语句②省略的话,就默认为循环条件成立
- 执行流程:
while循环
- 语句格式一
while (循环条件语句①) { 循环体语句②; } while(true){ 循环体语句;//如果此时循环体中没有跳出循环的语句,也是死循环
- 执行流程:
- 第一步:执行循环条件语句①,看循环条件语句的值是true,还是false;
- 如果是true,执行第二步;
- 如果是false,循环语句中止,循环不再执行。
- 第二步:执行循环体语句②;
- 第三步:循环体语句执行完后,重新从第一步开始再执行一遍
- 第一步:执行循环条件语句①,看循环条件语句的值是true,还是false;
- 注意:while(循环条件)中循环条件必须是boolean类型
- 执行流程:
- 语句格式二
//初始化语句①; while (循环条件语句②) { 循环体语句③; 迭代语句④; }
- 执行流程
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。
- 第三步:执行循环体语句③
- 第四步:执行迭代语句④,针对循环变量重新赋值
- 第五步:根据循环变量的新值,重新从第二步开始再执行一遍
- 示例代码:
//遍历1-100之间的偶数 int num = 2; while(num<=100){ System.out.println(num); num+=2; }
- 执行流程
do...while循环
- 语句格式一
do { 循环体语句①; } while (循环条件语句②);
- 执行流程:
- 第一步:执行循环体语句①;
- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句终止,循环不再执行。
- 第三步:循环条件语句执行完后,重新从第一步开始再执行一遍
- 注意事项:
(1)while(循环条件)中循环条件必须是boolean类型
(2)do{}while();最后有一个分号
(3)do...while结构的循环体语句是至少会执行一次,这个和for和while是不一样的
- 执行流程:
- 语句格式二
//初始化语句① do { 循环体语句②; 迭代语句③; } while (循环条件语句④);
- 执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环体语句②;
- 第三步:执行迭代语句③,针对循环变量重新赋值;
- 第四步:执行循环条件语句④,看循环条件语句的值是true,还是false;
- 如果是true,根据循环变量的新值,重新从第二步开始再执行一遍;
- 如果是false,循环语句中止,循环不再执行
- 示例代码:
//统计正数、负数个数 public static void main(String[] args) { java.util.Scanner input = new java.util.Scanner(System.in); int positive = 0; int negative = 0; int num; do{ System.out.print("请输入整数(0)结束:"); num = input.nextInt(); if(num>0){ positive++; }else if(num<0){ negative++; } }while(num!=0); System.out.println("正数:" + positive + "个,负数:" + negative +"个"); }
- 执行流程:
循环语句的区别
- 从循环次数角度分析
1) do...while循环至少执行一次循环体语句
2) for和while循环先循环条件语句是否成立,然后决定是否执行循环体,至少执行零次循环体语句 - 从循环变量的生命周期角度分析
1) for循环的循环变量在for()中声明的,在循环语句结束后,不可以被访问;
2) while和do...while循环的循环变量因为在外面声明的,所以while和do...while结束后可以被继续使用的; - 如何选择
1) 遍历有明显的循环次数(范围)的需求,选择for循环
2) 遍历没有明显的循环次数(范围)的需求,循环while循环
3) 如果循环体语句块至少执行一次,可以考虑使用do...while循环
4) 本质上:三种循环之间是可以互相转换的,都能实现循环的功能 - 三种循环结构都具有四要素:
1) 循环变量的初始化表达式
2) 循环条件
3) 循环变量的修改的迭代表达式
4) 循环体语句块 - 死循环比较
1) for(;;){循环体} ,除循环体外不需要执行其他语句,性能略高
2) while(true){ 循环体},除循环体外还需要执行小括号里的表达式
循环中的关键字--break和continue
break
- 使用场景:
- 终止选择结构switch语句中,防止case穿透
- 在循环语句中使用,为了终止循环
- 离开使用场景的存在是没有意义的
- 示例代码:
/*1. ATM功能演示 界面效果: =========ATM======= 1、存款 2、取款 3、显示余额 4、退出 请选择: 代码示例:*/ public static void main(String[] args){ java.util.Scanner input = new java.util.Scanner(System.in); //声明一个变量表示余额 double balance = 0.0; boolean flag = true; while(flag){ System.out.println("=========ATM======="); System.out.println("\t1、存款"); System.out.println("\t2、取款"); System.out.println("\t3、显示余额"); System.out.println("\t4、退出"); System.out.print("请选择:"); int select = input.nextInt(); switch(select){ case 1: System.out.print("存款的金额:"); double money = input.nextDouble(); balance += money; break; case 2: System.out.print("取款的金额:"); money = input.nextDouble(); balance -= money; break; case 3: System.out.println("现在的余额:" + balance); break; case 4: flag = false; break;//只能结束switch } }
containue
- 使用场景:
- 结束本次循环,继续下一次的循环
- 示例代码:
//遍历打印1-10的整数,但不打印3的倍数 public static void main(String[] args) { for (int i = 1; i <= 10; i++) { //需求:不打印3的倍数 if(i % 3 == 0){ continue; } System.out.println(i); } }
嵌套循环
- 指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总共的循环次数=外循环次数*内循环次数。当然可以是三种循环任意互相嵌套
- 嵌套循环格式
for(初始化语句①; 循环条件语句②; 迭代语句⑦) { for(初始化语句③; 循环条件语句④; 迭代语句⑥) { 循环体语句⑤; }
-
示例代码
public static void main(String[] args){ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print("*"); } System.out.println(); } }
总结
本章介绍了Java的流程控制,分支和循环,有了这些知识点,我们可以刷一些有趣的题型了,比如使用*号打印三角形,打印菱形等等,网上资料很多,这些题型主要就是锻炼大家的循环,循环嵌套以及条件分支的应用,好啦,今天的内容就到这里,老样子,如果这个博客中有哪些知识点有问题,欢迎后台来吐槽,下一期为大家介绍数组以及一些简单的算法知识,当然了,前面提到的栈内存和堆内存也会有分享哈~~