一、for循环
- 控制一段代码反复执行很多次
- 举个例子:
- 比如:你去淘宝搜索手机,是不是会显示上千上万部手机?那么不可能说一条一条去写这样的代码吧?肯定不会这么干,所以,就有了循环结构这个东西,将一段代码反复执行很多次。
格式:
for (初始化语句; 循环条件; 迭代语句) {
循环体语句(重复执行的代码);
}
示例:
// 输出3次HelloWorld
for (int i = 0; i < 3; i++) {
System.out.println("Hello World");
}
package com.app.loop;
public class ForDemo1 {
public static void main(String[] args) {
// 目标:学会使用for循环,并理解其流程
/*
需求:在控制台输出3次HelloWorld
分析需求:
思路1:如果要在控制台输出3次HelloWorld,按照正常来写的话,要写三个输出语句就可以实现这个需求
思路2:使用for循环结构来实现:格式——> for (初始化语句; 循环条件; 迭代语句) { 循环体语句(重复执行的代码) }
(1)初始化语句是啥?——> 如:int a = 0; int b = 1;等等,像这些定义变量并赋初始值的就称为初始化语句
(2)循环条件是啥?——> 如 int a = 0; 想要让变量a循环3次 就是:a < 3; 因为计算机数数喜欢从 0 开始数:0, 1, 2(三次)
(3)迭代语句是啥?——> 如 a++; 每循环一次就给变量a+1,
如:int a = 0; a < 3; a++ ——>因为循环条件是 a<3;所以a要循环3次;
a 循环第一次,就是 a=0 < 3,然后会将第一次赋给a;(0<3,判断为true,将继续循环)
a 循环第二次,就是 a+1=0+1=1,然后会将第二次赋给a,此时a从a=0变为a=1;(1<3,判断为true,将继续循环)
a 循环第三次,就是 a+1=1+1=2,然后会将第三次赋给a,此时a从a=1变为a=2;(2<3,判断为true,将继续循环)
a 循环第四次,就是 a+1=2+1=3,此时a从a=2变为a=3;(3不小于3,判断为false,结束循环)
(4)循环体语句是啥?——> 如:System.out.println("HelloWorld");,就是你想要执行多次的代码就称为循环体语句;
假如你把这句语句放到for循环里,会根据你给的循环条件,重复执行
如:for(int a = 0; a<3; a++) { System.out.println("HelloWorld"); }
a 循环第一次,会将第一次循环赋给a,因为a=0,此时a<3,判断为true,继续循环;
a 循环第二次,会将第二次循环赋给a,因为a++,所以a=1,此时a<3,判断为true,继续循环;
a 循环第三次,会将第三次循环赋给a,因为a++,所以a=2,此时a<3,判断为true,继续循环;
a 循环第四次,会将第四次循环赋给a,因为a++,所以a=3,此时a=3,不符合a<3,判断为false,结束循环
最终将System.out.println("HelloWorld");这句代码的三次执行赋给a
最终输出结果为: HelloWorld
HelloWorld
HelloWorld
*/
// 思路1
String s = "HelloWorld";
System.out.println("-------------------思路1的输出结果-------------------");
// 输出3次HelloWorld
System.out.println(s);
System.out.println(s);
System.out.println(s);
// 思路2
System.out.println("-------------------思路2的输出结果-------------------");
for (int a = 0; a < 3; a++) {
System.out.println("HelloWorld");
}
/*
思路3: int i = 1; i<=5; i+=2;
解析:
i 第一次循环,因为i=1,所以符合i<=5,为true,继续循环
i 第二次循环,因为i=1,此时i+=2等价于i=i+2; 结果为3,所以i=3,符合i<=5,为true,继续循环
i 第三次循环,因为i=3,此时i+=2等价于i=i+2; 结果为5,所以i=5,符合i<=5,为true,继续循环
i 第四次循环,因为i=5,此时i+=2等价于i=i+2; 结果为7,所以i=7,不符合i<=5,为false,结束循环
*/
System.out.println("-------------------思路3的输出结果-------------------");
for (int i = 1; i<=5; i+=2) {
System.out.println("HelloWorld");
}
}
}
输出结果:
-------------------思路1的输出结果-------------------
HelloWorld
HelloWorld
HelloWorld
-------------------思路2的输出结果-------------------
HelloWorld
HelloWorld
HelloWorld
-------------------思路3的输出结果-------------------
HelloWorld
HelloWorld
HelloWorld
- 我们可以看到思路1和思路2都可以实现需求
- 但是按照开发角度来看,咱们还是用思路2的for循环来解决这需求会更简便、更专业
- 因为目前是需求你输出3次,要是需求你输出1万次呢?所以还是要用循环结构来解决这样的需求比较好!!
for循环总结
1、for循环格式和执行流程是什么样的?
-
格式: for (初始化语句; 循环条件; 迭代语句) { 循环体语句(重复执行的代码); }
-
执行流程: 比如: for (int i = 1; i<=5; i+=2) { System.out.println("你好世界!"); } 流程解析: i 第一次循环,因为i=1,所以符合i<=5,为true,继续循环 i 第二次循环,因为i=1,此时i+=2等价于i=i+2; 结果为3,所以i=3,符合i<=5,为true,继续循环 i 第三次循环,因为i=3,此时i+=2等价于i=i+2; 结果为5,所以i=5,符合i<=5,为true,继续循环 i 第四次循环,因为i=5,此时i+=2等价于i=i+2; 结果为7,所以i=7,不符合i<=5,为false,结束循环 最终输出结果: 你好世界! 你好世界! 你好世界!
二、for循环案例1:求和
-
需求: 求1-5之间的数据和,并把求和结果在控制台输出。
package com.app.loop; public class ForTest2 { public static void main(String[] args) { // 目标:通过案例更深入理解和熟练for循环 /* 需求:求1-5之间的数据和,并把求和结果在控制台输出 分析: (1) 提供思路:1到5之间的数据:1、2、3、4、5,和为:15 (2) 定义变量sum,初始值为0,用于存放求和结果 (3) 使用for循环,循环取出 1<=5 的数据,赋值给一个变量,然后求和 (4) 将求和结果在控制台输出 */ // 1.定义变量sum,初始值为0,用于存放求和结果 int sum = 0; // 2.使用for循环,定义变量,初始值为1,循环取出 1<=5 的数据,然后求和 for (int i = 1; i <= 5; i++) { // 将1~5之间的数累加起来————求和 sum += i; // 等价于 sum = sum + i; } System.out.println("1~5之间的数之和为:" + sum); } }
输出结果: 1~5之间的数之和为:10
// 此次求和案例详细解析: // 1.定义变量sum,初始值为0,用于存放求和结果 int sum = 0; for (int i = 1; i<=5; i++) { // 将1~5之间的数累加起来————求和 sum += i; // 等价于 sum = sum + i } // 首先进入for循环: // i 的第一次循环,i=1,符合i<5,sum += i 等价于 sum = sum + i 等价于 sum = 0 + 1,所以将 1 重新赋值给变量sum,继续循环; // i 的第二次循环,i=1+1 = 2,符合i<=5,sum += i 等价于 sum = 1 + 2,所以将 3 重新赋值给变量sum,继续循环; // i 的第三次循环,i=2+1 = 3,符合i<=5,sum += i 等价于 sum = 3 + 3,所以将 6 重新赋值给变量sum,继续循环; // i 的第四次循环,i=3+1 = 4,符合i<=5,sum += i 等价于 sum = 6 + 4,所以将 10 重新赋值给变量sum,继续循环; // i 的第五次循环,i=4+1 = 5,符合i<=5,sum += i 等价于 sum = 10 + 5,所以将 15 重新赋值给变量sum,继续循环; // i 的第六次循环,i=5+1 = 6,不符合i<=5,判断为false,结束循环。 // 目前 sum 的值已经累加到了 15,所以此时 sum=15; // 所以最后在控制台输出sum的值就为15
for循环案例——求和的总结
1、如何实现元素求1~5的和?
-
定义一个盒子,int类型的变量sum,初始值为0,用于存放循环取出1~5之间的数据之和
int sum = 0;
-
使用循环控制输出1~5之间的数据
int sum = 0; for (int i = 1; i <=5; i++) { }
-
用盒子把 每次循环取出的1~5之间的数 装起来(叠加)
int sum = 0; for (int i = 1; i <= 5; i++) { sum += i; }
-
最后将盒子里已经累加好的数输出到控制台
int sum = 0; for (int i = 1; i <= 5; i++) { sum += i; } System.out.println("1~5之间的数之和为:" + sum);
三、for循环案例2:求奇数和
-
需求: 求1~10之间的奇数和,并把求和结果在控制台输出
- 方式一:
package com.app.loop; public class ForTest3 { public static void main(String[] args) { // 目标:通过案例更深入和熟练使用for循环,并理解其流程 /* 需求:求1~10之间的奇数和,并把求和结果在控制台输出 分析: (1) 提供思路:1~10之间的奇数,1、3、5、7、9,将这些奇数通过使用for循环找出来,并累加起来求和 (2) 定义个盒子:int类型的变量sum,初始值为0,用于把for循环找出来的奇数装起来,并累加 (3) 使用for循环: (3-1) 定义初始化语句:int i = 1; (3-2) 定义循环条件:i <= 10; (3-3) 定义迭代语句:i++ (3-4) 在for循环里使用if判断来筛选: (3-4-1) if判断条件:使用除二取余法来判断是不是奇数,除二余数为1的是奇数 (3-4-1-1) 是奇数,则定义循环体语句:sum += i;————>将每次循环取到的奇数累加给盒子变量sum (4) 将求和结果在控制台输出 */ System.out.println("---------------------------方式一---------------------------"); // 1.定义个盒子:int类型的变量sum,初始值为0,用于把for循环找出来的奇数装起来,并累加 int sum = 0; // 2.使用for循环: /* (2-1) 定义初始化语句:int i = 1; (2-2) 定义循环条件:i <= 10; (2-3) 定义迭代语句:i++ */ for (int i = 1; i <= 10; i++) { // (2-4) 在for循环里使用if判断: // i % 2 == 1:i 除以 2 是否 余 1 if (i % 2 == 1) { // (2-4-1) if判断条件:使用除二取余法来判断是不是奇数,除二余数为1的是奇数 // (2-4-1-1) 是奇数,则定义循环体语句:sum += i;————>将每次循环取到的奇数累加给盒子变量sum sum += i; } } // 3.将求和结果在控制台输出 System.out.println("1~10之间的奇数和为:" + sum); /* 此次奇数求和案例方式一的执行流程的详细解析: 1.定义好装奇数累加和的盒子之后 2.进入for循环: i 的第一次循环,i=1,符合i <= 10,然后进行if判断:1 % 2 是 余 1,所以i=1是奇数, 则sum+=i等价于sum = sum + i 等价于 sum = 0 + 1,因此将1重新赋值给sum,继续循环 i 的第二次循环,i=1+1 = 2,符合i <= 10,if判断:2 % 2 是 余 0,所以i=2不是奇数, 则sum的值不进行累加,继续循环 i 的第三次循环,i=2+1 = 3,符合i <= 10,if判断:3 % 2 是 余 1,所以i=3是奇数, 则sum+=i等价于sum = 1 + 3,因此将4重新赋值给sum,继续循环 i 的第四次循环,i=3+1 = 4,符合i <= 10,if判断:4 % 2 是 余 0,所以i=4不是奇数, 则sum的值不进行累加,继续循环 i 的第五次循环,i=4+1 = 5,符合i <= 10,if判断:5 % 2 是 余 1,所以i=5是奇数, 则sum+=i等价于sum = 4 + 5,因此将9重新赋值给sum,继续循环 i 的第六次循环,i=5+1 = 6,符合i <= 10,if判断:6 % 2 是 余 0,所以i=6不是奇数, 则sum的值不进行累加,继续循环 i 的第七次循环,i=6+1 = 7,符合i <= 10,if判断:7 % 2 是 余 1,所以i=7是奇数, 则sum+=i等价于sum = 9 + 7,因此将16重新赋值给sum,继续循环 i 的第八次循环,i=7+1 = 8,符合i <= 10,if判断:8 % 2 是 余 0,所以i=8不是奇数, 则sum的值不进行累加,继续循环 i 的第九次循环,i=8+1 = 9,符合i <= 10,if判断:9 % 2 是 余 1,所以i=9是奇数, 则sum+=i等价于sum = 16 + 9,因此将25重新赋值给sum,继续循环 i 的第十次循环,i=9+1 = 10,符合i <= 10,if判断:10 % 2 是 余 0,所以i=10不是奇数, 则sum的值不进行累加,继续循环 i 的第十一次循环,i=10+1 = 11,不符合i <= 10,判断:false,结束循环 因此sum的值最终累加到25,最终在控制台输出的1~10奇数和是25 */ } }
输出结果: ---------------------------方式一--------------------------- 1~10之间的奇数和为:25
- 方式二:
package com.app.loop; public class ForTest3 { public static void main(String[] args) { // 目标:通过案例更深入和熟练使用for循环,并理解其流程 /* 需求:求1~10之间的奇数和,并把求和结果在控制台输出 分析: (1) 提供思路:1~10之间的奇数,1、3、5、7、9,将这些奇数通过使用for循环找出来,并累加起来求和 (2) 定义个盒子:int类型的变量sum,初始值为0,用于把for循环找出来的奇数装起来,并累加 (3) 使用for循环: (3-1) 定义初始化语句:int i = 1; (3-2) 定义循环条件:i <= 10; (3-3) 定义迭代语句:i++ (3-4) 在for循环里使用if判断来筛选: (3-4-1) if判断条件:使用除二取余法来判断是不是奇数,除二余数为1的是奇数 (3-4-1-1) 是奇数,则定义循环体语句:sum += i;————>将每次循环取到的奇数累加给盒子变量sum (4) 将求和结果在控制台输出 */ System.out.println("---------------------------方式二---------------------------"); // 1.定义盒子变量sum2,初始值为0,用于存放奇数累加值 int sum2 = 0; // 2.使用for循环,利用 (变量) += 2 依次取出1~10的奇数 for (int i = 1; i <= 10; i+=2) { // 3.将每次循环取出的奇数累加求和 sum2 += i; } // 4.将奇数之和输出在控制台 System.out.println("1~10之间的奇数和为:" + sum2); /* 此次奇数求和案例方式二的执行流程的详细解析: 1.定义盒子变量sum2,用于存放奇数累加值 2.进入for循环: i 的第一次循环,i=1,符合 i <= 10,sum2+=i 等价于 sum2 = sum2 + i 等价于 sum2 = 0 + 1, 则将1重新赋值给sum2 i 的第二次循环,i=1+2 = 3,符合i<=10,sum2+=i 等价于 sum2 = 1 + 3, 则将4重新赋值给sum2 i 的第三次循环,i=3+2 = 5,符合i<=10,sum2+=i 等价于 sum2 = 4 + 5, 则将9重新赋值给sum2 i 的第四次循环,i=5+2 = 7,符合i<=10,sum2+=i 等价于 sum2 = 9 + 7, 则将16重新赋值给sum2 i 的第五次循环,i=7+2 = 9,符合i<=10,sum2+=i 等价于 sum2 = 16 + 9, 则将25重新赋值给sum2 i 的第六次循环,i=9+2 = 11,不符合i<=10,判断为false,结束循环。 因此最终sum2的值累加到25,最终控制台输出的1~10奇数和是25 */ } }
输出结果: ---------------------------方式二--------------------------- 1~10之间的奇数和为:25
for循环案例——求奇数和的总结
1、如何实现求奇数和?
-
方式一:在for循环中,通过使用if判断筛选出奇数(除二取余法),再累加奇数和
int sum = 0; for (int i = 1; i <= 10; i++) { if (i % 2 == 1) { sum += i; } }
-
方式二:直接使用for循环找出奇数
int sum = 0; for (int i = 1; i <= 10; i+=2) { sum += i; }
四、for循环案例3:水仙花数
-
需求: 在控制台输出所有“水仙花数”,并且把水仙花数的个数的和也输出,水仙花数必须满足如下2个要求:
- 水仙花数是一个三位数
- 水仙花数的个位、十位、百位的数字立方和等于原数
package com.app.loop; public class ForTest4 { public static void main(String[] args) { // 目标:通过案例更深入和熟练使用for循环,并理解其执行流程 /* 需求:在控制台输出所有“水仙花数”,并且把水仙花数的个数和也输出,水仙花数必须满足如下2个要求: (1) 水仙花数是一个三位数 (2) 水仙花数的个位、十位、百位的数字立方和等于原数 需求分析: (1) 定义一个计数器变量,用于每输出一个水仙花数就累加它的个数 (2) 找出所有三位数:100~999——使用for循环来循环取出 (3) 每次循环取到一个三位数,就提取该三位数的:个位、十位、百位数字(需要变量分别接收个位、十位、百位) (4) 使用if判断:个位、十位、百位的数字立方和是否等于原数,等于就是水仙花数,则输出到控制台 */ // 1.定义一个计数器变量,用于每输出一个水仙花数就累加它的个数 int count = 0; // 2.找出所有三位数:100~999——使用for循环来循环取出 for (int i = 100; i < 1000; i++) { // 3.每次循环取到一个三位数,就提取该三位数的:个位、十位、百位数字(需要变量分别接收个位、十位、百位) // 个位 int ge = i % 10; // 假如 i = 153,153 / 10 = 15.3,余3,这样取到个位:3 // 十位 // 假如 i = 153 / 10 = 15.3,int类型保留整数,所以=15,15 % 10 = 15 / 10 = 1 余5,这样取到十位:5 int shi = i / 10 % 10; // 百位 int bai = i /100; // 假如 i = 153 / 100 = 1.57,int类型保留整数,所以就=1,这样取到百位 // 4.使用if判断:个位、十位、百位的数字立方和是否 等于 原数,等于就是水仙花数 // 假如153是水仙花数,1的3立方 + 5的三立方 + 3的三立方 的总和 是否等于 每次循环找出的三位数 i(原数) if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { // 则输出到控制台并且用一个空格隔开 System.out.print(i+"\t"); // 每输出一个水仙花数就累计个数 count++; } } System.out.println("\n水仙花数共有:" + count + "个"); } }
输出结果: 153 370 371 407 水仙花数共有:4个
for循环案例——找出水仙花数总结
1、如何找出水仙花数?
-
先了解什么是水仙花数,然后使用for循环来取出所有三位数:从100开始到999结束
// 1.使用for循环来取出所有三位数:从100开始到999结束 for (int i = 100; i < 1000) { }
-
提取出三位数的:个位、十位、百位,用变量存放起来
// 1.使用for循环来取出所有三位数:从100开始到999结束 for (int i = 100; i < 1000) { // 2.提取出三位数的:个位、十位、百位,用变量存放起来 // 个位 int ge = i % 10; // 十位 int shi = i / 10 % 10; // 百位 int bai = i / 100; }
-
用if判断三位数的:个位、十位、百位的立方和 是否 等于 原数(i:每次循环找出的三位数)
// 1.使用for循环来取出所有三位数:从100开始到999结束 for (int i = 100; i < 1000) { // 2.提取出三位数的:个位、十位、百位,用变量存放起来 // 个位 int ge = i % 10; // 十位 int shi = i / 10 % 10; // 百位 int bai = i / 100; // 3.用if判断三位数的:个位、十位、百位的立方和 是否 等于 原数(i:每次循环找出的三位数) if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { } }
-
找出水仙花数后,平坦输出,用空格隔开
// 1.使用for循环来取出所有三位数:从100开始到999结束 for (int i = 100; i < 1000) { // 2.提取出三位数的:个位、十位、百位,用变量存放起来 // 个位 int ge = i % 10; // 十位 int shi = i / 10 % 10; // 百位 int bai = i / 100; // 3.用if判断三位数的:个位、十位、百位的立方和 是否 等于 原数(i:每次循环找出的三位数) if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { // 4.找出水仙花数后,平坦输出,用空格隔开 System.out.print(i + "\t"); // 不加 ln 就是不换行的意思,"\t"是空格 } }
2、如何计算出水仙花数的总数?
-
在未进入循环之前,定义计数器变量,用于存放每循环找出一个水仙花数,就累加个数
// 5.在未进入循环之前,定义计数器变量,用于存放每循环找出一个水仙花数,就累加个数 int count = 0; // 1.使用for循环来取出所有三位数:从100开始到999结束 for (int i = 100; i < 1000) { // 2.提取出三位数的:个位、十位、百位,用变量存放起来 // 个位 int ge = i % 10; // 十位 int shi = i / 10 % 10; // 百位 int bai = i / 100; // 3.用if判断三位数的:个位、十位、百位的立方和 是否 等于 原数(i:每次循环找出的三位数) if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { // 4.找出水仙花数后,平坦输出,用空格隔开 System.out.print(i + "\t"); // 不加 ln 就是不换行的意思,"\t"是空格 } }
-
在每循环找出一个水仙花数后,将个数累加
// 5.在未进入循环之前,定义计数器变量,用于存放每循环找出一个水仙花数,就累加个数 int count = 0; // 1.使用for循环来取出所有三位数:从100开始到999结束 for (int i = 100; i < 1000) { // 2.提取出三位数的:个位、十位、百位,用变量存放起来 // 个位 int ge = i % 10; // 十位 int shi = i / 10 % 10; // 百位 int bai = i / 100; // 3.用if判断三位数的:个位、十位、百位的立方和 是否 等于 原数(i:每次循环找出的三位数) if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { // 4.找出水仙花数后,平坦输出,用空格隔开 System.out.print(i + "\t"); // 不加 ln 就是不换行的意思,"\t"是空格 // 6.在每循环找出一个水仙花数后,将个数累加 count++; } }
-
在控制台输出水仙花数总个数,用换行转义符隔开
// 5.在未进入循环之前,定义计数器变量,用于存放每循环找出一个水仙花数,就累加个数 int count = 0; // 1.使用for循环来取出所有三位数:从100开始到999结束 for (int i = 100; i < 1000) { // 2.提取出三位数的:个位、十位、百位,用变量存放起来 // 个位 int ge = i % 10; // 十位 int shi = i / 10 % 10; // 百位 int bai = i / 100; // 3.用if判断三位数的:个位、十位、百位的立方和 是否 等于 原数(i:每次循环找出的三位数) if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { // 4.找出水仙花数后,平坦输出,用空格隔开 System.out.print(i + "\t"); // 不加 ln 就是不换行的意思,"\t"是空格 // 6.在每循环找出一个水仙花数后,将个数累加 count++; } } // 7.在控制台输出水仙花数总个数,用换行转义符隔开 System.out.println("\n水仙花数的总共有:" + count + "个"); // "\n":换行的意思