循环简介
循环可以用于让一个程序重复地执行语句。
循环是用来控制语句块重复执行的一种结构。
循环的概念是程序设计的基础。
Java 提供了三种类型的循环语句:while 循环、do-while 循环、for 循环。
while 循环
while 循环在条件为真的情况下,重复地执行语句。
循环语法:
while(循环继续条件) {
//循环体语句(组)
}
循环中包含的重复执行的语句部分称为循环体(loop body)。循环体的每一次执行都被认为是一次循环的迭代。每个循环都含有循环继续条件,循环继续条件是一个布尔表达式,控制循环体的执行。
在循环体前总是先计算循环条件以决定是否执行循环体。
若循环条件为 true,则执行循环体;
若循环条件为 false,则终止整个循环,并且程序控制转移到 while 循环后的下一条语句。
while循环流程图
使用一个变量来对执行次数计数的循环称为计数器控制的循环。
注意:循环继续条件应该总是放在圆括号内。只有当循环体只包含一条语句或不包含语句时,循环体的花括号才可以省略。例:
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 guessistoo high");
else
System.out.println("Your guessistoo low");
}
}
}
循环设计策略
编写循环时应该考虑以下三个步骤:
1. 确定需要重复的语句。
2. 将这些语句放在一个循环中,如:
while(true) {
语句组;
}
3.为循环继续条件编码,并为控制循环添加适合的语句。如:
while(循环继续条件){
语句组;
用于控制循环的附件语句;
}
使用标记值控制循环
还有一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特殊值。这个特殊的输入值被称为标记值,用以表明循环的结束。如果循环使用标记值来控制它的执行,它就称为标记位控制的循环。
实例:
编写一个程序,用来读取和计算个数不确定的整数之和,并以输入0表示输入结束。
public class SentinelValue {
public static void main(string[] args) {
//创建一个ScannerScanner
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。从表面上看,这个循环似乎没问题,但实际上它是一个无限循环。
do-while 循环
do-while 循环和 while 循环基本一样,不同的是它先执行循环体一次,然后判断循环继续条件。
do-while 循环是 while 循环的变体。它的语法如下:
do{
//循环体语句(组)
} while(循环继续条件)
do-while 循环执行流程图
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 循环流程图:
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 语句跳出循环的当前迭代。