JavaSE(3)(流程控制,循环)

发布时间 2023-09-01 14:14:45作者: 大宝贝94106

JavaSE(3)(流程控制,循环)

条件控制语句

p40 if 语句

  1. 大括号的开头可以另起一行书写, 但是建议写在第一行的末尾.
  2. 再语句体中, 如果只有一句代码, 大括号可以省略不写.(建议不省略)
  3. 如果对一个布尔型变量做判断, 不要用==号, 直接把变量写在小括号中即可.

p41 if - else 为 二选一

练习 : (if -else) 电影院买票 1~100 格座位, 奇数号坐左边, 偶数号坐右边, 录入一个座位号, 输出左边或右边.

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入你的座位号:(1-100)");
            int num = sc.nextInt();
            if (num <= 100 && num > 0) {    //限制num在1-100之间
                if (num % 2 == 0) { //偶数
                    System.out.println("右边");
                } else {    //奇数
                    System.out.println("左边");
                }
            }else System.out.println("错误,重新输入");
        }
    }

p42 if - else if - ... else 多选一

练习 : (if - else if 多选一) 考试成绩评价, 100-90 为 A , 89-80 为 B , 79-70 为 C , 69-0 为 D. 录入成绩 , 并评价.

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入你的成绩:(1-100)");
            int score = sc.nextInt();
            if (score >= 0 && score <= 100) {   //判断在正常范围内
                if (score >= 90) {
                    System.out.println("A");    
                } else if (score >= 80) {
                    System.out.println("B");
                } else if (score >= 70) {
                    System.out.println("C");
                } else System.out.println("D");
            }else System.out.println("输入错误");
        }
    }

练习 : (if - else if 多选一) 会员打折, 非会员(0)不打折, 会员1打9折, 会员2打8折, 会员3打7折, 录入商品价格(0-99999), 再录入会员等级(0-3), 输出实际价格

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入你的会员等级:(0-3)");
            int level = sc.nextInt();   //
            System.out.println("输入商品价格:(0-99999)");
            int price = sc.nextInt();
            if (level <= 3 && level >= 0 && price <= 99999 && price >= 0) {   //正常范围
                if (level == 1) {
                    System.out.println("商品折后价格为:" + price * 0.9);
                } else if (level == 2) {
                    System.out.println("商品折后价格为:" + price * 0.8);
                } else if (level == 3) {
                    System.out.println("商品折后价格为:" + price * 0.7);

                } else System.out.println("商品折后价格为:" + price);
            } else System.out.println("输入错误, 重新输入:");
        }
    }

p43 switch case

/*格式 : switch (表达式) {
case 值1 :	
        	语句体1 ;
			break;
case 值2 :	
        	语句体2 ;
			break;
			......
default :
			语句体 n + 1 ;
			break ;
}*/

执行流程:

I. 首先计算表达式的值。

II. 依次和 case 后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程 中,遇到break就会结束。

III. 如果所有的 case 后面的值和表达式的值都不匹配, 就会执行 default 里面的语句体, 然后 结束整个switch语句。

格式说明:

I. 表达式: (将要匹配的值)取值为byte、short、int、char。

​ JDK5以后可以是枚举,JDK7以后可以是String。

II. case: 后面跟的是要和表达式进行比较的值(被匹配的值)。

III. break: 表示中断,结束的意思,用来结束switch语句。

IV. default: 表示所有情况都不匹配的时候,就执行该处的内容,

​ 和if语句的else相似。

V. case后面的值只能是字面量,不能是变量

VI. case 给出的值不允许重复

练习 : 运动计划 : 需求 : 录入星期数, 显示当天的活动.

周一: 跑步 周二: 游泳 周三: 慢走 周四: 单车 周五: 爬山 周六: 打篮球 周日: 好好吃一顿

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入星期几:(0-7)");
            int day = sc.nextInt();   //
            switch (day) {
                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("输入错误.");
            }
        }
    }

ctrl + shift + / - 多行注释

p44 default 的位置和省略

  1. 位置 : default 不一定要写在最下面, 我们可以写在任何位置, 只不过习惯写在最下面.
  2. 省略 : default可以省略, 语法不会有问题, 但是不建议省略.

case 穿透

就是语句中没写 break 导致的.

执行流程 : 首先匹配case, 匹配上了就执行, 如果没有break, 就接着执行下一个case的语句, 直到遇到break或右大括号为止.

使用场景 : 如果多个case语句体重复了, 我们就考虑利用case穿透去简化代码.

JDK 12 switch的新特性

简略写法 :

//如果case后的语句只有一句,那么就可以用2,3的写法省略大括号
    switch (day) {
           case 1 -> {
               System.out.println("周一: 跑步");
       }
           case 2 -> System.out.println("周二: 游泳");
           case 3 -> System.out.println("周三: 慢走");
           default -> System.out.println("输入错误.");
       }

switch和if 各自的使用场景

if的第三种格式 : 一般用于对范围的判断. 比如例子成绩评价.

switch : 把有限格数据一一列举出来, 让我们任选其一. 比如例子运动计划.

练习 : 工作日

需求 : 录入星期数, 输出工作日或休息日. 1-5工作日, 6-7休息日.

package Demo01;

import java.util.Scanner;

/*
练习 : 工作日
需求 : 录入星期数, 输出工作日或休息日. 1-5工作日, 6-7休息日.
 */
public class helloWorld {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("输入星期数:");
            int week = sc.nextInt();

            // <<使用 if>>
//        if (week >= 1 && week <= 5){
//            System.out.println("工作日");
//        }else if (week <=7 && week >=6){
//            System.out.println("休息日");
//        }else System.out.println("输入错误.");

            // <<使用switch>>
//            switch (week) {
//                case 1:     //case穿透
//                case 2:
//                case 3:
//                case 4:
//                case 5: System.out.println("工作日");
//                        break;
//                case 6:
//                case 7: System.out.println("休息日");
//                        break;
//                default:
//                    System.out.println("输入错误.");
//            }
            // <<使用switch>>简化写法1.
//            switch (week){
//                case 1,2,3,4,5 :      ----把要穿透的case写在一起----
//                    System.out.println("工作日");
//                    break;
//                case 6,7 :System.out.println("休息日");
//                    break;
//                default:
//                   System.out.println("输入错误.");
//            }
            // <<使用switch>>简化写法2.
            switch (week) {  //jdk12后的特性 ->
                case 1, 2, 3, 4, 5 -> System.out.println("工作日");
                case 6, 7 -> System.out.println("休息日");
                default -> System.out.println("输入错误.");
            }
        }
    }
}

循环结构

p45 for循环

注意点 : 变量的作用域 : 在循环中变量只在所属的大括号中有效.

​ 所以在用循环累加时,求和的变量不能定义在循环里面, 要定义在循环外.

简便写法 100.fori 就等于 变量i 循环一百次.

在实际开发中, 如果需要获取一个范围中的每一个数据时, 就能用到循环. 但是, 大多数情况下,不会获取所有的数据, 而是获取符合要求的数据.

p46 练习 : 求和. 需求 : 求1~100之间的偶数和.

 public static void main(String[] args) {
        int sum = 0;    //累加变量定义在循环外
        for (int i = 1; i <= 100; i++){ //从1到100
            if (i % 2 == 0){    //判断是偶数
                sum += i;   //累加
            }
        }
        System.out.println(sum);    //输出结果
    }

练习 : 统计满足条件的数字

需求 : 录入两个数字, 表示一个范围, 统计这个范围中, 既能被3整除,又能被5整除的数字有多少格?

 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 counts = 0; //统计个数
        for (int i = start; i <= end; i++) { //从start开始到end结束,<<简写为end.fori>>
            if (i % 3 == 0 && i % 5 == 0) {  //既能被3整除,又能被5整除的数
                counts++;                //累加进入此循环的次数
                System.out.println(i);  //输出这个数
            }
        }
        System.out.println("这样的数有" + counts + "个");//输出个数
    }

p47 while 循环

for 和 while 的对比 :

相同点 : 运行规律都是一样的.

不同点 : (从变量的角度)

  • for 循环中, 控制循环的变量, 因为归属循环的语法结构中, 在for循环结束后, 就不能再次被访问到了.

  • while循环中, 控制循环的变量, 不归属于其语法结构中, 在while循环结束后, 该变量还可以继续使用.

//但是for循环写成这样,变量的作用域就和while一样了
int i = 0;
for( ; i < 4 ; i++){
    System.out.println(i);
}
//while循环
int i = 0;	//初始化语句
while(i < 4){	//条件判断语句
    System.out.println(i); //循环体语句
    i++		//条件控制语句
}

不同点 :(从应用场景)

  • for循环中 : 知道循环次数或者循环范围.
  • while循环中 : 不知道循环次数和范围, 值知道循环的结束条件.

练习 : 折纸的次数.

需求 : 珠穆朗玛峰高(8848.43米=8848430毫米), 假如我有一张足够大的纸张, 他的厚度是0.1毫米, 请问, 我折叠多少次, 可以折成珠穆朗玛峰的高度?

 public static void main(String[] args) {
        int counts = 0; //折叠的次数
        double thickness = 0.1; //纸的厚度
        while (thickness <= 8848430) { //大于等于山高就停止循环
            thickness *= 2; //每次对折
            counts++;   //累加次数
        }
        System.out.println("需要折" + counts + "次");
    }

p48 练习 : 回文数

需求 : 给你一个整数 x , 如果x 是一个回文整数, 输出true, 否则 输出false, 例如: 121是回文数, 123 就不是.

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个整数:");
        int x = sc.nextInt();
        int temp = x;   //临时保存x原来的值,最后用于比较.(因为x最后要等于0.)
        int num = 0;    //倒序的x
        //把原数倒序
        while (x != 0){
            int ge = x % 10; //获取个位数
            x /= 10;    //个位数没用了,去掉个位数
            num = num * 10 + ge;  //这个式子可以把获得数字拼接到最右边
        }
        System.out.println(temp == num); //俩数比较,如果一样输出true
    }

练习 : 求商和余数

需求 : 给定两个整数, 被除数和除数( 都是正数, 且不超过int的范围).

将两个数相除, 要求不使用乘法, 除法和 % 运算符, 得到商和余数.

 public static void main(String[] args) {
        int a = 100; //被除数
        int b = 23; //除数
        int i = 0; //商
        int y = 0; //余数
        while (a >= b){
            a = a - b;
            i ++;
        }
        System.out.println(i);
        System.out.println(a);
    }

do while 循环

先执行, 后判断.

//格式
public static void main(String[] args) {
       int i = 0;  //初始化语句
       do {
           System.out.println(i); //循环体语句
           i++;           //条件控制语句
       } while (i < 10); //条件判断语句
   }

p49 循环综合练习

无限循环

三种格式

for(;;){	//for循环的三个条件都可以不写,不写条件判断语句就会无限循环
    System.out.println("java");
}
//-----------
while(true){	//true一定要写
    System.out.println("java");
}
//------------
do{
    System.out.println("java");
}while(true);	

我们一般用 while 做无限循环.

无限循环的下面不能写其他代码, 上面无限循环, 下面的代码永远也不能执行.

跳转控制循环

  1. continue : 跳过本次循环, 继续执行下次循环.
  2. break : 结束整个循环.
//continue
//循环5次, 跳过第三次
        for (int i = 1; i <= 5; i++) {
            if (i == 3){
                continue;   //跳过 3 这次循环
            }
            System.out.println(i);
        }
1
2
4
5
//break
 //循环5次, 到第三次就结束循环
        for (int i = 1; i <= 5; i++) {
            if (i == 3){
                break;   //结束循环
            }
            System.out.println(i);
        }
1
2

p50 练习-逢七过

需求 : 输出1-100间的数字, 包含7或者7的倍数要标记出来 "过!".

 for (int i = 1; i <= 100; i++) {
            if (i % 7 == 0 || i % 10 == 7 || i / 10 % 10 == 7){
                System.out.println(i + "<<过!");  //过!!
                continue;   //结束本次循环,继续下一轮
            }
            System.out.println(i);
        }

p51 练习-求平方根

需求 : 录入一个大于等于2 的整数 x , 计算并返回 x 的平方根. 结果只保留整数部分,小数部分将被舍去.

win + R -> calc : 计算器

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("InputNumber:");
        int x = sc.nextInt();
        for (int i = 1; i <= x; i++) { //从1开始, 大于x 就结束,
            if (i * i == x) {       //循环乘方判断,如果等于x, 就是它的平方根.结束循环
                System.out.println(i + "是" + x + "的平方根.");
                break;
            } else if (i * i > x) { //如果大于x 就说明过了,输出i-1(这次循环的上一个数), 结束循环
                System.out.println((i - 1) + "是" + x + "的平方根整数部分.");
                break;
            }
        }
    }

p52 练习-- 判断质数

练习16: 判断质数
需求 : 录入一个整数, 判断它是否是质数.

 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("InputNumber:");
        int x = sc.nextInt();
        //只能被1 和 它本身 整除的数 就是质数.
        int i = 2;  //从2开始累加(去掉1和这个数自己)
        boolean flag = true;//是否是质数
        while (i < x) {  //被除数要小于除数
            if (x % i == 0) {  //被除尽了就不是质数
                //输出可以被什么数除尽
                System.out.println("可以被" + i + "整除.");
                flag = false;
            }
            i++;
        }
        if (flag) {
            System.out.println(x + "是质数.");
        } else
            System.out.println(x + "不是质数.");
    }

p53 练习- 猜数字小游戏

获取随机数 Random类

import java.util.Random; //导包
Random r = new Random(); // 创建对象
int number = r.nextInt(10); // 获取随机数, 参数为随机数的范围(0~9)
//这个范围一定是从0开始,到这个数 -1结束.
//口诀: 包头不包尾, 包左不包右

技巧 : 生成任意随机数

  1. 让这个范围头尾减去一个值,让它从0 开始.
  2. 尾巴 +1
  3. 最终结果再加上第一步减去的值.

需求 : 程序生成一个随机整数(1~100),你来猜是多少.

 public static void main(String[] args) {
        Random r = new Random();
        int num = r.nextInt(100) + 1;//获得的随机数
        int count = 0;//猜的次数
        Scanner sc = new Scanner(System.in);
        int youGuessNumber = 1; //你猜的数
        System.out.println(num);    //显示答案
        if (youGuessNumber <= 100 && youGuessNumber > 0) { //控制输入的范围
            while (true) {
                count++;    //次数累加
                System.out.println("InputYourGuessNumber:(1~100)");
                youGuessNumber = sc.nextInt();  //输入你猜的数字
                if (count == 5) {   //保底机制,5次就算赢了.
                    System.out.println("YouWin...");
                    break;
                }
                if (youGuessNumber < num) {  //小了
                    System.out.println("You number is small.");
                } else if (youGuessNumber > num) {   //大了
                    System.out.println("Your number is big.");
                } else {
                    System.out.println("YouWin!");
                    break;
                }
            }
        } else System.out.println("Error!InputAgain:");//超过范围重新输入
    }