流程控制语句
定义:
通过一些语句,控制程序的执行流程。
顺序结构
定义:
是Java程序默认的执行流程,按照代码的先后顺序,从上到下一次执行。
分支结构
if
定义:
在程序中用来进行判断的。
格式:
-
if(关系表达式){
语句体;
}
if的注意点:
- 大括号的开头可以另起一行,但是建议写在第一行末尾。
- 在语句体中,如果只有一句代码,大括号可以省略不写
- 如果对一个布尔类型的变量进行判断,不要用==号,直接把变量写在小括号即可。
练习——自动驾驶
有一辆自动驾驶的汽车。如果是红灯就会自动停止,如果是绿灯就会自动驾驶。
-
if(关系表达式){
语句体1;
}else{
语句体2 ;
}
练习1——商品付款
需求:假设,用户在超市实际购买,商品总价为600元。键盘录入一个整数表示用户实际支付的钱。如果付款大于等于600,表示付款成功。否则付款失败。
练习2——影院选座
需求:假设某电影院,它买的票有票号。票号的范围是1~100。如果你买到的是奇数的票号坐左边。反之,坐右边。键盘录入一个整数表示电影票的票号。根据不同情况,给出不同的提示:
如果票号为奇数,打印坐左边。如果票号为偶数,打印坐右边。
-
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2 ;
}
···
else{
语句体n+1 ;
}
从上往下一次判断,只要有一个判断为真,就执行对应的语句体。如果所有的判断都为假,就执行else的语句体。
练习——商品的价格
需求:商场都会有VIP的会员制,根据不同的会员会有不同的折扣。假设商品总价为10000 。
键盘录入会员级别,并计算出实际支付的钱。
会员1级:打9折
会员2级:打8折
会员3级:打7折
非会员:不打折
switch
格式:
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
练习——学习计划
需求:键盘录入星期数,显示今天的学习活动。
周一:学语文
周二:学数学
周三:学英语
周四:学地理
周五:学物理
周六:学生物
周日:休息
default的位置和省略
位置:default位置不一定是写在最下面的,只不过我们平时习惯写在最下面。
省略:default可省,语法不会报错,但是不建议。
public class switchDemo{
public static void main(String[] args){
int number =1;
switch(number){
case 1:
System.out.println("number的值为1");
break;
case 10:
System.out.println("number的值为10");
break;
case 100:
System.out.println("number的值为100");
break;
default:
System.out.println("number的值为不是1,10,100");
break;
}
}
}
case穿透
产生原因:
语句体中没有写break导致的。
执行流程:
- 首先还是会那个小括号中表达式的值跟下面每一个case进行匹配。
- 如果匹配上了,就会执行对应的语句体,如果此时发现了break,那么结束整个switch语句。
- 如果没有发现break,那么程序会继续执行下一个case的语句体,一直遇到break或者大括号为止。
使用场景:
如果多个case的语句体重复了,可以考虑利用case穿透去简化代码。
switch新特性(JDK12+)
- 用->替换: 用{}替换break,不会发生case穿透。
- 当语句体只有一句时,{}可以省略。
public class switchDemo{
public static void main(String[] args){
int number = 1;
switch(number){
case 1 -> System.out.println("一");
case 2 -> {
System.out.println("二");
}
case 3 -> {
System.out.println("三");
}
default -> {
System.out.println("没有这个选项");
}
}
}
}
- JDK14中扩展了switch可以作为表达式进行赋值或打印操作
public class SwitchTest {
public static void main(String[] args) {
Weekday day = Weekday.MON; //初始化一个枚举变量
//JDK14中扩展了switch可以作为表达式
//将表达式的值打印出来
System.out.println(switch(day){
case MON, TUE, WEN -> "上半周";
case THU, FRI -> "下半周";
case SAT, SUN -> "周末";
});
//将表达式的值赋值给一个变量
String text = switch(day){
case MON, TUE, WEN -> "上半周";
case THU, FRI -> "下半周";
case SAT, SUN -> "周末";
};
}
}
//定义枚举
enum Weekday{
MON,TUE,WEN,THU,FRI,SAT,SUN
}
switch和if第三种格式各自的使用场景
if第三种格式:一般用于对范围的判断
switch:把有限个数据一一列举出来,让我们任选其一
练习——休息日和工作日
需求:键盘录入星期数,输出工作日、休息日。(1-5)工作日,(6-7)休息日。
循环结构
定义:
重复的做某件事情
具有明确的开始和停止标记
for
格式:
- 初始化语句只执行一次
- 判断语句为true,循环继续
- 判断语句为false,循环结束
for(初始化语句;条件判断语句;条件控制语句){
循环体语句;
}
练习——输出数字
需求1:打印1-5
需求2:打印5-1
package com.example.demo;
public class Test {
public static void main(String[] args){
// 需求1
for(int i = 1;i <= 5; i++){
System.out.println(i);
}
// 需求2
for(int z = 5; z >= 1; z--){
System.out.println(z);
}
}
}
练习——求和
需求:求1-5之间的和
package com.example.demo;
public class Test {
public static void main(String[] args){
// 需求:求1-5的和
//扩展小点:
//1.求和的变量不能定义在循环里面,因为变量只在所属的大括号中有效
//2.如果我们把变量定义在循环的里面,那么当前变量只能在本次循环中有效。
//当本次循环结束之后,变量就会从内存中消失
//第二次循环开始的时候,又会重新定义一个新的变量。
int sum = 0;
for(int i = 1;i <= 5; i++){
sum += i;
}
System.out.println(sum);
}
}
需求:求1-100之间的偶数和
package com.example.demo;
public class Test {
public static void main(String[] args){
// 需求:求1-100的偶数和
int sum = 0;
for ( int i = 1; i <= 100; i++) {
if(i % 2 == 0) {
sum += i;
}
}
System.out.println(sum);
}
}
需求:键盘录入两个数字,表示一个范围。统计这个范围中:既能被3整除,又能被5整除的数字有多少个?
package com.example.demo;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 需求:键盘录入两个数字,表示一个范围。统计这个范围中:既能被3整除,又能被5整除的数字有多少个?
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数表示范围的开始");
int a = scanner.nextInt();
System.out.println("请输入一个数字表示范围的结束");
int b = scanner.nextInt();
int count = 0;
for (int i=a;i<=b;i++){
if(i%3== 0 && i%5 == 0){
count++;
}
}
System.out.println(count);
}
}
while
格式:
初始化语句;
while(条件判断){
循环体语句;
条件控制语句;
}
- 初始化语句只执行一次
- 判断语句为true,循环继续
- 判断语句为false,循环结束
for和while的对比
相同点:运行规则都是一样的
区别:
for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次访问到了。知道循环的次数或者循环的范围。
while循环中控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用。不知道循环的次数和范围,只知道循环的结束条件。
练习——打印折纸的次数
需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
package com.example.demo;
public class Test {
public static void main(String[] args) {
//纸张初始厚度
double paper = 0.1;
//山峰高度
double hight = 8844430;
//统计次数
int count = 0;
while ( paper <= hight){
//折叠纸张
paper *= 2;
count++;
}
System.out.println(count);
}
}
练习——回文数
需求:给你一个整数X。如果X是一个回文整数,打印true,否则,返回false。
解释:回文整数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如:121是回文,123不是。
package com.example.demo;
public class Test {
public static void main(String[] args) {
// 1.定义数字
int x = 1234;
// 用来记录x原来的值
int temp = x;
int num = 0;
// 2.利用循环开始
while(x != 0){
// 从右往左获取每一位数字
int ge = x % 10;
x /= 10;
//把当前获取的数字拼接到最右边
num = num * 10 + ge;
}
System.out.println(num);
// 比较
System.out.println(num == temp);
}
}
练习——求商和余数
需求:给定两个整数,被除数和除数(都是正数,且不超过int的范围)
将两数相除,要求不使用乘法、除法和%运算符。
package com.example.demo;
public class Test {
public static void main(String[] args) {
// 定义变量记录被除数
int dividend = 100;
// 定义变量记录除数
int dividor = 10;
// 记录商
int count = 0;
// 只要被除数大于或等于除数,就一直循环
while ( dividend >= dividor){
// 记录余数
dividend = dividend-dividor;
count++;
}
System.out.println(dividend);
System.out.println(count);
}
}
do…while
格式:
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);
先执行后判断
循环高级
无限循环
循环一直停不下来
注意事项:
无限循环的下面不能再写其他代码了,因为循环永远停不下来,那么下面的代码永远不会被执行。
跳转控制语句
在循环的过程中,跳到其他语句上执行
**continue:**结束本次循环,继续下次循环。
package com.example.demo;
public class Test {
public static void main(String[] args) {
for (int i = 1; i<= 5; i++){
if(i == 3){
continue;
}
System.out.println("小老虎在吃第"+i+"包子");
}
}
}
break:结束整个循环
package com.example.demo;
public class Test {
public static void main(String[] args) {
for (int i = 1; i<= 5; i++){
if(i == 3){
break;
}
System.out.println("小老虎在吃第"+i+"包子");
}
}
}
练习
案例1:逢七过
游戏规则:从任意一个数字开始报数,当你要报的数字是7的倍数或者包含数字7时都要说:过
需求:使用程序在控制台打印出1-100之间的满足逢7必过规则的数据
package com.example.demo;
public class Test {
public static void main(String[] args) {
for (int i = 1; i<= 100; i++){
if(i % 10 == 7 || i/10%10== 7 || i%7 == 0){
System.out.println("过");
continue;
}
System.out.println(i);
}
}
}
案例2:求平方根
需求:键盘录入一个大于等于2的整数x,计算并返回x的平方根。结果只保留整数的部分,小数部分将被丢弃。
package com.example.demo;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
for (int i = 2; i<= x;i++){
if ((i * i) == x){
System.out.println(i+"就是"+x+"的平方根");
break;
}else if((i * i) > x){
System.out.println((i - 1)+ "就是" + x + "平方根的整数部分");
break;
}
}
}
}
案例3:求质数
需求:键盘录入一个正整数x,判断该整数是否为一个质数。
package com.example.demo;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
boolean flag = true;
for (int i = 2; i<= x-1;i++){
if(x % i == 0 ){
flag = false;
break;
}
}
if(flag){
System.out.println(x+"是一个质数");
}else {
System.out.println(x+"不是一个质数");
}
}
}
案例3:求质数
需求:键盘录入一个正整数x,判断该整数是否为一个质数。
package com.example.demo;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
boolean flag = true;
for (int i = 2; i<= x-1;i++){
if(x % i == 0 ){
flag = false;
break;
}
}
if(flag){
System.out.println(x+"是一个质数");
}else {
System.out.println(x+"不是一个质数");
}
}
}