day06_循环

发布时间:2024年01月22日

今日内容

零、 复习昨日
一、循环
二、流程控制关键词

零、 复习昨日

  • 环境(jdk,idea,typora等等,HelloWorld程序)
  • 基本语句(变量,数据类型,类型转换)
  • 运算(赋值,算术,关系,逻辑,三目)
  • 流程控制(if,if-else,elseif,switch,while)

一、变量作用域

作用域: 变量的使用范围!

变量所在的作用域到底是什么范围? 离它最近的{}内

变量声明的要求: 在同一作用域内不能重复定义(声明)

练习

模拟超市付款: 假设已经买好东西	
提示用户可以有4种付款方式
   不同的付款方式有不同的折扣: 先展示四种付款方式 
   	现金 没有折扣
  	微信 0.95折
   	支付宝 鼓励金付款金额的10%   鼓励金可以直接折算到付款金额中
   	刷卡 满100减20(就减一次)  
package com.qf;

import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc 变量的作用域(范围)问题
 * 变量所在的作用域到底是什么**范围**? **离它最近的{}内**
 */
public class Demo1 {

    public static void main(String[] args) {
        int a = 1;

        if (a > 0){
            int b = 1;
            System.out.println("这是if里面的b = " + b );
        }
        int b = 2;
        System.out.println("这是if后面的b = " + b );
        System.out.println("--------------------------" );
        System.out.println("--- 超市结算系统 ---" );
        double money = 1000;
        System.out.println("提示: 已购物商品总金额: " +money + "元" );
        System.out.println("现有以下4种付款方式可选:" );
        System.out.println("1. 现金 没有折扣" );
        System.out.println("2. 微信 0.95折" );
        System.out.println("3. 支付宝 鼓励金付款金额的10%   鼓励金可以直接折算到付款金额中" );
        System.out.println("4. 刷卡 满100减20(就减一次)" );
        System.out.print("请选择付款方式: " );
        Scanner scanner = new Scanner(System.in);
        int type = scanner.nextInt( );
        if (type == 1) {
            System.out.println("选择现金支付,没有折扣");
        } else if (type == 2) {
            System.out.println("选择微信支付,95折" );
            money *= 0.95;
        } else if (type == 3) {
            System.out.println("选择支付宝支付,9折");
            money *= 0.9;
        } else if (type == 4){
            System.out.println("选择刷卡支付,满100减20" );
            if (money >= 100){
               money -= 20;
            }
        } else {
            System.out.println("输入选项有误!" );
        }
        System.out.println("最终消费:" + money );
    }

}

二 、循环

循环: 让某段代码重复执行,达到某个条件可以退出不再循环。

循环语句:

  • while ("当"型循环)
  • do-while ("直到"型循环)
  • for

循环四要素:

  • 初始值
  • 控制条件
  • 循环体
  • 迭代

2.1 do-while(了解)

语法

do {
   执行语句;
}while(条件);

		// 利用do-while 输出1-10
        int i = 1; // 初始值
        do {
            System.out.println(i ); // 循环体
            i++;         // 迭代
        }while(i < 11);  // 条件

执行顺序

  • 代码从上至下依次执行,遇到do,直接执行{}内内容
  • 然后再判断 while 条件,如果条件为true,继续回头再执行do内内容
  • 直到 while后条件为false,跳过循环

do-while (先斩后奏)

do-while和while区别

  • while循环先判断后执行
  • do-while先执行后判断
  • 即使条件不成立,do-while也至少会执行一次
package com.qf;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc
 */
public class Demo3 {
    public static void main(String[] args) {
        // 利用do-while 输出1-10
        int i = 1; // 初始值
        do {
            System.out.println(i ); // 循环体
            i++;         // 迭代
        }while(i < 0);  // 条件

        System.out.println("------------" );

        int x = 1;
        while (x < 0) {
            System.out.println(x );
            x++;
        }
        System.out.println("------------" );
        // 利用do-while循环,输出1-100的奇数和
        int a = 1;
        int sum = 0; // 总和
        int oddSum = 0;// 奇数和
        int evenSum = 0;// 偶数和
        do {
            sum += a;
            if (a  % 2 == 0) {
                evenSum += a;
            } else {
                oddSum += a;
            }
            a++;
        }while(a < 101);
        
        System.out.println("1-100的和sum = "+sum );
        System.out.println("1-100的奇数和oddSum = "+oddSum );
        System.out.println("1-100的偶数evenSum = "+evenSum );
    }
}

2.2 for循环[重点]

for循环

for(初始值;条件;迭代){
    执行语句;
}

执行顺序 (小红旗)

image-20240122104847263

  • 从for开始,只执行一次初始值
  • 再执行判断,如果为true,向下执行循环体
  • 后头执行迭代,后再判断,如果为true,继续向下执行,…
  • 直到迭代完,判断结果为false,跳出循环
  • 执行顺序按图示 1 —> 2 ----> 3 ---->4 —>2---->3---->4 … 直到2处判断为false时跳出循环

演示

package com.qf;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc for循环
 */
public class Demo4 {
    public static void main(String[] args) {
        // 使用for循环,输出10-20
        for (int i = 10 ; i < 21; i++) {
            System.out.println(i );
        }

        // 输出公元0-3000年中所有闰年
        // 闰年: (年份能被4整除,且不能被100整除),或者能被400整除的年份
        // 要求:横向打印,每5个年份,换一行输出
        // 思路:1) 输出0-3000,2)找闰年 3) 横向打印 4) 每5个换行
        int count = 0; // 计数
        for (int i = 0;i <= 3000;i++) {
            if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
                count++;
                System.out.print(i + "\t");
                if (count % 5 == 0) {
                    System.out.println( );
                }
            }
        }

        System.out.println( );
        // 求出所有水仙花数
        // 水仙花数:是一个三位数,每个位拆出来的立方相加等于本身
        // 153 = 1^3 + 5^3 + 3^3
        for (int i = 100;i < 1000;i++) {
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100;
            if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
                System.out.println(i );
            }
        }
    }
}

for循环的初始值写法

package com.qf;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc for循环的特殊写法
 */
public class Demo5 {

    public static void main(String[] args) {
        // 特殊1:将声明抽取到外面
        int i;
        for(i = 1;i < 11;i++){
            System.out.println(i );
        }

        // 特殊2: 声明赋值都放外面
        int j = 1;
        for (;j < 11;j++){
            System.out.println(j );
        }

        // 特殊3: for循环的死循环,中间位置不写
        for (int k = 1;;k++){
            System.out.println("死循环"+k );
        }
        // 死循环代码下方不能写代码,因为编译认为下方代码无法执行

        // 死循环
        // 第一个位置不写,没有初始值,第三个位置不写,没有迭代
        // for(;;){
        //
        // }
    }
}

2.3 双层for循环(嵌套)

双层循环的执行顺序

  • 当外层循环执行一次,内存循环要循环完
  • image-20240122113649217
  • 以上图为例,当i=1时,内层循环的j要循环13次
  • 当i=2时,内层循环j从1开始再来13次…
package com.qf;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc 双层for循环
 */
public class Demo6 {
    public static void main(String[] args) {

        // 打印图形,以*为例,每次只能输出一个*

        // 打印一个正方形
        // 外层循环控制行数
        for (int i = 1; i < 7; i++) {
            // 内层循环控制列数
            for (int j = 1; j < 15; j++) {
                System.out.print("*" );
            }
            System.out.println( );
        }

        /**
         * 打印三角形
         * *
         * **
         * ***
         * ****
         * *****
         * ******
         */
        for (int i = 1; i < 7; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*" );
            }
            System.out.println( );
        }

        /**
         * ******
         * *****
         * ****
         * ***
         * **
         * *
         */
        for (int i = 1; i < 7; i++) {
            for (int j = 6; j >= i; j--) {
                System.out.print("*" );
            }
            System.out.println( );
        }

        /**
         * 作业1 乘法口诀表
         * 作业2
         *    *
         *   ***
         *  *****
         * *******
         */
    }
}

2.4 while和for

  • while 循环适合做循环次数未知
  • for 循环适合做循环次数已知

三、流程控制关键词

在流程控制语句中使用的关键词

  • break (熟悉)
  • continue (了解)

3.1 break

break 单词释义: 打断,破坏,中断

作用:

  1. 放在switch中 中断选择语句
  2. 放在循环(while,do-while,for)中使用,中断循环

演示

package com.qf;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc break关键词
 */
public class Demo7 {
    // 在switch中使用,不再 演示

    public static void main(String[] args) {
        // 演示在循环中使用
        for (int i = 1; i < 11; i++) {
            System.out.println(i );
            if (i == 5){
                break; // 结束循环
            }
        }
        System.out.println("----------" );
        for (int i = 1; i < 10; i++) {
            System.out.println("i = " + i );
            for (int j = 1; j < 10; j++) {
                System.out.println("j = " + j );
                if (j == 5){
                    break;// break 中断当前这一层循环
                }
            }
        }
        System.out.println("----------" );
        // a就是锚点,break+锚点,可以跳出到指定循环外(了解)
        a:for (int i = 1; i < 10; i++) {
            System.out.println("i = " + i );
            for (int j = 1; j < 10; j++) {
                System.out.println("j = " + j );
                if (j == 5){
                    break a;
                }
            }
        }
        System.out.println("后续....." );
    }
}

练习

package com.qf;

import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc
 */
public class Demo9_break {
    public static void main(String[] args) {
        // ATM机账户,登录
        // 假设666
        // 最多允许输错5次
        // 在5次内有一次正确,就可以登录成功,程序结束
        //  如果输错,要给出提示语
        // --- 站在用户调度考虑问题,设计程序 ---
        Scanner scanner = new Scanner(System.in);
        System.out.println("--- 欢迎使用千锋ATM机 ---" );
        for (int i = 1; i <= 5; i++) {
            System.out.println("请输入密码: " );
            int pwd = scanner.nextInt( );
            if (pwd == 666) {
                System.out.println("欢迎登录!" );
                break;
            } else {
                if (i < 5){
                    System.out.println("密码错误,请重新输入,还有"+(5-i)+"次" );
                } else {
                    System.out.println("今日错误已达上限!明日再试或者联系管理员!" );
                }
            }
        }
    }
}

练习

package com.qf;

import java.util.Random;
import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc 数字猜大小游戏
 */
public class Demo10_break {

    public static void main(String[] args) {
        /**
         * 随机产生一个1-100的整数,用户输入数字猜大小
         * 每次输入后,给出提示"大了" 或者 "小了"
         * 直到猜对,程序结束
         * 最后 给出总共猜多少次!
         */
        // 这两行产生1-100随机数
        Random random = new Random( );
        int r = random.nextInt(100)+1;
        // System.out.println(r );
        Scanner scanner = new Scanner(System.in);
        int count = 0;
        while (true){
            count++;
            System.out.print("请输入数字:" );
            int num = scanner.nextInt( );
            if (num == r){
                System.out.println("恭喜你,猜到啦! 啥奖品没有~~~" );
                break;
            } else {
                if (num > r) {
                    System.out.println("猜大啦,继续努力..." );
                } else {
                    System.out.println("猜小啦,继续努力..." );
                }
            }
        }
        System.out.println("总共猜了"+count+"次");
    }
}

3.2 continue

continue 继续

  • 位置: 只能用在循环中
  • 作用: 中断本次循环,继续下次循环
package com.qf;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc
 */
public class Demo11 {
    public static void main(String[] args) {
        for (int i = 1; i < 11; i++) {
            if (i == 6){
                continue;// 中断这一次循环,继续下次循环
            }
            System.out.println(i );
        }

        // 逢7过,(逢 7 不输出)
        for (int i = 1; i < 101; i++) {
            if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7) {
                continue;
            }
            System.out.println(i );
        }
    }
}

3.3 return

特别说明: 流程控制语句的关键词是只有 break和continue,在这里讲return,有个功能和前2个比较像: 都可以改变程序的执行.

位置: 在方法内都可以写(if,switch,循环等内都可以)

作用: return,单词释义:返回,
无论在if,switch,循环中遇到return,该方法后面代码不再执行.如果方法是main主方法,那么程序结束.

package com.qf;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc return
 */
public class Demo12_return {

    // main主方法是唯一入口
    public static void main(String[] args) {

        // if (1 > 0) {
        //     return;// 遇到return,方法返回,后续代码不执行
        // }

        // for (int i = 1; i < 11; i++) {
        //     System.out.println(i );
        //     if (i == 5) {
        //         return; // 循环结束,且当前方法也结束,后续不执行
        //     }
        // }

        for (int i = 1; i < 11; i++) {
            System.out.println("i = " + i );
            for (int j = 1; j < 11; j++) {
                System.out.println("j = " + j );
                if (j == 5){
                    return; // 双层循环也会停下,后面代码不再执行
                }
            }
        }
        System.out.println("后续");// 前面有return,这个语句不再执行!
    }
}

四、练习

package com.qf;

import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/22
 * @desc
 */
public class Demo13_banzhuan {

    public static void main(String[] args) {
        // 36 块砖,36 人搬,
        // 男搬4,女搬3,两个小孩抬1 砖,
        // 要求一次全搬完,问男、女和小孩各若干?
        int m = 0;// man 男生个数
        int w = 0;// women 女生个数
        int c = 0;// child 小孩个数
        for (m = 1; m <= 36; m++) {
            for (w = 1; w <= 36; w++) {
                for (c = 1; c <= 36; c++) {
                    // 小孩一定是2的倍数
                    // 人数相加是36个人
                    // 砖数相加是36块砖
                    if (c % 2 == 0 && m + w + c == 36 && 4 * m + 3 * w + c / 2 == 36) {
                        System.out.println("男生:" + m);
                        System.out.println("女生:" + w);
                        System.out.println("小孩:" + c);
                    }
                }
            }
        }

        // 键盘输入一个数,输出该数是几位数?
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入数字: " );
        int num = scanner.nextInt( );
        /**
         * 54321
         * 54321 / 10 = 5432 (1次)
         * 5432  / 10 = 543 (2次)
         * 543  / 10 = 54 (3次)
         * 54  / 10 = 5 (4次)
         * 5  / 10 = 0 (5次)
         */
        int count = 0;
        while (num != 0){
            num /= 10;
            count++;
        }
        System.out.println(count+"位数" );
    }
}

附录:单词

count 计数

loop 循环

outside 在。。。之外

statement 语句/声明

unreachable 执行不到的

文章来源:https://blog.csdn.net/weixin_39641494/article/details/135755429
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。