本文中运用到的东西是Intellij IDEA和JDK 8,需求安装两款东西的请检查这两篇教程:点我检查安装JDK8/11/17教程、点我检查安装Intellij IDEA教程。
假设输出1~100之间的一切整数,正常情况下咱们需求写100行代码才能对一切数字输出。
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
// 其他数字输出省略...
System.out.println(100);
尽管这种办法能达到预期的作用,可是代码量属实有点大(ᇂ_ᇂ|||)
为了处理上述问题,Java为咱们提供了一个强壮的操控结构——循环结构。
循环结构是一种常用的程序操控结构,它允许程序在履行的过程中重复履行一段代码,直到满意特定条件为止。循环结构能够大大简化重复性使命的编写,进步代码编写功率和可读性。
在Java中,循环结构首要由while
循环、do-while
循环、for
循环组成。
一、while循环
while
循环的语法格局如下:
while (条件表达式) {
履行代码...
}
履行流程:假如条件表达式成果为true
,此刻进入while
循环内部履行代码,直到while
循环的条件表达式的成果为false
为止。
while
结构如下图所示:
事例1:运用
while
循环处理1~100的输出和1~100的和
咱们先处理1~100的输出,运用while
需求循环100次,咱们能够在while
循环外界说一个变量number
并赋值为1,因为是1~100是递加输出,条件表达式需求设定为number <= 100
。
在循环体中,咱们先将number
的值进行输出。可是此刻number
的值并没有添加,因而每次在输出后需求对number
进行自增1的操作,即number++
,部分代码如下:
int number = 1;
while (number <= 100) {
System.out.println("number = " + number);
number++;
}
这样就完结了1~100的输出,可是咱们还需求输出它们相加的和,咱们能够对上述的代码进行进一步改造:
在while
循环外部再界说一个变量sum
,默认值为0,用于存储数字相加的和。
在循环体中,输出句子后边完结两数相加的操作:sum = sum + number;
(简写为sum += number;
)
- 第一次循环:sum = 0 + 1 = 1
- 第二次循环:sum = 1 + 2 = 3
- 第三次循环:sum = 3 + 3 = 6
- 以此类推……
在while
循环内部即可完结1~100的核算,终究sum
的成果直接到while
循环外部进行输出即可,完好代码如下:
/**
* while循环--输出1~100并求和
*
* @author iCode504
* @date 2023-11-30
*/
public class WhileLoop1 {
public static void main(String[] args) {
// 1. 界说一个变量number用于输出数字
int number = 1;
// 2. 界说一个变量sum用于存储1~100相加的和
int sum = 0;
// 3. 界说while循环,条件表达式为number <= 100,需求保证number在while循环内相加
while (number <= 100) {
sum += number;
System.out.println("number = " + number);
number++;
}
System.out.println("sum = " + sum);
}
}
运转成果契合咱们的预期:
事例2:斐波那契数列
已知每对兔子(一雌一雄)每个月能生殖一对小兔子,每对兔子前两个月没有生育能力,从第三个月每个月能生一对小兔子,假设兔子不存在死亡现象,那么从第一对刚出生兔子开端,第n个月今后会有多少只兔子?
数学解法能够看这位老师的文章:点我检查,我只能说一句:太强了,膜拜大佬!
依据上述题意能够得出:
- 第1个月兔子无生育能力,因而兔子只要1对;
- 第2个月兔子无生育能力,此刻兔子仍为1对;
- 第3个月兔子生育了一对兔子,此刻兔子为2对;
- 第4个月最开端的兔子又生育了一对兔子,此刻兔子为3对;
- 第5个月,最开端的兔子又生育了一对兔子,第三个月的兔子也生育了一对兔子,此刻兔子为5对;
由此咱们能够得出一个数列:
能够看出,从第三个数起,每个数都是前1个数和前两个数相加得到的和。由此,咱们能够得到一个通用公式:
咱们能够界说三个变量:number1
、number2
和totalNumber
。其中number1
和number2
存储前两个月兔子的数量,totalNumber
存储前两月兔子数量的和(也便是上述公式的完结),详细完结代码如下:
import java.util.Scanner;
/**
* while循环处理斐波那契数列
*
* @author iCode504
* @date 2023-12-11
*/
public class FibonacciSequence {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入月数: ");
int monthNumber = scanner.nextInt();
// number1和number2代表前两个月兔子的数量
int number1 = 1, number2 = 1;
// i的含义是从第三个月开端繁衍。totalNumber用于核算前两个月兔子的数量
// totalNumber初始化值为1的意图:假如用户输入的月数为1或2,此刻兔子对数为1
int i = 3, totalNumber = 1;
// 限制条件:从第三个月开端核算到第monthNumber个月
while (monthNumber > 2 && i <= monthNumber) {
// 核算前两个月兔子总数
totalNumber = number1 + number2;
// number1存储i-2个月兔子数量,用于下一轮循环的运算
number1 = number2;
// number2存储i-1个月兔子数量,用于下一轮循环的运算
number2 = totalNumber;
i++;
}
System.out.println("第" + monthNumber + "个月兔子的数量是" + totalNumber + "对");
}
}
运转成果:
当然,循环仅仅处理斐波那契数列的一种办法,它还能够运用递归的办法处理。后续讲到办法的时候还会讲到这个问题的递归解法。
二、do-while循环
do-while
循环的语法格局如下:
do {
履行代码...
} while (条件表达式);
履行流程:先履行do
内部的代码,内部代码履行结束今后,再对while
中的条件表达式进行判别,假如条件表达式为true
,再次进入do
内部履行代码;假如条件表达式为false
,此刻就跳出do-while
循环。
和while
循环相比,do-while
循环即便其条件表达式为false
,也会履行一次do
内部的代码,因为它会先履行do
内部的代码再进行条件判别。
do-while
循环的履行流程如下图所示:
事例:核算一个数的一切因子之和(不包括1和自身)。输入一个正整数,输出其一切因子之和。
例如:
- 正整数6的一切因子是:2,3。因而一切的因子的和是2+3=52 + 3 = 5
- 正整数20的一切因子是:2,4,5,10。一切因子的和是2+4+5+10=212+4+5+10=21
假如运用do-while
循环来处理这个问题,咱们首要需求确认循环的规模是什么?
其实题目中已经告诉咱们了一个要害点:不包括1和自身。那么由此能够确认循环的规模是:[2,number)[2, number)。
如何确认上述区间的数字是正整数number
的因子呢?其实很简单,只需求判别这个数字能否被number
整除即可。
因为咱们输入的是正整数,需求在履行循环做一手判别,假如不是正整数,需求给出一个提示。
归纳上述内容,代码如下:
import java.util.Scanner;
/**
* do-while处理一个数一切因子的和
*
* @author iCode504
* @date 2023-12-15
*/
public class DoWhileDemo1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数: ");
int number = scanner.nextInt();
// 正整数判别
if (number > 0) {
// 界说一个变量sum,用于存储一切因子的和
int sum = 0;
// 因为正整数中因子不包含1和数字自身,因而循环需求从2开端,核算到number - 1
int i = 2;
do {
// 判别条件:i能被number整除的,那么i便是number的因子
if (number % i == 0) {
sum += i;
}
i++;
} while (i < number);
System.out.println("正整数" + number + "一切因子的和是: " + sum);
} else {
System.out.println("您输入的不是正整数!!!");
}
}
}
运转成果:
在开发中,运用do-while
循环的频率要比while
循环少很多。这首要是因为do-while
循环自身是先履行循环体,然后再进行条件判别。即便条件判别成果是false
,do-while
也履行了一次循环体,这可能会导致不必要的核算和操作。
三、一般for循环
一般for
循环的语法格局如下:
for (初始化表达式; 条件表达式; 迭代表达式) {
履行代码...
}
for
循环的履行流程如下图所示:
这里解释一下for
内部的三个表达式:
1. 初始化表达式,指的是初始化Java变量表达式,即数据类型 变量名 = 变量值
例如:int i = 0;
,或许把int i
写到for
循环之前,然后在for
循环第一个位置将i = 0
补齐即可。
当然,初始化表达式也能够一起界说多个变量,例如:int i = 0, j = 0;
2. 条件表达式,假如核算成果为true
,就进入for
循环内部履行代码,假如条件表达式为false
,就会跳出for
循环。
一般而言,条件表达式和初始化表达式中界说的变量有关。例如:i < 100
、i > -30
等等。
3. 迭代表达式,绝大多数情况下针对初始化表达式界说的变量进行添加或减少的操作。
以前面界说的初始化表达式int i = 0;
为例,假设让变量的值添加,咱们能够运用如下办法:
i++; // 自增1
++i; // 自增1
i += number; // 让i每次添加number
4. 一般在写for
循环代码时,推荐将初始化表达式、条件表达式、迭代表达式都写上。
事实上,不写上述三个表达式也会履行for
循环代码,可是假如在for
循环内部不写合理的条件判别的话,很简单造成死循环的情况的产生。
那么for
循环的履行流程是怎么样的呢?
- 在首次履行
for
循环的时候,先履行初始化表达式,然后依据条件表达式成果进行判别,假如条件表达式为true
,则进入for
循环内部履行代码,假如条件表达式为false
就跳出for
循环。在履行完for
循环内部代码今后,会针对前面初始化表达式的变量进行迭代操作(常见的是变量相加/相减操作)。 - 后续履行
for
循环的时候,就会依据for
循环迭代表达式的核算成果到条件表达式中进行比较,假如比较成果为true
履行for
内部代码,反之就会跳出for
循环。
这里举两个事例来阐明一下for
循环的运用:
事例1:求1~100(包含100)一切的偶数和
处理本题的要害点是偶数的获取,判别一个数是否是偶数,即数字对2求余等于0,再界说一个变量sum
对一切契合条件的偶数累加即可。
/**
* for核算1~100一切偶数和
*
* @author iCode504
* @date 2023-12-15
*/
public class NumberPrint {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
// 偶数判别条件:对2求余是否等于0
if (i % 2 == 0) {
// 偶数累加
sum += i;
}
}
System.out.println("1~100之间一切的和: " + sum);
}
}
运转成果:
事例2:水仙花数是指一个3位数,它的每个数位上的数字的3次幂之和等于这个数的自身。例如:
13+53+33=1531^3 + 5^3+3^3 = 153请运用
for
循环罗列一切的水仙花数。
1. 确认规模:水仙花是一个三位数,三位数的数字规模在[100,999][100, 999]区间内
2. 个位、十位、百位数的获取:
3. 契合水仙花数的条件:
归纳以上的分析,运用for
循环的代码如下图所示:
/**
* for循环罗列水仙花数
*
* @author iCode504
* @date 2023-12-15
*/
public class NarcissisticNumber {
public static void main(String[] args) {
// 界说三个变量a, b, c分别存储百位数、十位数、个位数
int a, b, c;
// 循环规模设定在[100, 999] --> [100, 1000)
for (int i = 100; i < 1000; i++) {
// 百位数、十位数、个位数的获取
a = i / 100;
b = i / 10 % 10;
c = i % 10;
// 水仙花数的判别条件
if (i == a * a * a + b * b * b + c * c * c) {
System.out.println(i);
}
}
}
}
运转成果即[100,999][100, 999]以内的一切水仙花数:
正如这节标题:“一般for
循环”,其实JDK 5还为咱们设计了foreach
循环(也称作增强for
循环),这类循环首要用于遍历数组和列表等结构,运用foreach
循环会简化代码结构,在后续学习数组是咱们会用到它,敬请期待꒰๑’ꀾ’๑꒱
四、死循环
死循环,即条件表达式核算成果恒定为true
而不断履行循环内部的代码。是一种无法自行终止的循环。在死循环中,程序会重复履行同一段代码,而且永久无法跳出这个循环,除非手动中断程序或许遇到未处理的异常。
下面运用上述三种循环演示以下死循环:
// while方式的死循环
while (true) {
System.out.println("我是死循环");
}
// do-while方式的死循环
do {
System.out.println("我是死循环");
} while (true);
// for方式的死循环:不写初始化表达式和迭代表达式,条件表达式为true
for (; true; ) {
System.out.println("我是死循环");
}
运转代码的过程中,假如不进行人为中止程序,它们就会不停输出“我是死循环”:
死循环会导致程序无法正常履行其他使命,并且可能会占用大量资源。在编写循环结构时,务必要保证正确设置循环条件和提供恰当的跳出机制,以避免死循环的产生。
五、Intellij IDEA关于循环的方便键
1. 在Intellij IDEA中,假如方便生成一个循环结构,能够输入fori
,然后会出现一个提示,按回车即可生成一个for
循环结构。这个for
循环是从0开端的:
2. 假如想生成一个从0~n的for
循环,能够运用n.for
方便生成。例如:假如我想生成0~100之间的循环,能够直接按100.for
,出现提示后直接按回车即可生成这个区间的for
循环:
3. 输入n.forr
能够生成一个从n到0顺次递减的for
循环,还是以100.forr
为例,生成的作用如下图所示:
4. 在编写代码的过程中,假如条件表达式能够确认的话,能够直接运用条件表达式.while
方便生成一个while
循环,例如: