Java程序设计基础笔记 • 【第6章 循环结构进阶】
阅读原文时间:2023年07月09日阅读:1

全部章节   >>>>


本章目录

6.1 for循环

6.1.1 for循环的简介

6.1.2 for循环的使用

6.1.3 for循环的表达式

6.1.4 实践练习

6.2 深入理解for循环(一)

6.2.1 for循环案例(一)

6.2.2 求水仙花数

6.2.3 实践练习

6.3 深入理解for循环(二)

6.2.1 三种循环的区别

6.3.2 各种循环的使用场景

6.3.3 实践练习

6.4 跳转语句

6.4.1 break语句

6.4.2 continue语句

6.4.3 实践练习

总结:


6.1 for循环

回顾问题:输出100次“我爱你!”

for比while的代码更简洁,for语句封装了循环的4要素。

示例:使用for循环实现求1~100的和

int sum =0;
for (int i = 1; i<= 100; i++) {
    sum += i; //累加求和
}
System.out.println("1~100的和为"+sum);

示例:输入一个学生姓名和5门课程成绩,求其总成绩

//通过循环依次接收每门课程成绩
for (int i = 1; i <= 5; i++){
    System.out.printf("请输入第%d门课程成绩:\n", i);
    score = sc.nextInt();
    sum += score;//累加
}
System.out.printf("%s同学本次考试总成绩:%d", name, sum);

循环次数与循环控制变量的关系:

循环控制变量的初值

循环条件

循环控制变量改变

循环次数

int i = 0

i < 5

i++

5

int i = 0

i <= 4

i++

5

int i = 5

i > 0

i--

5

int i = 4

i >= 0

i--

5

示例:输入一个数字求其加法表

Scanner input = new Scanner(System.in);
System.out.println(" 请输入一个数字 :");
int num = input.nextInt();
System.out.println(" 数字 "+num+" 的加法表如下 :");
for (int i = 0,j = num; i<=num; i++,j--) {
    System.out.printf("%d + %d = %d\n",i,j,num);
}

for循环常见问题:

(1)省略表达式1,如for;表达式2;表达式3)。表达式1用于对循环控制变量进行初始化,省略for循不的表达式1,不会出现语法错误,我们可以将循环控制变量初始化放置到for循环之前。例如:

int i=1;
for(; i<=5; i++) {
    System.out. printin( "Hello Java!" );
}

(2)省略表达式2,如for(表达式1;表达式3)。表达式2用于判断循环条件是否成立,省略表达式2后,即没有循环判断,循环条件永远为真。此时,循环将出现死循环。例如:

for(int i&nbsp;=&nbsp;1;&nbsp;;&nbsp;i++){
    System.out.printIn(&nbsp;"Hello&nbsp;Java!"&nbsp;);&nbsp;
}

(3)省略表达式3,如for( 表达式1;表达式2;)。表达式3用于修改循环控制变量的值,省略表达式3后,循环控制变量的值不会变化,这样会导致循环永远为真,出现死循环。为了避免出现死循环,可以将表达式3放置于循环操作中,以达到未省略表达式3的效果。例如:

for(int i&nbsp;=0; i < 5;){
    System.out.printin(&nbsp;"Hello&nbsp;Java!"&nbsp;);
    i++;
}

(4)省略所有的表达式,如for(; ;)o省略for循环的三个表达式后,该循环则为死循环,想要结束死循环可以通过跳转语句实现。省略for循环的表达式后,不会导致程序的语法错误,但是程序的结构不够清晰,不便于阅读与维护。建议使用for循环时尽量不省略任何一一个表达式。

6.2 深入理解for循环(一)

(1)表达式:声明变量num用于储蓄用户输入的数字,找查能够整除num的数字,需从1开始直到num-1为止,因此,声明变量i作为循环控制变量,for循环结构中的3个表达式如下:

表达式1:int i = ;
表达式2:i < num
表达式3:i++

(2)循环操作:重复执行的操作是逐一判断1、2、3、…. num-1,能否被num整除,若能够被整除,则将对应数字进行累加。因此,声明变量sum,用于存储累加值,设置初始值为0,由于需要从1开始进行判断,而1的初始值也为1,此时,只需将i反复与num进行整除判断即可,将能整除num的i累加至sum中。

示例:在控制台中输入一个自然数,判断该数字是否为完全数。完全数,又称完美数,是指能整除该数字的所有数字(除本身外)之和等于本身的数字。

// 使用循环,在 1 ~ num-1中查找能整除 num的数字
for (int i = 1; i < num; i++) {
// 若能够整除 num,则进行累加
if (num % i == 0)
    sum += i;
}
if (sum == num) // 若累加之和与 num相等,则为完全数
    System.out.printf("%d 是完全数 \n", num);
else
System.out.printf("%d 不是完全数 \n", num);

示例:在控制台中输出100~999之间所有的“水仙花数”。水仙花数是指各位数字的3 次幂之和等于本身的数字。例如:数字153。

 for (int i = 100; i < 1000; i++) {
     // 分离个位数字
       int s = i%10;
       int t = i/10%10;
       int h = i / 100;
       // 判断是否为水仙花数
       if (i == s * s * s + t * t * t + h * h * h)
               System.out.println(i);
}

6.3 深入理解for循环(二)

(1)区别1:语法

(2)区别2:执行顺序

while 循环:先判断,再执行

do-while循环:先执行,再判断

for循环:先判断,再执行

(3)区别3:适用情况

循环次数确定的情况,通常选用for循环

循环次数不确定的情况,通常选用while或do-while循环

思考:年存款利率为3%, 本金为10000元,当存款总额超过 12000 元时,收益具体是多少 ?

分析:

需求:该业务可以转换为“当”存款总额小于12000元时,以3%利率增长。

条件:存款 < 12000。

结论:不明确循环次数,也无序先执行循环体,则用while循环

示例:年存款利率为3%, 本金为10000元,当存款总额超过 12000 元时,收益具体是多少 ?

        double total = 10000;// 起始余额
        double income;// 收益
while (total <= 12000) {
    total = total + (total * 0.03); // 增加收益后的余额
}
income = total - 10000; // 收益赋值
System.out.printf(" 收益为 %.2f ", income);

思考:西游记中,孙悟空让猪八戒挑水,直到孙悟空满意为止。

分析:

需求:孙悟空让猪八戒挑水,猪八戒在每次挑完水后询问孙悟空还需要挑水与否,直到孙悟空说不用挑水为止。

条件:孙悟空说需要挑水。

结论:不明确循环次数且需要在执行一次后再次询问,所以使用do-while

示例:西游记中,孙悟空让猪八戒挑水,直到孙悟空满意为止。

do{
count++;
System.out.printf(" 猪八戒挑了第 %d 桶水后。\n",count);
System.out.println(" 猴哥,还要继续挑水吗? [y/n]");
answer = sc.next().charAt(0);
}while(answer == 'y' || answer == 'Y');
System.out.printf(" 猪八戒一共挑了 %d桶水后,停止了挑水工作。",count);

经验:

如果业务中可以获取到一个确切的循环次数,可以考虑用for循环,简而言之就是如果明确知道要重复几次做同样的事情,则使用 for 循环。

for语句场景:如果存在一个确切循环次数时,优先选择for循环实现。

在选择循环结构时,不是只有某种循环才能解决问题,而是优先选择对应的循环会使得代码更简单,业务处理更方便。

6.4 跳转语句

  • Java语言支持3种形式的跳转语句:break语句、continue语句和return语句。
  • 循环结构中,常用的是:break语句和continue语句。

break:改变程序控制流程

用于do-while、while、for中时,可跳出循环而执行循环后面的语句

示例:输入一个区间,找出区间中第一个能够被3整除的数字。

Scanner sc = new Scanner(System.in);
int start, end;//区间
System.out.println("请输入一个区间:");
start = sc.nextInt();
end = sc.nextInt();
System.out.println("区间中能够被3整除的第一个数字:");
for (int i = start; i <= end; i++) {
    if (i % 3 == 0) {
        System.out.println(i);
        break;//跳出循环结构
    }
}
System.out.println("查找结束");

continue:只能用于循环中

continue作用:跳过循环体中剩余的语句而执行下一次循环

示例:编写Java程序,累加1~99数字之和,要求跳过各位中含有3的数字。

int sum = 0;
for (int i = 1; i < 100; i++) {
    int s = i % 10;//分割个位
    int t = i / 10;//分割十位
       if (s == 3 || t == 3)
        continue;//进入下次循环
        sum += i;//累加满足条件的数据
}
System.out.println("1~99之间各位中不包含3的数字之和:" + sum);

总结:

  • for循环中的表达式2称为条件表达式,用于判断for循环的条件是否成立,通常为关系表达式或逻辑表达式。
  • for循环中的表达式3称为修改表达式,用于修改循环控制变量的值,通常对循环变量进行自增或自减操作。
  • break语句可以在循环结构中使用,用于跳出循环,即提前结束循环。
  • continue语句只能在循环结构中使用,用于终止本次循环,并且跳转至下一次循环。