Java学习笔记——循环

时间:2023-02-24 11:37:17

简介

循环可以用于让一个程序重复地执行语句。
循环是用来控制语句块重复执行的一种结构。
循环的概念是程序设计的基础。
Java 提供了三种类型的循环语句:while循环、do-while循环、for循环。

while循环

while循环在条件为真的情况下,重复地执行语句。
循环语法:

while(循环继续条件) {
//循环体
语句(组)

循环中包含的重复执行的语句部分称为循环体(loop body)。循环体的每一次执行都被认为是一次循环的迭代。每个循环都含有循环继续条件,循环继续条件是一个布尔表达式,控制循环体的执行。

在循环体前总是先计算循环条件以决定是否执行循环体。
若循环条件为true,则执行循环体;
若循环条件为false,则终止整个循环,并且程序控制转移到while循环后的下一条语句。

while循环流程图
Java学习笔记——循环

使用一个变量来对执行次数计数的循环称为计数器控制的循环。

注意:循环继续条件应该总是放在圆括号内。只有当循环体只包含一条语句或不包含语句时,循环体的花括号才可以省略。例:

int sum = 0, I = 1;
while (I < 10) {
sum = sum + I;
i++;
}
System.out.println(“sum is “ + sum);

如果 I < 10为true,那么程序将I 加入sum。变量 I 被初始化为1,然后自增为2、3、4直到10。当 i为10时,i<10为false,退出循环,所以和就是1+2+3+…+9=45;
如果循环被错误写为:

int sum = 0, i = 1;
while(i < 10) {
sum = sum + i;
}

该循环将会成为无限循环,因为i总是1而i<10永远为true;

注意:要保证循环继续条件最终可以变为false,以便程序能够结束。一个常见的程序设计错误是无限循环。如果程序运行了不寻常的长时间而不结束,可能其中有无限循环。在命令窗口运行程序时,可以使用CTRL + C键来结束。

注意:使循环多执行一次或少执行一次的情况被称为差一错误。例如:

int count = 0;
while (count <= 100) {
System.out.println(“welcome to Java”);
count++;
}

上述例子将会将welcome to java显示101次。需要显示100次,应该把count <= 100更改为count<100。

while循环实例
程序随机生成一个0到100之间的整数。提示用户连续输入一个数字,直到与计算机随机数相匹配为止。

public class GuessNumber {
public static void main(String[] args) {
//创建一个随机数
int number = (int)(Math.random() * 101);

Scanner input = new Scanner(System.in);
System.out.println("Guess a magic number between 0 and 100");

int guess = -1;
while(guess != number) {
//提示用户输入猜测值
System.out.print("\nEnter your guess: ");
guess = input.nextIne();

if(guess == number)
System.out.println("Yes, the number is " + number");
else if(guess > number)
System.out.println("
Your guess is too high");
else
System.out.println("
Your guess is too low");
}
}
}

循环设计策略

编写循环时应该考虑以下三个步骤:
1. 确定需要重复的语句。
2. 将这些语句放在一个循环中,如:

while(true) {
语句组;
}

3.为循环继续条件编码,并为控制循环添加适合的语句。如:

while(循环继续条件) {
语句组;
用于控制循环的附件语句;

使用标记值控制循环

还有一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特殊值。这个特殊的输入值被称为标记值,用以表明循环的结束。如果循环使用标记值来控制它的执行,它就称为标记位控制的循环。

实例:
编写一个程序,用来读取和计算个数不确定的整数之和,并以输入0表示输入结束。

public class SentinelValue {
public static void main(string[] args) {
//创建一个Scanner
Scanner input = new Scanner(System.in);

//输入一个初始值
System.out.println("Enter an integer (the input ends if it is 0); ");
int data = input.nextInt();

//连续输入一个值,直到输入值为0
int sum = 0;
while(data != 0) {
sum += data;

//输入下一个值
System.out.println("Enter an integer (the ends if it is 0): ");
data = input.nextInt();
}
System.out.println("the sum is " + sum);
}
}

注意: 循环控制中,不要使用浮点数来比较值是否相等。因为浮点数值都是某些值的近似值,使用它们可能导致不精确的循环次数和不准确的结果。例如:

double item = 1; double sum = 0;
while(item != 0) {
sum += item;
item -= 0.1;
}
System.out.println(sum);

变量item从1开始,每执行一次循环体就减去0.1 。当item变为0时循环应该终止。但是,因为浮点数值在算术上是近似的,所以不能确保item会变成真正的0.从表面上看,这个循环似乎没问题,但实际上它是一个无限循环。

输入和输出重定向

上述例子中,如果要输入大量的数值,那么从键盘上输入是非常繁琐的事。可以将这些数据用空格隔开,保存在一个名为input.txt的文本文件中,然后使用下面的命令运行这个程序:
java SentinelValue < input.txt

这个命令成为输入重定向。程序从文件input.txt中读取输入,而不是让用户在运行时从键盘输入数据。类似地,还有输出重定向,输出重定向将输出发送给文件,而不是把它们显示在控制台上。

java ClassName > output.txt

可以在同一命令中同时使用输入重定向和输出重定向。

java SentinelValue <input.txt> output.txt

do-while循环

do-while循环和while循环基本一样,不同的是它先执行循环体一次,然后判断循环继续条件。
do-while循环是while循环的变体。它的语法如下:

do {
//循环体
语句(组)
} while (循环继续条件)

do-while循环执行流程图

Java学习笔记——循环

do-while循环首先执行循环体,然后检查循环继续条件,以确定继续执行循环还是终止循环。

do-while循环实例

public class TestDoWhile {
public static void main(String[] args) {
int data;
int sum = 0;

Scanner input = new Scanner(System.in);

do {
System.out.print("Enter an integer (the input ends if it is 0): ");
data = input.nextInt();

sum += data;
}while(data != 0);
System.out.println("The sum is " + sum);
}
}

注意: 如果循环中的语句至少需要执行一次,建议使用do-while循环。前面程序TestDoWhile中do-while循环的情形就是如此。如果使用while循环,那么这些语句必须在循环前和循环内都出现。

for循环

for循环具有编写循环的简明语法。
经常会用到下面的通用形式编写循环:

i = initialValue;
while(i < endValue)
...
i++;
}

可以使用for循环简化前面的循环:

for(i = initialValue; i < endValue; i++)
...
}

通常,for循环的语法如下所示:

for(初始操作;循环继续条件;每次迭代后的操作) {
//循环体
语句(组)
}

for循环流程图:
Java学习笔记——循环

for循环只执行一次初始动作,当循环继续条件为真时,重复执行循环体中的语句,然后完成每次迭代后的操作。

一般情况下,for循环使用一个变量来控制循环体的执行次数,以及什么时候循环终止。这个变量称为控制变量。初始化动作指初始化控制变量,每次迭代后的动作通常会对控制变量做自增或自减,而循环继续条件检验控制变量是否达到终止值。

注意: 控制变量必须在循环控制结构体内或循环初始动作中说明。如果循环控制变量只在循环内使用而不在其他地方使用,那么在for循环的初始动作中声明它是一个很好的编程习惯。如果在循环控制结构体内声明变量,那么在循环外不能引用它。

注意: for循环中的初始动作可以是0个或是多个以逗号隔开的变量声明语句或赋值表达式。例如:

for(int i =0, j = 0; i + j < 10; i++, j++) {
//循环体
}

如果省略for循环中的循环继续条件,则隐含地认为循环继续条件为true。

采用哪种循环

可以根据哪个循环方便,来使用for循环、while循环、或者do-while循环。

while循环和for循环都称为前侧循环,因为继续条件是在循环体执行之前检测,do-while循环称为后侧循环,因为循环条件是在循环体执行之后检测的。三种形式的循环语句:while、do-while和for,在表达上是等价的。即:可以使用三种形式之一编写一个循环。

通常如果已经提前知道重复次数,那就采用for循环;如果无法确定重复次数,就采用while循环;如果在检验继续条件前需要执行循环体,就用do-while循环替代while循环。

嵌套循环

嵌套循环是由一个外层循环和一个或多个内层循环组成。每当重复执行一次外层循环时将再次进入内部循环。

关键字break和continue

关键字break和continue在循环中提供了额外的控制。

可以在一个循环内使用break立即终止该循环。当程序遇到continue时,它会结束当前的迭代。程序控制转向该循环体的末尾。即:continue只是跳出了一次迭代,而关键字break是跳出了整个循环。

注意: continue语句总是在一个循环内。在while和do-while循环中,continue语句之后会马上计算循环继续条件;而在for循环中,continue语句之后会立即先执行每次迭代后的动作,再计算循环继续条件。

总是可以编写在循环中不使用break和continue的程序,通常,只有在能够简化代码并使程序更容易阅读的情况下,才适合使用break和continue。

使用break语句可以使程序更简单易读,但是应该谨慎使用break和continue。过多使用break和continue会使循环有很多退出点,使程序很难阅读。

注意: 存在goto语句可以随意地将控制转移到程序中的任意一条语句上,然后执行它。这使得程序容易出错。Java中的break语句和continue语句是不同于goto语句的。它们只能运行在循环中或者switch语句中。break语句跳出整个循环,而continue语句跳出循环的当前迭代。