流程控制语句
概述
在一个程序执行的过程中,各条语句的执行顺序对于程序的结果是有直接影响的。也就是说程序执行的流程对于结果有影响。
所以我们必须清楚每条语句的执行流程,而且我们可以通过流程控制语句来控制程序的执行顺序。
- 分类
- 顺序结构
- 选择结构
- 循环结构
1 顺序结构
是程序中最基本最简单的流程控制,没有特点的语法结构,按照代码编写的先后顺序,依次执行。程序中大部分代码都是这样执行的。
public static void main(String[] args) {
System.out.println("一天晚上");
System.out.println("两个和尚");
System.out.println("三更半夜");
System.out.println("四处流浪");
System.out.println("误入洞房");
}
2 选择结构
2.1 概述
-
选择结构也称之为分支结构。
-
选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,可以根据结果执行不同的代码。
-
Java语言中提供了两种选择结构的语句
- if语句
- switch语句
2.2 if语句
if语句分为三种格式
- 格式一
if (关系表达式){
语句体;
}
执行流程:
首先判断关系表达式的结果是true还是false
如果是true就执行语句体中的代码
如果是false就不执行语句体中的代码
注意点:如果{}中只有一条代码,{}可以省略
public static void main(String[] args) {
// 格式一
System.out.println("晚上闲的没事在大街游荡");
System.out.println("发现一个成人娱乐场所");
int age = 19;
if (age >= 18) //判断是否成年
System.out.println("刷身份证");
System.out.println("回家睡觉...");
}
- 格式二
if (关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
public static void main(String[] args) {
// true:男 false:女
boolean sex = false;
if (sex){
System.out.println("去男老八快乐屋");
}else {
System.out.println("去女老八快乐屋");
}
}
- 格式三
if (关系表达式1){
执行语句1;
}else if (关系表达式2){
执行语句2;
}else if (关系表达式3){
执行语句3;
}
...
else{
执行语句n;
}
执行流程:
首先判断关系表达式1,看其结果是true还是false。
如果是true,就执行语句1;然后if语句结束
如果是false,继续判断关系表达式2是true还是false。
如果是true,就执行语句2;然后if语句结束
如果是false,就继续判断关系表达式3是true还是false。
如果是true,就执行语句3;然后if语句结束
如果是false,继续判断
…
如果没有任何关系表达式为true,就执行else中的语句n
public static void main(String[] args) {
// 结构三
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的年龄:");
int age = scanner.nextInt();
if (age >= 3 && age <= 7){
System.out.println("爸爸妈妈去上班,我去幼儿园");
}else if (age > 7 && age < 13){
System.out.println("上小学,带红领巾");
}else if (age >= 13 && age < 16){
System.out.println("上初中,开始早恋");
}else if (age >= 16 && age < 19){
System.out.println("上高中,开始苦读");
}else if (age >= 19 && age < 25){
System.out.println("上大学,公开谈恋爱");
}else {
System.out.println("开始挣钱...");
}
}
课堂练习
- 1.用户输入一个整数,判断是奇数还是偶数
public static void main(String[] args) {
// 用户输入一个整数,判断是奇数还是偶数
/**
* 获取用户输入的整数 Scanner
* 偶数:如果对2取余,结果是0,就是偶数,否则就是奇数
*/
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if (i % 2 == 0){
System.out.println("您输入的是一个偶数");
}else {
System.out.println("您输入的是一个奇数");
}
}
- 2.x和y的关系满足如下:
x >= 3 y= 2x +1
-1<x<3 y=2x;
x<=-1 y=2x - 1;
根据给定的x的值,计算出y的值并输出到控制台。
public static void main(String[] args) {
// x >= 3 y= 2x +1
// -1<x<3 y=2x;
// x<=-1 y=2x - 1;
// 创建Scanner
Scanner scanner = new Scanner(System.in);
System.out.println("请输入x的值");
int x = scanner.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);
}
- 3.根据用户输入的月份,显示正确的季节 345春天 678夏天 91011秋天 12 1 2 冬天
Scanner scanner = new Scanner(System.in);
System.out.println("请输入月份:");
int month = scanner.nextInt();
if (month >= 3 && month <= 5){
System.out.println("浅草才能没马蹄");
}else if (month >=6 && month <= 8){
System.out.println("夏天夏天...");
}else if (month >= 9 && month <= 11){
System.out.println("我言秋日胜春朝");
}else if (month == 12 || month == 1 || month == 2){
System.out.println("梅花香自苦寒来");
}else {
System.out.println("您输入的月份有误,别用我的软件");
}
- 4.键盘录入学生成绩,判断学生的等级
90-100 优秀
80-90 好
70 -80 良
60- 70 及格
60以下 希望之星
public static void main(String[] args) {
/**
* - 键盘录入学生成绩,判断学生的等级
* 90-100 优秀
* 80-90 好
* 70 -80 良
* 60- 70 及格
* 60以下 希望之星
*/
// 创建
Scanner scanner = new Scanner(System.in);
System.out.println("请录入学生成绩:");
double score = scanner.nextDouble();
// 根据成绩判断学生等级
if (score >= 90 && score <= 100){
System.out.println("学生成绩是优秀");
}else if (score >= 80 && score < 90){
System.out.println("学生成绩是好");
}else if (score >= 70 && score < 80){
System.out.println("学生成绩是良");
}else if (score >=60 && score < 70){
System.out.println("学生成绩是及格");
}else if (score >=0 && score < 60){
System.out.println("学生是希望之星");
}else {
System.out.println("成绩不合理!!");
}
}
2.3 switch语句
- 格式
switch(表达式){
case 目标值1:
语句体1;
break;
case 目标值2:
语句体2;
break;
...
case 目标值n:
语句体n;
break;
default:
语句体n+1;
break;
}
switch的格式解释:
switch中的表达式的取值可以是:byte,short,int,char
JDK5之后表达式的取值也可以是枚举
JDK7以后可以放String。
case中放入的是要和表达式进行比较的值。
语句体中可以放多行代码
public static void main(String[] args) {
int a = 5;
switch (a){
case 1:
System.out.println("匹配到1");
break;
case 2:
System.out.println("匹配到2");
break;
case 3:
System.out.println("匹配到3");
break;
default:
System.out.println("不是123的数字");
break;
}
}
- 根据用户输入的数字,输出是周几
public static void main(String[] args) {
// 根据用户输入的数字,输出是周几
Scanner scanner = new Scanner(System.in);
System.out.println("请输入1-7的数字:");
int weekDay = scanner.nextInt();
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("傻X");
break;
}
}
注意事项:
default的break如果是在switch语句的最后一行,可以省略不写,但是不建议省略。
switch中的语句,顺序不影响最终的结果。
case具有穿透效果,如果没有break的影响,那么会一直向下执行。
课堂练习
- 根据用户输入的月份,显示正确的季节 345春天 678夏天 91011秋天 12 1 2 冬天
public static void main(String[] args) {
// 根据用户输入的月份,显示正确的季节 345春天 678夏天 91011秋天 12 1 2 冬天
Scanner scanner = new Scanner(System.in);
System.out.println("请输入月份:");
int month = scanner.nextInt();
// shift + alt + 上下
switch (month){
case 3:
case 4:
case 5:
System.out.println("春天是成长的季节");
break;
case 6:
case 7:
case 8:
System.out.println("夏天夏天悄悄过去,留下小秘密");
break;
case 9:
case 10:
case 11:
System.out.println("秋天是收获的季节");
break;
case 12:
case 1:
case 2:
System.out.println("冬天是养膘的季节");
break;
default:
System.out.println("没有这个月份");
break;
}
}
3 循环结构
3.1 概述
循环结构可以在满足循环条件的情况下,反复执行某一段代码。这段被重复执行的代码称之为循环体语句。
当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环。如果一直是true,就会一直执行下去,形成死循环。
3.2 循环语句的组成
- 循环变量的初始化(初始化表达式) 类似于笔墨伺候 初始化表达式只需要执行一次
一条或者多条语句,这些语句完成一些初始化操作
- 循环出口(布尔表达式)
这是一个boolean表达式,这个表达式能决定是否执行循环体。
- 循环逻辑内容(循环体)
这个部分是循环体语句,也就是我们要多次执行的代码。
- 循环增量(步进表达式)
这个部分是在一次循环体结束后,下一次循环判断条件执行前执行,用于控制循环条件中的变量,以在合适时候结束循环。
3.3 循环结构for
- 格式:
for (初始化表达式1;布尔表达式2;步进表达式4){
循环体;3
}
- 执行顺序
1 2 3 4 2 3 4 2 3 4…2 3 4 2
当布尔表达式结果是true时,循环会继续执行。当布尔表达式结果是false时,就会结束循环。
课堂练习
- 在控制台输出100次HelloWorld
// 在控制台输出100次HelloWorld
// 1 2 3 4 2 3 4 2 3 4... 2
for (int i = 1;i <= 100;i++){
System.out.println("HelloWorld" + i);
}
- 打印输出1-5 和 5-1
for (int i = 1;i <= 5;i++){
System.out.println(i);
}
for (int i = 5;i >= 1;i--){
System.out.println(i);
}
- 求出1-100之间的偶数和
// 求出1-100之间的偶数和
int sum = 0;
for (int i = 1;i <= 100;i++){
// 判断i是否是偶数
if (i % 2 == 0){
// 偶数
sum += i;
}
}
System.out.println("偶数和是" + sum);
for (int i = 2;i <= 100;i+=2){
sum += i;
}
System.out.println("偶数和是" + sum);
- 统计"水仙花数"共有多少个
- "水仙花数"是一个三位数,其中个位的立方+十位的立方+百位的立方正好等于其本身。
// 统计"水仙花数"共有多少个
int count = 0;
for (int i = 100;i < 1000;i++){
// 判断三位数是否是水仙花数
// 获取个位
int ge = i % 10;
// 获取十位
int shi = i / 10 % 10;
// 获取百位
int bai = i / 100 % 10;
int num = ge * ge * ge + shi * shi * shi + bai * bai * bai;
boolean flag = (num == i);
if (flag){
// 水仙花数
System.out.println("水仙花数是" + i);
count++;
}
}
System.out.println("水仙花数总共有" + count + "个");
}
3.4 while循环
- 格式:
基本格式:
while(布尔表达式){
循环体语句;
}
扩展格式:
初始化表达式1
while(布尔表达式2){
循环体3;
步进表达式4;
}
- 执行顺序
1 2 3 4 2 3 4 … 2
- 当布尔表达式的结果是true时,循环继续执行,当布尔表达式的结果是false时,循环结束。
课堂练习
- 输出100次HelloWorld
int i = 1;
while (i <= 100){
System.out.println("HelloWorld" + i);
i++;
}
- 求出1-100之间的奇数和
// 求出1-100的奇数和
int i = 1;
int sum = 0;
while (i <= 100){
// 判断i是否是奇数
if (i % 2 != 0){
sum += i;
System.out.println(i);
}
i++;
}
System.out.println("1-100的奇数和是" + sum);
第二种写法
int i = 1;
int sum = 0;
while (i <= 100){
sum += i;
i += 2;
}
System.out.println("1-100的奇数和是" + sum);
- 统计水仙花数有多少个
// 统计水仙花数有多少个
int i = 100;
int count = 0;
while (i < 1000){
// 获取i的个位十位和百位
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
int num = (ge * ge * ge + shi * shi * shi + bai * bai * bai);
if (num == i){
System.out.println(i);
count++;
}
i++;
}
System.out.println("水仙花数总共有" + count + "个");
3.5 do-while循环
- 格式
初始化表达式1;
do{
循环体3;
步进表达式4;
}while(布尔表达式2);
- 执行顺序
1 3 4 2 3 4 2 3 4 2…2
- 布尔表达式如果结果是true,那么就继续执行循环,如果是false,就结束循环
课堂练习
- 输出打印100次HelloWorld
- 求出1-100之间的奇数和
int i = 1;
int sum = 0;
do{
if (i % 2 == 1){
sum += i;
}
i++;
}while (i <= 100);
System.out.println("奇数和是" + sum);
int i = 1;
int sum = 0;
do{
sum += i;
i += 2;
}while (i <= 100);
System.out.println("奇数和是" + sum);
- 统计水仙花数有多少个
// 统计水仙花数有多少个
int i = 100;
int count = 0;
do {
// 获取个位十位和百位
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
// 求个位十位百位的立方和
int num = ge * ge * ge + shi * shi * shi + bai * bai * bai;
if (num == i){
count++;
}
i++;
}while (i < 1000);
System.out.println("水仙花数总共有" + count + "个");
3.6 三种循环的区别
这三种循环在大部分情况下都可以通用,但是还是有一些小区别:
-
do…while循环至少会执行一次循环体
-
for循环和while循环的小区别:
- 使用区别:控制条件语句所控制的那个变量,在for循环结束后就已经不能再次访问,在内存中消失。在while循环结束后,内存中依然存在。
- for循环内存的使用效率更高。
-
使用推荐:for --while – dowhile
3.7 跳转控制语句
- 概述
- 让循环在某一步的时候结束或者跳过某些数据。
- 在java中提供了2个关键字break和continue来实现跳转控制语句。
- break(中断)
- break的应用场景
- 在选择结构的switch语句中
- 在循环语句中表示立即结束当前循环
- 注意:离开使用场景的存在是没有意义的
- break的应用场景
- continue(继续)
- continue的应用场景
- 只能用在循环语句中
- 表示跳出当前循环,继续执行下一次循环
- continue一般都用在for循环中,这样不会影响步进表达式的执行
- continue的应用场景
3.8 死循环
死循环又称为无限循环,也称为永真循环。就是永远不会结束的循环。
while (true){}
for (;true;){}
for (;;){}
作业
分支作业:
-
- 现要求⽤户输⼊两个数a、b,如果a能被b整除或a加b⼤于1000,则输出a,否则输出b
Scanner scanner = new Scanner(System.in);
System.out.println("请您输入两个整数");
long a = scanner.nextLong();
long b = scanner.nextLong();
if (a % b == 0 || a + b > 1000){
System.out.println("a = " + a);
}else {
System.out.println("b = " + b);
}
-
- 动态录⼊3个数,请使⽤条件结构/三元运算符求3个数的最值
//
Scanner scanner = new Scanner(System.in);
System.out.println("请输入3个整数");
// alt + 鼠标左键
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = scanner.nextInt();
int max;//最大值
if (a > b){
max = a;
}else {
max = b;
}
if (max > c){
System.out.println("最大值是" + max);
}else {
System.out.println("最大值是" + c);
}
第二种写法
Scanner scanner = new Scanner(System.in);
System.out.println("请输入3个整数");
// alt + 鼠标左键
int a = scanner.nextInt();// 10
int b = scanner.nextInt();// 5
int c = scanner.nextInt();// 20
int max;//最大值
if (a > b){
if (a > c){
System.out.println("最大值是" + a);
}else {
// a <= c
System.out.println("最大值是" + c);
}
}else {
// a <= b
if (b > c){
System.out.println("最大值是" + b);
}else {
System.out.println("最大值是" + c);
}
}
-
- 输⼊⼀个数,判断它是否能被3、5、7整除,注意考虑同时整除的情况
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字");
int num = scanner.nextInt();
boolean flag1 = (num % 3 == 0);//能够被3整除
boolean flag2 = (num % 5 == 0);//能够被5整除
boolean flag3 = (num % 7 == 0);//能够被7整除
if (flag1 && flag2 && flag3){
System.out.println("能够被3,5,7整除");
}else if (flag1 && flag2){
System.out.println("能够被3,5整除");
}else if (flag1 && flag3){
System.out.println("能够被3,7整除");
}else if (flag2 && flag3){
System.out.println("能够被5,7整除");
}else if (flag1){
System.out.println("能够被3整除");
}else if (flag2){
System.out.println("能够被5整除");
}else if (flag3){
System.out.println("能够被7整除");
}else {
System.out.println("不能被3,5,7整除");
}
- 超市为了促销,规定:购物不⾜50元的按原价付款,超过50不⾜100的按九折付款,超过100元 的,超过部分按⼋折付款。编程序完成超市的⾃动计费的⼯作。
Scanner scanner = new Scanner(System.in);
double money = scanner.nextDouble();
if (money > 50 && money <= 100){
money *= 0.9;
}else if (money > 100){
money = (money - 100) * 0.8 + 90;
}
System.out.println("实际支付的金额是" + money);
5. 商场实⾏新的抽奖规则:会员号的百位数字等于产⽣的随机数字即为幸运会员。实现如下功能:
1、从键盘接收4位数会员号 1234
2、⽣成随机数
提示:int random = (int) (Math.random() * 10);
3、算出会员号中在百位的数字号码
提示:int baiwei = custNo / 100 % 10;
// Math.random() 是获取伪随机数 范围是 [0,1)
Scanner scanner = new Scanner(System.in);
System.out.println("请录入一个4位数的会员号码:");
// 会员号
int memberCardNo = scanner.nextInt();
// 获取会员号的百位的数字
int bai = memberCardNo / 100 % 10;
// 生成一个 0-9 的随机数 一个小数强转成整数,是把整个小数部分全部舍弃
int randomNum = (int)(Math.random() * 10);
System.out.println(randomNum);
if (randomNum == bai){
System.out.println("恭喜你,中奖了!充值1000立减5元!");
}
循环作业:
- 要求⽤户输⼊⼀个0到2之间的整数
// 如果⽤户输⼊0输出“你出的是⽯头”,
// 如果⽤户输⼊1就输出“你出的是剪⼑”,
// 如果⽤户输⼊的是2就输出“你出的是布”,
// 然后再问是否要继续出拳,
// 如果回答“y”就重复以上过程,
// 否则结束程序
Scanner scanner = new Scanner(System.in);
String answer = "y";
while ("y".equals(answer)){
System.out.println("请输入一个0到2之间的整数");
int num = scanner.nextInt();
switch (num){
case 0:
System.out.println("你出的是⽯头");
break;
case 1:
System.out.println("你出的是剪⼑");
break;
case 2:
System.out.println("你出的是布");
break;
default:
System.out.println("输入的数字有误");
}
System.out.println("是否要继续出拳?y/n");
// 获取用户输入的字符串
answer = scanner.next();
}
- 求1到100之间所有能被3整除的整数的总和
int sum = 0;
for (int i = 1;i <= 100;i++){
if (i % 3 == 0){
sum += i;
}
}
System.out.println("和是" + sum);
- 计算⽤户输⼊的⽇期离1900年1⽉1⽇相距多少天
// 1900 6 1 31 + 28 + 31 +30 + 31
Scanner scanner = new Scanner(System.in);
// 年
int year = scanner.nextInt();
// 月
int month = scanner.nextInt();
// 日
int day = scanner.nextInt();
// 1901 1 3
// totalDay代表的是总天数
// 计算 天
int totalDay = day - 1;
// 计算 年 循环的添加每一年的天数
for (int y = 1900;y < year;y++){
// 判断是否是闰年
// 闰年 能被4整除并且不能被100整除
// 闰年 能够被400整除
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
totalDay += 366;
}else {
totalDay += 365;
}
}
// 计算月 循环的添加每个月的天数
for (int m = 1; m < month;m++){
switch (m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
totalDay += 31;
break;
case 2:
// 闰年
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){
totalDay += 29;
break;
}
totalDay += 28;
break;
default:
totalDay += 30;
break;
}
}
System.out.println("距离1900年1月1日的天数是" + totalDay + "天");
-
- 打印出所有0到100之间 带3和3的倍数的数
int count = 0;
for (int num = 100; num >= 0;num--){
int bai = num / 100 % 10;
int shi = num / 10 % 10;
int ge = num % 10;
if (num % 3 == 0 || bai == 3 || shi == 3 || ge == 3){
count++;
// println 输出并且换行
// print 输出但是不换行
if (count == 1){
System.out.print(num);
continue;
}
System.out.print("," + num);
}
}