顺序结构
顺序结构
顺序结构语句是Java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行
分支结构
为什么要有 If 语句?
If 语句在程序中就是用来进行判断的
If 语句的第一种格式
if (关系表达式) {
语句体
}
执行流程:
首先计算关系表达式的值
如果关系表达式的值为true就执行语句体
如果关系表达式的值为false就不执行语句体
继续执行后面的其他语句
练习:老丈人选女婿
需求:键盘录入女婿酒量,如果大于2斤,老丈人给出回应,反之不回应
import java.util.Scanner;
public class IfDemo1 {
public static void main(String[] args) {
// 1.键盘录入女婿酒量
Scanner sc = new Scanner(System.in);
System.out.println("请输入女婿对酒量");
int wine = sc.nextInt();
// 2.对酒量进行判断
if (wine > 2) {
System.out.println("小伙子,不错呦!");
}
}
}
If的注意点:
1.大括号的开头可以另起一行书写,但是建议写在第一行的末尾
2.在语句体中,如果只有一句代码,大括号可以省略不写
3.如果对一个布尔类型的变量进行判断,不要用==号,直接把变量写在小括号即可
If的第二种格式
if (关系表达式) {
语句体1;
} else {
语句体2;
}
执行流程:
首先计算关系表达式的值
如果关系表达式的值为true就执行语句体1
如果关系表达式的值为false就执行语句体2
继续执行后面的其他语句
练习:商品付款
需求:假设用户在超市实际购买,商品总价为600元,键盘录入一个整数表示用户实际支付的钱。如果付款大于等于600,表示付款成功,否则付款失败
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("录入一个整数表示实际支付的钱");
int money = sc.nextInt();
if (money >= 600) {
System.out.println("付款成功");
} else {
System.out.println("付款失败");
}
}
}
练习:影院选座
假设电影院售卖100张票,票的序号为 1~100。其中奇数票号坐左侧,偶数票号坐右侧。键盘录入一个整数表示电影票的票号。根据不同的票号给出不同的提示:奇数打印坐左边,偶数打印坐右边
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入一个票号");
int ticket = sc.nextInt();
if (ticket >=0 && ticket <= 100) {
if (ticket % 2 == 1) {
System.out.println("坐左边");
} else {
System.out.println("坐右边");
}
}
}
}
If语句的第三种格式
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}
...
else {
语句体 n + 1;
}
执行流程:
首先计算关系表达式1的值
如果为true就执行语句体1;如果为false就计算关系表达式2的值
如果为true就执行语句体2;如果为false计算关系表达式3的值
...... 如果所有关系表达式结果都为false,就执行语句体 n + 1
练习:商品的价格
需求:商场都会有VIP的会员制,根据不同的会员会有不同的折扣。假设商品总价为1000.键盘录入会员级别,并计算出实际支付的钱。
会员1级:打九折
会员2级:打8折
会员3级:打7折
非会员:不打折
import java.util.Scanner;
public class VIPTest {
public static void main(String[] args) {
// 定义变量记录总价
int price = 1000;
// 键盘录入会员的级别
Scanner sc = new Scanner(System.in);
System.out.println("请录入会员的级别");
int vip = sc.nextInt();
if (vip == 1) {
System.out.println("实际支付的钱为" + (price * 0.9));
} else if (vip == 2) {
System.out.println("实际支付的钱为" + (price * 0.8));
} else if(vip == 3) {
System.out.println("实际支付的钱为" + (price * 0.7));
} else {
System.out.println("实际支付的钱为" + price);
}
}
}
switch语句格式
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
执行流程:
首先计算表达式的值
依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束
如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后结束整个switch语句
格式说明:
表达式:(将要匹配的值)取值为byte、short、int、char。JDK5以后可以是枚举,JDK7以后可以是String
case:后面跟的是要和表达式进行比较的值(被匹配的值)
break:表示中断,结束的意思,用来结束switch语句
default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似
case后面的值只能是字面量,不能是变量
case给出的值不允许重复
练习:运动计划
需求:键盘录入星期数,先是今天的减肥活动
周一跑步,周二游泳,周三慢走,周四动感单车,周五拳击,周六爬山,周日好好吃一顿
import java.util.Scanner;
public class planTest {
public static void main(String[] args) {
// 1.键盘录入星期数
Scanner sc = new Scanner(System.in);
System.out.println("请录入星期数");
int week = sc.nextInt();
// 2.利用switch对星期进行匹配
switch (week) {
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("没有这个星期");
}
}
}
switch其他知识点
default的位置和省略
- 位置:default不一定写在最下面,可以在任意位置写(不推荐,最好最下边)
- 省略:default可以省略,语法不会有问题,但是不建议省略
public class SwitchTest {
public static void main(String[] args) {
int num = 100;
switch(num) {
default:
System.out.println("num的值不是1,10");
break;
case 1:
System.out.println("num的值是1");
break;
case 10:
System.out.println("num的值是10");
break;
}
}
}
case穿透
语句体没有写 break 导致的
如果没有发现break,程序会继续执行下一个case的语句体,一直遇到break或右大括号为止
public static void main(String[] args) {
int num = 1;
switch(num) {
case 1:
System.out.println("num的值为1");
case 10:
System.out.println("num的值为10");
default:
System.out.println("num的值不是1,10");
}
}
}
switch新特性(JSK12才有)
public class NewSwitch {
public static void main(String[] args) {
int num = 1;
switch(num) {
case 1 -> {
System.out.println("一");
}
case 2 -> {
System.out.println("二");
}
case 3 -> System.out.println("三");
default -> System.out.println("没有这个选项");
}
}
}
switch和if第三种格式各自的使用场景
switch 和 if的第三种格式各自使用场景
- if的第三种格式:一般用于对范围的判断
- switch:把有限个数据一一列举出来,让我们任选其一
练习:休息日和工作日
需求:键盘录入星期数,输出工作日和休息日。(1~5)工作日,(6~7)休息日
import java.util.Scanner;
public class TestBreak {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入一个整数表示星期");
int week = sc.nextInt();
switch(week) {
case 1,2,3,4,5:
System.out.println("工作日");
break;
case 6,7:
System.out.println("休息日");
break;
default:
System.out.println("没有这个星期");
break;
}
}
}
import java.util.Scanner;
public class TestNewSwitchBreak {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入星期数");
int week = sc.nextInt();
switch(week) {
case 1,2,3,4,5 -> System.out.println("工作日");
case 6,7 -> System.out.println("休息日");
default -> System.out.println("没有这个星期");
}
}
}
循环结构
什么是循环?
- 重复的做某件事情
- 具有明确的开始和停止标记
循环的分类
- for
- while
- do...while
for 循环
// 格式
for(初始化语句; 条件判断语句; 条件控制语句) {
循环体语句;
}
执行流程:
1⃣️ 执行初始化语句
2⃣️ 执行条件判断语句,看其结果是true还是false
如果是false,循环结束;如果是true,执行循环体语句
3⃣️ 执行条件控制语句
4⃣️ 回到2⃣️继续执行条件判断语句
- 初始化语句只执行一次
- 判断语句为true,循环继续
- 判断语句为false,循环结束
练习:打印1~5,打印5~1
public class ForTest1 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
for (int i = 5; i >=1; i--) {
System.out.println(i);
}
}
}
练习:求和
需求:求 1~5之间的和
public class ForTest2 {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
System.out.println(sum);
}
}
练习:求和
需求: 求 1~100之间的偶数和
求和变量不能定义在循环之内,因为变量只在所属的大括号中有效
变量定义在循环里面,那么变量只在本次循环中有效。当本次循环结束之后,变量就会从内存中消失,第二次循环开始后,又会重新定义一个新的变量
public class ForTest3 {
public static void main(String[] args) {
int sum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 == 0) {
sum += i;
}
}
System.out.println(sum);
}
}
练习:统计满足条件的数字
需求:键盘录入两个数字,表示一个范围,统计这个范围中,既能被3整除,又能被5整除的数字有多少个
import java.util.Scanner;
public class ForTest4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个数字表示范围开始");
int start = sc.nextInt();
System.out.println("请录入第二个数字表示范围的结束");
int end = sc.nextInt();
int count = 0;
for (int i = start; i <= end; i++) {
if (i % 3 == 0 && i % 5 ==0) {
count++;
}
}
System.out.println(count);
}
}
while循环的执行流程
格式:
初始化语句;
while(条件判断语句) {
循环体语句;
条件控制语句;
}
- 初始化语句只执行一次
- 判断语句为true,循环继续
- 判断语句为false,循环结束
public class WhileTest {
public static void main(String[] args) {
int i = 0;
while (i <= 100) {
System.out.println(i);
i++;
}
}
}
for和while的对比
相同点:运行规则一样
for和while的区别:
for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次访问到了
while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
for和while的区别:
for循环中:知道循环次数或者循环的范围
while循环:不知道循环的次数和范围,只知道循环的结束条件
练习:打印折纸的次数
需求:珠穆朗玛峰高8844.42m,假如有一张可以无限折叠的纸,厚度为0.1mm。请问,这张纸折叠多少次可以折成珠穆朗玛峰的高度
public class WhileTest2 {
public static void main(String[] args) {
double height = 8844430;
double paper = 0.1;
int count = 0;
while (paper < height) {
paper = paper * 2;
count++;
}
System.out.println(count);
}
}
练习:回文数
需求:给一个整数,如果整数是一个回文整数,打印true,否则,返回false
解释:回文数指正序和倒叙读都是一样的整数
如:121
public class WhileTest3 {
public static void main(String[] args) {
int x = 131;
int temp = x;
int num = 0;
while(x != 0) {
int ge = x % 10;
x = x / 10;
num = num * 10 + ge;
}
System.out.println(num);
System.out.println(x);
System.out.println(num == temp);
}
}
练习:求商和余数
需求:给定两个整数,被除数和除数(都是正数,且不超过int的范围);将两数相除,要求不使用乘法、除法和%运算符,得到商和余数
public class WhileTest4 {
public static void main(String[] args) {
int dividend = 100;
int divisor = 30;
int count = 0;
while (dividend >= divisor) {
dividend = dividend - divisor;
count++;
}
System.out.println("余数是:" + dividend);
System.out.println("商为:" + count);
}
}
do...while循环
格式:
初始化语句;
do {
循环体语句;
条件控制语句;
} while (条件判断语句);
先执行后判断
无限循环
无限循环:循环一直停不下来
for(;;) {
System.out.println("学习");
}
while(true) {
System.out.println("学习")
}
do {
System.out.println("学习");
} while(true);
流程控制语句
- continue:跳过本次循环,继续执行下次循环
- break:结束整个循环
练习:小老虎吃包子
需求:小老虎吃包子,第三个有虫子,跳过不吃
public class TigerFood1 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
if(i == 3) {
continue;
}
System.out.println("小老虎在吃第" + i + "个包子");
}
}
}
练习:小老虎吃包子
需求:小老虎吃包子,吃完第三个饱了
public class TigerFood2 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
System.out.println("小老虎在吃第" + i + "个包子");
if (i == 3) {
break;
}
}
}
}