1 循环结构
1.1 为什么需要循环结构
提示:张浩的 Java 考试成绩只有 80 分,没有达到自己的目标。为了表明自己勤奋学习的决心,他决定编程写 100 遍“好好学习,天天向上!”
经过努力,张浩终于编写完了程序,如示例 1 所示。
示例1
package cn.jbit.loops1;
public class DoWithoutWhile {
/*
* 不用while打印100遍
*/
public static void main(String[] args) {
System.out.println("第1遍写:好好学习,天天向上!");
System.out.println("第2遍写:好好学习,天天向上!");
System.out.println("第3遍写:好好学习,天天向上!");
System.out.println("第4遍写:好好学习,天天向上!");
//省略91行语句
System.out.println("第96遍写:好好学习,天天向上!");
System.out.println("第97遍写:好好学习,天天向上!");
System.out.println("第98遍写:好好学习,天天向上!");
System.out.println("第99遍写:好好学习,天天向上!");
System.out.println("第100遍写:好好学习,天天向上!");
}
}
程序运行结果如图 5.1 所示。
图 5.1 示例 1 的运行结果
张浩看到这个结果后很高兴,将这段代码拿给老师看。老师看了以后很赞赏张浩努力学习的精神,但给张浩提出了一个问题:如果要写 10000 遍该如何做呢?张浩觉得写 100 遍就花费了很长时间,更何况写 10000 遍呢?张浩去请教了师兄。师兄告诉他可以用循环结构,这样写 100 遍的代码如示例 2 所示。
示例2
package cn.jbit.loops1;
public class WhileDemo1 {
/*
* while打印100遍
*/
public static void main(String[] args) {
int i = 1;
while(i <= 100){
System.out.println("第" +i+ "遍写:好好学习,天天向上!");
i++; // i = i + 1
}
}
}
通过运行,示例 2 的结果和示例 1 的结果相同。如果要写 10000 遍代码,只需改变一条语句即可,如示例 3 所示。
示例3
package cn.jbit.loops1;
public class WhileDemo1 {
/*
* while打印100遍
*/
public static void main(String[] args) {
int i = 1;
while(i <= 10000){
System.out.println("第" +i+ "遍写:好好学习,天天向上!");
i++;
}
}
}
程序运行结果如图 5.2 所示。
图 5.2 示例 3 的运行结果
与示例 1 相比,示例 2 和示例 3 中处理问题的方式更简单。下面学习循环结构。
1.2 什么是循环结构
通过上面的示例,相信大家对循环有了一定的认识。循环就是重复地做,如 5.1.1 节的示例就是重复地写"好好学习,天天向上!"。
其实,在日常生活中有很多循环的例子,如打印 50 份试卷、在 400m 跑道上进行 10000m 赛跑、做 100 道编程题、滚动的车轮等,如图 5.3 所示。
图 5.3 生活中的循环
这些循环结构有哪些共同点呢?
我们可以从循环条件和循环操作两个角度考虑,即明确一句话 “在什么条件成立时不断地做什么事情”。
分析:
打印 50 份试卷:
循环条件——只要打印的试卷份数不足 50 份就继续打印。
循环操作----打印 1 份试卷,打印总份数加 1 。
万米赛跑:
循环条件——跑过的距离不足 10000m 就继续跑。
循环操作——跑 1 圈,跑过的距离增加 400m 。
做 100 道编程题:
循环条件——做编程题不足 100 道就继续做。
循环操作——完成 1 道编程题,完成题目的总数量增加 1 。
滚动车轮:
循环条件——没有到目的地就继续。
循环操作——车轮滚动 1 圈,离目的地更近一点。
由以上分析可以看出,所有的循环结构都有这样的特点:首先,循环不是无休止进行的,满足一定条件的时候循环才会继续,称为"循环条件",循环条件不满足的时候,循环退出;其次,循环结构是反复进行相同的或类似的一系列操作,称为"循环操作",如图 5.4 所示。
2 while循环结构
2.1 什么是while循环结构
我们已经了解了循环结构的构成和特点,而程序中的循环结构是什么样的呢?
观察 5.1.1 节的示例 2, 其中使用了 While 循环结构。 Java 程序中的循环结构有三种实现方式: while 循环结构、 do-while 循环结构和 for 循环结构。本章我们学习前两种。
下面先介绍 while 循环结构,如表 5-1 所示。
表 5-1 while 循环结构
关键字while后小括号中的内容是循环条件。循环条件是一个表达式,它的值为boolean类型,即true或false,如i<=100。{}中的语句统称为循环操作,又称为循环体。
结合表5-1 , while循环结构的执行顺序一般如下。
(1) 声明并初始化循环变量。
(2) 判断循环条件是否满足,如果满足则执行循环操作;否则退出循环。
(3) 执行完循环操作后,再次判断循环条件,决定继续执行循环或退出循环。
结合流程图思考:如果第一次判断循环条件时就不满足,循环操作会不会被执行?
实际上,while循环结构如果第一次判断循环条件就不满足,则会直接跳出循环,循环操作一遍都不会执行。这是while循环结构的一个特点:先判断,后执行。
2.2 如何使用 while 循环结构
下面使用while循环结构实现打印50份试卷。根据前面的分析,打印50份试卷的流程图如图5.5所示。
图5.5打印50份试卷的流程图
根据while循环结构的语法,可以得到如示例4所示的代码。
示例4
package cn.jbit.loops1;
import java.util.Scanner;
public class WhileDemo {
/*
* 如何使用while循环
*/
public static void main(String[] args) {
int count = 1;
while(count <= 50){
System.out.println("打印第" +count+ "份试卷");
count++;
}
}
}
问题:为了帮助张浩尽快提高成绩,老师给他安排了每天的学习任务:上午阅读教材,学习理论部分;下午上机编程,掌握代码部分。老师每天检查学习成果,如果不合格,则继续进行。
分析:对上面的问题,循环条件:老师没有给出满意的评价,就要继续执行任务。循环操作:上午阅读教材,下午上机编程。通过从控制台输入y或n表示老师的评价是“合格”或“不合格”,根据这个条件决定是否执行循环操作。根据while循环的语法,可以得到如示例5所示的代码。
示例5
package cn.jbit.loops1;
import java.util.Scanner;
public class WhileDemo3 {
/*
* 如何使用while循环
*/
public static void main(String[] args) {
String answer; //标识是否合格
Scanner input = new Scanner(System.in);
System.out.print("合格了吗?(y/n):");
answer = input.next();
while(!"y".equals(answer)){
System.out.println("上午阅读教材!");
System.out.println("下午上机编程!\n");
System.out.print("合格了吗?(y/n):");
answer = input.next();
}
System.out.println("完成学习任务!");
}
}
分析代码,可能会有以下问题。上一章学到了从控制台获得输入时需使用Scanner,为什么这里语法有变化呢?这是因为以前学的是从控制台获得一个整数,而这里需要从控制台获得一个字符串,将其保存在String类型的变量answer中,代码如下:
answer = input.next();
如何判断输入的字符串是不是"y" ?
回顾上一章,比较两个int类型或char类型变量是否相等,我们使用运算符"==”。这里,answer是String类型的变量,判断String类型变量是否相等通常采用下面的方法。
//判断 String 型的变量 strl 是否等于 str2, 若相等,则值为 true, 若不相等,则值为 false
String strl = "yes";
String str2 = “no";
boolean bool = strl.equals(str2);
System.out.println(bool);
以上代码运行后将输出false。因此,"y" .equals(answer)用来判断变量answer的值是不是小写英文字母y。 !"y" .equals(answer)的含义:当answer的值不是y的时候,其值为true;answer的值是y的时候,其值为false。所以运行程序后输入y的时候,循环可以退出。程序运行结果如图5.6所示。
图5.6示例5的运行结果
通过示例5可以得到使用while循环结构解决问题的步骤。
说明:使用while循环结构解决问题的步骤如下。
(1) 分析循环条件和循环操作。
(2) 套用while语法写出代码。
(3) 检查循环能否退出。
注意:使用while循环结构解决问题时,一定要注意检查循环能否退出,即避免出现“死循环”现象。检查下面的代码。
package cn.jbit.loops1;
public class ErrorDemo {
public static void main(String[] args) {
int i = 0;
while(i < 4){
System.out.println("循环一直运行,不会退出!");
//这里缺少什么?
}
}
}
分析代码,会发现在循环操作中一直没有改变i的值。i的值一直为0,即始终满足i<4的循环条件,因此循环会一直运行,不会退出。修改的方法是在输出语句之后增加语句:
i++ ;
永远不会退出的循环称为“死循环”。“死循环”是编程中应极力避免出现的情况,所以对于循环,编写完成后要仔细检查循环能否退出。
常见错误1
使用while循环结构解决问题时,经常会遇到下面的一些错误。
(1)没有为循环变量赋初值。
检查下面的代码。
package cn.jbit.loops1;
public class ErrorDemo {
public static void main(String[] args) {
int i;
while(i < 4){
System.out.println("循环");
i++;
}
}
}
分析代码,会发现没有给循环变量i赋初值,程序编译将出现错误,并提示 “为变量i赋初值”。
(2)缺少{}。
运行下面的代码,将会出现什么结果?请动手尝试一下
package cn.jbit.loops1;
public class ErrorDemo {
public static void main(String[] args) {
int i = 0;
while(i < 4){
System.out.println("循环");
i++;
}
}
}