Java初接触 | 流程控制结构【循环结构】、Random的使用

134 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12月更文挑战」的第10天

循环结构

for循环——控制一段代码反复执行很多次

格式:
for(初始化语句;循环条件;迭代语句) {
    循环体语句(重复执行的代码);
}

示例

//输出三次HelloWorld
for(int i = 0;i < 3;i++) {
    System.out.println("Hello World");
}

案例 求和

需求:求1-5之间的数据和,并把求和结果在控制台输出。
分析:<br/>
1.定义for循环使其能够依次访问到:1、2、3、4、5。
for (int i = 1; i <= 5; i++){
}
2.在循环外定义一个整数变量sum用来累加这些数据。
int sum = 0;
for (int i = 1;i<= 5; i++){
    sum += i;
}
3.循环结束后,输出求和变量即是结果。

//需求:计算1-5的和
// 2、定义一个整数变量用于累加数据求和
int sum = 0;
// 1、定义一个for循环找到 1 2 3 4 5
for (int i=1;i<=5 ;i++) {
//i=1234 5
//3、把循环的数据累加给sum变量
    /**
        等价于: sum=sum + i
        i == 1 sum = 0 + 1
        i == 2 sum = 1 + 2 
        i == 3 sum = 3 + 3
        i == 4 sum = 6 + 4
        i == 5 sum = 10 + 5
    */
    sum += i;
}
System.out.println("1-5的和是:"+sum);

案例 求奇数和

需求:求1-10之间的奇数和,并把求和结果在控制台输出。
方式一:
1.定义for循环使其能够依次访问到:1、2、3、4、5...10。
2.在for循环中,通过if筛选出奇数
for (int i = 1; i <= 10; i++) {
    if(i % 2 == 1) {
        //i = 1 3 5 7...
    }
}
3.在循环外定义一个整数变量sum用来累加这些数据。

//需求:求1-10的奇数和
//3、定义一个求和的变量 累加奇数和
int sum = 0;
//1、定义一个循环找到1 2 3...10
for(int i = 1; i <= 10; i++) {
    // i 1 2 3 4 5 6 7 8 9 10

    //2、筛选出奇数
    if(i % 2 == 1){
        //i = 1 3 5 7 9
        sum += i;
    }
}
//4、输出求和变量即可
System.out.println("1-10的奇数和是:" + sum);


方法二:
1、定义for循环使其能够依次访问到:1、3、5、7、9。
for(int o = 1;i <= 10;i+=2) {
}
2、在循环外定义一个整数变量sum用来累加这些数据。

//2、定义一个求和的变量累加奇数和
int sum1 = 0;
//1、定义循环找到 1 3 5 7 9
for (int i = 1; i <= 10; i+=2) {
    //i = 1 3 5 7 9
    sum1 += i;
}
//3、输出求和变量即可
System.out.println("1-10的奇数和是:" + sum1);

案例 水仙花数

需求:在控制台输出所有的“水仙花数”,水仙花数必须满足如下2个要求:
1.水仙花数是一个三位数
2. 水仙花数的个位、十位、百位的数字立方和等于原数
分析:
1.定义一个for循环从“100一直到999”
2.每次访问到数据后,提取该数据的:个位、十位、百位数字。
3.使用if判断:个位、十位、百位的数字立方和是否等于原数,等于则输出该数据。

// 需求:找出水仙花数并输出
// 1、定义一个for循环找出全部三位数
for (int i= 100;i <= 999;i++) {
    //2、判断这个三位数是否满足要求
    //i = 157
    //个位
    int ge = 1 % 10;
    //十位
    int shi = i / 10 % 10;
    // 百位
    int bai = i / 100;
    if((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i){
        System.out.print(i+"\t");
    }
}

如果还要知道水仙花数的个数怎么办?
    在循环外定义一个变量count用于记录水仙花数。
    每输出水仙花数时,让count++。
    
//需求:找出水仙花数并输出
//在循环外定义一个变量用于记录水仙花的个数
int count = 0;
//1、定义一个for循环找出全部三位数
for(int i =100; i<= 999;i++) {
    //2、判断这个三位数是否满足要求
    // i= 157
    //个位
    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.print(i+"\t");
        count++;
    }
}
System.out.println();//换行!
System.out.println("水仙花个数是:" + count);

while循环

初始化语句;
while(循环条件) {
    循环体语句(重复执行的代码);
    迭代语句;
}

示例

int i = 0;
while(i < 3) {
    System.out.println("Hello World");
    i++;
}

for循环和while循环的使用规范: 知道循环几次用for;不知道循环几次用while

案例 珠穆朗玛峰(世界最高峰8848.86米)

需求:
世界最高山峰是珠穆朗玛峰(8848.86米=8848860毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,折叠多少次,可以折成珠穆朗玛峰的高度。
思路:
这种不清楚要循环多少次的情况可以选择用while实现。

分析步骤
1.定义变量存储珠穆朗玛峰的高度、纸张的高度。
double peakHeight = 8848860;  // 山峰高度
double paperThickness = 0.1;  // 纸张厚度

2.使用while循环,循环条件是(纸张厚度<山峰高度),内部控制纸张折叠,每折叠一次,纸张厚度为原来两倍,循环外定义计数变量,每折叠依次让该变量+1
int count = 0;
while (paperThickness < peakHeight){
    paperThickness *= 2;
    count++;
}


// 需求:珠穆朗峰高度是8848860 纸张厚度 0.1 折叠纸张直到不低于珠穆朗峰位置,求折叠几次
// 1、定义变量记录山峰的高度 纸张的厚度
double peakHeight = 8848860;
double paperThickness = 0.1;

// 3、定义一个变量用于记录纸张折叠的次数
int count = 0;

// 2、定义一个while循环控制纸张进行折叠
while (paperThickness < peakHeight){
    // 让纸张的厚度多一倍
    paperThickness *= 2;
    count++;
}
System.out.println("折叠的次数:" + count);
System.out.println("纸张的最终厚度:" + paperThickness);

do-while循环——先执行再判断循环条件

初始化语句;
do {
    循环体语句;
    迭代语句;
} while (循环条件);

do-while循环的特点:一定会先执行一次循环体。

示例

// 目标:学会使用dowhile循环,并理解其执行流程
int i = 0;
do {
    System.out.println("Hello World");
    i++;
}while (i < 3);

三种循环的区别

  • for循环 和 while循环(先判断后执行)
  • do...while (第一次先执行后判断)

for 和 while 的区别:

  • for循环和while循环的执行流程是一模一样的。
  • 如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。
  • for循环中,控制循环的变量只在循环中可以使用。While循环中,控制循环的变量在循环后还可以继续使用。

死循环——一直循环的执行下去,如果没有干预不会停止下来

写法

for(;;) {
    System.out.println("Hello World");
}
// 经典做法
while(true) {
    System.out.println("Hello World");
}

do {
    System.out.println("Hello World");
} while (true);
        // 目标:学会定义死循环。
        for ( ; ; ) {
            System.out.println("Hello World~~~~");
        }
-------------------------------------------------------------------------
        // 经典写法
        while (true) {
            System.out.println("我是快乐的死循环~~~~");
        }
-------------------------------------------------------------------------
        do{
            System.out.println("我是快乐的死循环~~~~");
        }while (true);

案例 密码验证

需求:系统密码是520,请用户不断的输入密码验证,验证不对输出
密码错误,验证成功输出欢迎进入系统,并停止程序。
分析:
1.使用while死循环,让用户不断输入数据
2.与密码比对:验证不成功输出密码错误、
3.验证成功输出欢迎进入系统,并使用break结束当前循环的执行。

// 1、定义正确的密码
int okPassword = 520;
// 2、定义一个死循环让用户不断的输入密码认证
Scanner sc = new Scanner(System.in);
while (true) {
    System.out.println("请您输入正确的密码:");
    int password = sc.nextInt();
    // 3、使用if判断密码是否正确
    if(password == okPassword){
        System.out.println("登录成功了~~~");
        break; // 可以理解结束当前所在循环的执行的
    }else {
        System.out.println("密码错误!");
    }
}

循环嵌套

image.png

特点:外部循环每循环一次,内部循环全部执行完一次。

// 目标:理解嵌套循环的执行流程
// 场景:假如你有老婆,然后你犯错了,你老婆罚你说5天,每天3句我爱你。
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 3; j++) {
        System.out.println("我爱你");
    }
    System.out.println("--------------");
}

案例

/**
    *****
    *****
    *****
    *****
 */
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 5; j++) {
        System.out.print("*");
    }
    System.out.println(); // 换行
}

跳转关键字

跳转控制语句介绍

  • break : 跳出并结束当前所在循环的执行。
    image.png

  • continue: 用于跳出当前循环的当次执行,进入下一次循环。

    image.png
// 目标:理解break 和 continue的作用。
// 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,每天都是洗碗。
// 但是洗碗到第三天后心软了 原谅你了不用洗了
for (int i = 0; i < 5; i++) {
    System.out.println("快乐的洗碗~~~~");
    if(i == 2) {
        break; // 跳出并结束当前循环的执行~~
    }
}

// continue 跳出当前循环的当次执行,进入循环的下一次
// 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,
// 每天都是洗碗。但是洗碗到第三天后心软了 原谅你了不用洗了 但是依然不解恨 继续洗第4天 5天
for (int i = 1; i <= 5 ; i++) {
    if(i == 3){
        continue; // 立即跳出当次执行,进入循环的下一次!
    }
    System.out.println("洗碗:" + i);
}

注意:
break : 只能用于结束所在循环, 或者结束所在switch分支的执行。
continue : 只能在循环中进行使用。

案例技术:随机数Random类

Random的使用

Random随机数技术——用于在程序中获取随机数的技术。

image.png

// 目标:学会使用Java提供的随机数类Random
// 1、导包
// 2、创建随机数对象
Random r = new Random();

// 3、调用nextInt功能(方法)可以返回一个整型的随机数给你
for (int i = 0; i < 20; i++) {
    int data = r.nextInt(10); // 0 - 9 不包含10的(包前不包后)
    System.out.println(data);
}

Random生成随机数的特点

  • nextInt(n)功能只能生成:0 – (n-1)之间的随机数。

Random生成区间随机数的技巧:减加法

例如:要生成 1 – 10之间的随机数,程序怎么实现?
image.png

// 1 - 10 ==> -1 ==> (0 - 9) + 1
int data = r.nextInt(10) + 1;
System.out.println(data);

// 3 - 17 ==> -3 ==> (0 - 14) + 3
int data1 = r.nextInt(15) + 3;
System.out.println(data1);

总结: 1.Random随机数类生成需要几步,具体是什么样的?

  • 导包:import java.util.Random;
  • Random r = new Random();
  • int number = r.nextInt(10);

2.Random随机数如何生成 65 – 91之间的随机数?

  • 65 – 91 => (0 - 26)+ 65
  • int number = r.nextInt(27) + 65;

案例:猜数字游戏

需求:
- 随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏。
分析:
1.随机生成一个1-100之间的数据
2.使用死循环让用户不断提示用户猜测,猜大提示过大,猜小提示过小,猜中结束游戏。


// 1、随机一个幸运号码 1- 100之间  (0 - 99) + 1
Random r = new Random();
int luckNumber = r.nextInt(100) + 1;

// 2、使用一个死循环让用户不断的去猜测,并给出提示
Scanner sc = new Scanner(System.in);
while (true) {
    // 让用户输入数据猜测
    System.out.println("请您输入猜测的数据(1-100):");
    int guessNumber = sc.nextInt();

    // 3、判断这个猜测的号码与幸运号码的大小情况
    if(guessNumber > luckNumber){
        System.out.println("您猜测的数据过大~");
    }else if(guessNumber < luckNumber){
        System.out.println("您猜测的数据过小");
    }else {
        System.out.println("恭喜您,猜中了,可以去买单了~~~");
        break; // 直接跳出并结束当前死循环!!
    }
}