第七章、循环
提纲
-
7.1 while循环
- 7.1.1 为什么使用循环
- 7.1.2 Java中有四种主要的循环结构
- 7.1.3 while循环结构语法
- 7.1.4 举例
-
7.2 debug模式进行程序调试
-
7.3 do…while循环
-
7.4 产生随机数与快捷键
- 7.4.1 产生随机数
- 7.4.2 快捷键
- 7.4.2.1 直接删除一行快捷键
- 7.4.2.2 多行代码同时右移和左移
- 7.4.2.3 一行或多行代码上下移
-
7.5 for循环
- 7.5.1 for的语法结构
- 7.5.2 for与while的区别
- 7.5.3 for循环的使用
- 7.5.4 for循环常见问题
-
7.6 跳出代码关键字
- 7.6.1 break
- 7.6.2 continue
- 7.6.3 return
-
7.7 嵌套循环
-
7.8 作业
- 7.8.1 while循环作业
- 7.8.2 do…while循环作业
- 7.8.3 for循环作业
- 7.8.4 综合练习
- 7.8.5 嵌套循环作业
7.1 while循环
-
7.1.1 为什么使用循环
- 从循环开始,才算是真正进入编程的开始。这个时候才能体现出计算机的优势
- 当我们想要同样的操作执行多次,就需要使用循环结构。 如果一遍一遍的打,那么代码的长度可想而知。
- 生活中的循环:打印100份简历,操场跑50圈,做1000个俯卧撑,车轮等。
-
7.1.2 Java中有四种主要的循环结构:
- while 循环
- do…while 循环
- for 循环
- 在Java5中引入了一种主要用于数组的增强型for循环。(for…each)
-
7.1.3 while循环结构语法:先判断,再执行。
while(布尔表达式) {//符合条件,循环继续执行;否则,循环退出
//循环内容(循环中被重复执行的操作)
} -
7.1.4 举例:
-
例1:循环“好好学习”100遍。
int i = 1;
while ( i <= 100 ) {
//书写规范:循环内容缩进一个Tab
System.out.println(“好好学习!”);
i ++;
} -
例2:为了帮助张浩尽快提高成绩,老师给他安排了每天的学习任务,其中上午阅读教材,学习理论部分,下午上机编程,掌握代码部分。老师每天检查学习成果。如果不合格,则继续进行。
//分析步骤:
1.分析循环条件和循环操作
2.套用while语法写出代码
3.检查循环是否能够退出
System.out.print(“合格了吗?(y/n):”);
String answer = input.next();
while(!“y”.equals(answer)){//循环条件:比较两个String类型的值是否相等
//以下为循环操作
System.out.println(“上午阅读教材!”);
System.out.println(“下午上机编程!\n”);
System.out.print(“合格了吗?(y/n):”);
answer = input.next();//避免死循环
}
System.out.println(“完成学习任务!”);
-
7.2 debug模式进行程序调试
- 为什么要使用程序调试:在编写程序的过程中,是不可避免会出现一些错误,代码比较少并且结构简单时我们可以通过阅读加输出语句找出程序错误。但当代码多且结构复杂时,我们就需要抓门的技术来帮我们来发现和定位,这个就是程序调试。
- 如何开启程序调试:
- 设置断点:MyEclipse中,设置断点的方式为:在java文件最左边会有一小列蓝色条,双击或者右键(后选择Toggle BreakPoint)任意一个位置。取消断点则重复相同的操作。设置断点后,程序会在运行过程中停留在断点处,等待程序员指令继续往下走。
- 如何进入Debug模式,右键点击执行的代码,选择Debug As–选择Java Application。或者点击最上一排的甲壳虫来启动。
- 单步运行:运行到断点后,MyEclipse会给出一个提示进入Debug调试视图模式,点击yes。点击一次F6程序往下执行一行。或者在左上角有个视图框,上面有Debug(告诉你程序执行到哪一行了),Servers(暂时不需要了解),还有右边有一行按钮。从左至右:1.两个X是删除Debug下的内容显示;2.一竖一个向右的箭头,相当于F8,一次性执行当前断点与下个断点之间的内容。3。两竖,暂停按钮。4.两个球一根线,断开连接,一般不用。5.一个箭头指向两个小横杠中间,进入这个方法的内部代码(暂时不了解)6.一个箭头指向一个小横杠,当前代码单步运行。7.当使用第5点中的按钮后才会亮,意思是跳出进入方法内部代码。
- 观察变量:在MyEclipse右上角有个视图框,框中有两个选项:(x) = Varibles,Breakpoints。第一个(x) = Varibles是程序运行过的代码所有变量的值,可以从这里一步一步的观察程序的运行情况。右边的Breakpoints是显示所有断点,我们断点可以设置多个。我们可以右键选择Remove删除选择的断点项,也可以Remove All删除所有的断点。
- 注意事项:
- 在调试结束后一定要删除所有的断点。
- 调试结束后可以点击右上角选择MyEclipse Java Enterprise回到MyEclipse视图
- 调试程序步骤:
- 逐条语句执行程序
- 观察程序执行情况
- 发现问题
- 解决问题
7.3 do…while循环
-
为什么使用do…while循环:当一个程序需要先执行后再进行判断时,则需要用到do…while循环来实现。
-
语法结构:
do {
//循环操作(先执行一遍循环操作)
}while (循环条件);//封号不能少
//符合条件,循环继续执行;否则,循环退出 -
do…while循环结构特点:先执行,再判断
-
例:经过几天的学习,老师给张浩一道测试题,让他先上机编写程序完成,然后老师检查是否合格。如果不合格,则继续编写。……
do{
System.out.println(“上机编写程序!”);
System.out.print(“合格了吗?(y/n)”);
answer = input.next();
System.out.println("");
}while(!“y”.equals(answer));
System.out.println(“恭喜你通过了测试!”); -
编写循环的要点:
- 循环变量初始化
- 循环条件
- 循环体内循环变量改变
-
while循环和do-while循环的区别
- 执行次序不同
-
- 语法不同
- 初始情况不满足循环条件时:
- while循环:一次都不会执行
- do-while循环:不管任何情况都至少执行一次。
7.4 产生随机数与快捷键
- 7.4.1 产生随机数:
- 导入随机器工具(介绍随机器):import java.util.Random;
- 生成一个新的随机器:Random random = new Random();
- 随机生成一个1-10的数:int i = random.nextInt(10)+1;
- 7.4.2 快捷键
- 7.4.2.1 直接删除一行快捷键:
- 方法一:直接选中要删除的行,按backspace回退键删除。
- 方法二:将光标移动至要删除的那一行随便一个位置,直接按ctrl+D,删除一行。
- 7.4.2.2 多行代码同时右移和左移:
- 右移:选中要移动的多行,直接按Tab键,整体向右移动一个Tab的距离。
- 左移:选中要移动的行,按Shift+Tab键,整体向左移动一个Tab的距离。
- 7.4.2.3 一行或多行代码上下移:选中要移动的一行或多行(移动一行时不需要选中,直接光标移动至那一行即可,移动多行必须选中),然后按alt+上下方向键(↑、↓)。
- 7.4.2.1 直接删除一行快捷键:
7.5 for循环
-
7.5.1 for的语法结构:
for (1、表达式(参数初始化); 2、条件判断; 4、更新循环变量) {
3、循环操作;//循环体被执行
}
//执行顺序为:1–>2–>3–>4–>(2–>3–>4)…括号中会一直循环到2、条件判断为false为止
//例:循环100次“好好学习!”
for (int i = 0 ; i < 100 ; i++) {
System.out.println(“好好学习!”);
} -
7.5.2 for与while的区别:本质无差别,但是for更简洁,代码短 ,且一般用于循环次数固定的情况。
-
7.5.3 for循环的使用:
-
例1:循环输入某同学S1结业考试的5门课成绩,并计算平均分。
//思考步骤:
1、分析循环条件和循环操作
2、结合问题套用for语法写出代码1(循环条件:循环的次数不足5,继续循环;循环操作:录入成绩,计算成绩之和)
3、检查循环是否能够退出//省略声明变量 //初始值:i= 0 //循环条件:i<5 //循环变量改变:i++ for(int i = 0; i < 5; i++){ //循环5次录入5门课成绩 //循环操作执行5次 System.out.print("请输入5门功课中第" + (i+1) + "门课的成绩: "); score = input.nextInt(); //录入成绩 sum = sum + score; //计算成绩和 } avg = sum / 5; //计算平均分 System.out.println(name + "的平均分是:" + avg);
-
例2:输入一个整数 ,输出如下所示加法表:
0 + 6 = 6
1 + 5 = 6
2 + 4 = 6
3 + 3 = 6
4 + 2 = 6
5 + 1 = 6
6 + 0 = 6int val = 6; for( int i = 0, j = val; i<=val; i++, j-- ){ System.out.println(i + " + " + j + " = " + (i+j)); }
-
**结论:**语法结构中:
- 表达式(参数初始化)可以可以声明多个同一类型的值并赋值,用“,”隔开。
- 更新循环变量可以是用“,”隔开的多个表达式,运算顺序从左到右。
-
-
7.5.4 for循环常见问题:
-
例1:表达式(参数初始化)可以省略也可以写在外面,但是分号不能少。
for(;i<10;i++){
System.out.println("这是 "+i);
}
//编译错误:变量 i 没有初始化
//正确写法:
int i = 0;
for(;i<10;i++){
System.out.println("这是 "+i);
} -
例2:条件判断可以省略,默认为true。但是不写会造成死循环的结果。所以一般要写入一个条件来阻止死循环。
for(int i=0;;i++){
System.out.println("这是 "+i);
}
//编译正确,但是缺少循环条件,造成死循环
//正确写法:
for(int i=0;i<10;i++){
System.out.println("这是 "+i);
} -
例3:更新循环变量可以省略,但是如果不改变循环变量就要保证循环体不是死循环。
for(int i=0;i<10;){
System.out.println("这是 "+i);
}
//编译通过,但是循环变量的值无变化,造成死循环
正确写法
for(int i=0;i<10;){
System.out.println("这是 "+i);
i++;//或者在上面第二个分号后写入i++
} -
例4:表达式全省略,无条件判断,循环变量无改变,应在循环体内设法结束循环;否则会造成死循环。
for(;😉{
System.out.println(“这是测试”);
}
-
7.6 跳出代码关键字
-
7.6.1 break:
-
为什么要用break(单词释义: 打破;折断;跳出。)语句:当某个条件没有循环完就需要结束循环.比如跑100圈,到50圈的时候跑不动了,想停下来怎么办?
-
什么是break:改变程序控制流。用于do-while、while、for中时,可跳出循环而执行循环后面的语句。
//结构
while(…){
…
break;//程序执行到这里之后会跳出整个循环继续往后执行.break通常在循环中与条件语句一起使用
…
}do{
…
break;
…
}while(…);for(…;…;…){
…
break;
…
} -
如何使用break:
-
循环录入某学生5门课的成绩并计算平均分,如果某分数录入为负,停止录入跳出整个循环并提示录入错误。
boolean isNegative = false;
int score = 0;
double sum = 0;
for(int i = 0; i < 5; i++){//循环5次录入5门课成绩
System.out.print(“请输入第” + (i+1) + "门课的成绩: ");
score = input.nextInt();
if(score < 0){ //输入负数
isNegative = true;
System.out.println(“执行了break;”);
break;
}
sum = sum + score; //累加求和
}
if(isNegative){//如果为true则输入成绩有误,不计算平均分
System.out.print(“输入成绩为负数”);
} else {
System.out.print(“平均分为:”+sum/5);
}
-
-
-
7.6.2 continue:
-
为什么使用continue:当在循环过程中需要过滤某些特定的条件的循环时,需要跳过本次循环而不是整个循环。
-
语法结构:
while(条件){
…
continue;//结束本次循环,然后回到条件继续进行判断,继续下一次循环
…
} -
什么是continue语句:
- 只能用在循环里
- 跳过循环体中剩余的语句而执行下一次循环
-
例:循环录入Java课的学生成绩,统计分数大于等于80分的学生比例
Scanner input = new Scanner(System.in);
int score = 0;
int num = 0;
System.out.print("请输入需要输入学生成绩的人数: ");
int total = input.nextInt();
for (int i = 0; i < total; i++) {
System.out.print(“请输入第” + (i + 1) + "位学生的成绩: ");
score = input.nextInt();
if (score < 80) {
continue;
}
num++;
}
System.out.println("80分以上的学生人数是: " + num);
double rate = (double) num / total * 100;
System.out.println(“80分以上的学生所占的比例为:” + rate + “%”); -
对比break和continue
- 使用场合
- break可用于switch结构和循环结构中
- continue只能用于循环结构中
- 作用(循环结构中)
- break语句终止某个循环,程序跳转到循环块外的下一条语句。
- continue跳出本次循环,进入下一次循环
- 使用场合
-
-
7.6.3 return:
-
什么是return:return语句总是用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句)。
-
举例1:无返回值的情况
public class Test {
public static void test1() {
System.out.println("---------无返回值类型的return语句测试--------");
for (int i = 1; ; i++) {
if (i == 4){
return;
}
System.out.println("i = " + i);
}
//System.out.println(“程序的最后”);//这句话会报错,因为return后面的语句没有意义。
}public static void main(String[] args) { Test.test1(); }
}
//执行结果
---------无返回值类型的return语句测试--------
i = 1
i = 2
i = 3**结论:**return单独使用,当i为4时结束整个方法。
-
举例2:返回一值,并且结束整个方法。
//while中是固定的值true
public static int locate(){
while(true){
return 4;
}
//System.out.println(“程序的最后”);//这句话会报错,因为return后面的语句没有意义。
}
//while中是不确定的boolean值
public static int locate(){
while(isTrue()){
return 4;//这里会报错
}
//return 0;
}
//
public static boolean isTrue(){
return true;
}
**结论:**这是因为编译器认为while语句有在任何情况下都能执行的能力,但是只在入参为true的情况下有该能力。JVM不知道当istrue为假的时候该怎么办,所以报错。可以在下面加入一个return 0;因为如果上面的无法执行,就会返回一个0。
-
-
7.3.4 代码标记,直接标记整段代码,然后使用关键字跳出。
OK:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
System.out.println(i+","+j+","+k);
if (k == 8) {
break OK;
}
}
}
}
7.7 嵌套循环(这里只讲for)
-
语法结构:(与嵌套if相似,就是多个for循环写在一起)。
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
//…这里可以继续写for循环
}
}
//这个循环执行次数为:1010… -
举例
-
例1:使用循环实现如下功能:一个人跑10圈,每跑一圈做5个俯卧撑。
for(int i=1;i<=10;i++){
System.out.println(“跑了第”+i+“圈”);
for(int j=1;j<=5;j++){
System.out.println(“做”+j+“个俯卧撑”);
}
} -
例2:使用循环实现如下功能:一年365天,一天吃三顿饭。
for(int i=1;i<=365;i++){
for(int j=1;j<=3;j++){
System.out.println(“吃了”+j+“吨饭”);
}
System.out.println(“唉,一天过完了”);
}
-
7.7 作业
-
7.7.1 while循环作业
- 输出1900-2012的闰年。(闰年规则:①、能被4整除且不能被100整除的为闰年.②、能被400整除的是闰年)
- 输出10000-99999里面的所有回文数。说明:即12321是回文数,个位与万位相同,十位与千位相同。
- 循环生成13个1到13的整数(提示:使用随机机器.nextInt(13)+1),如果生成的是1到10之间的数,就输出“电脑出了一张红桃几”,比如产生了一个3就输出“电脑出了一张红桃3”,如果生成的是11就输出“电脑出了一张红桃J”,如果生成的是12就输出“电脑出了一张红桃Q”,如果生成是13就输出“电脑出了一张红桃K。
- 循环100次说“我喜欢你”。
- 循环输出跑了1–100圈。c
- 循环输出1到100之间的所有偶数。
- 循环输出10到100之间所有能被5整除的数。
- 循环输入商品编号,显示对应的商品价格。输入“n”结束循环(效果图如:6.5.8题效果图)(提示:while循环结构、程序调试。实现思路:1、声明变量2、循环体(循环体内使用switch)3、循环条件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CEJA1oY5-1629684194146)(课上图片/6.5.8题效果图.png)] - 接上8题:升级购物结算,要求:循环输入商品编号和购买数量,当输入n时结账,结账时计算应付金额并找零。(效果图如:6.5.9题效果图)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FrpEK71-1629684194151)(课上图片/6.5.9题效果图.png)] - 计算2000年的1月1到2008年的1月1日之间相隔有多少天。(提示年有365天,润年有366天,循环从2000年到2008年结束)。
- 计算2008年的1月1日,到2008年的9月1日相隔有多少天。(提示:如果是润年的2月就有29天,平年的2月有28天。1、3、5、7、8、10、12月都有31天,4、6、9、11月都有30天)。
-
7.7.2 do…while循环作业
- 输出摄氏温度与华氏温度的对照表,要求它从摄氏温度0度到250度,每隔20度为一项,对照表中的条目不超过10条。转换关系:华氏温度 = 摄氏温度 * 9 / 5.0 + 32。
- 如果用户输入错误,可以重复输入直到输入正确,执行相应的操作后退出循环(效果图如:6.5.2题效果图.png)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0n5ARR4-1629684194152)(课上图片/6.5.2题效果图.png)] - 苦练半年,眼看大赛在即,盈盈提议:彩排一次,如果很令人满意,以后就不用彩排了,否则每天都要彩排,直到现场表现让她满意为止!
- 那个男孩子每天说完“我喜欢你”就问“你喜欢我吗?”如果那女孩子说“不喜欢”就接着循环说“我喜欢你”直到那女孩子说“喜欢”为止,就结束循环。
-
7.7.3 for循环作业
-
1–10圈,第8圈结束循环(break)。
-
1+2+3+4+5…+10 的和超过20的数字是?
-
循环录入某学生5门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示录入错误。
-
循环100次“我爱你,你爱我吗?”,知道对方说爱,就结束循环。
-
从1一直加到100,但如果累加的和大于500也要结束循环,并输出此时已经加到的数是什么?
-
输出1到100的所有数。
-
输出1到100之间的所有偶数。
-
接收五个学生的姓名,并输出。格式如下:
请输入第1个学生的姓名:
第1个学生的姓名是:**
请输入第2个学生的姓名:
第2个学生的姓名是:**
………… -
输出1到100之间的既能被3整除又能被4整除的数。
-
-
7.7.4 综合练习(while、do…while、for、continue、break)
- 猴子摘了一堆枣N个,第一天吃了一半,还嫌不过瘾,又多吃了一个:第二天又吃了剩下的一半零一个:以后每天如此,到第十天,猴子一看只剩下一个了。问最初有多少个枣子?
- 那个男孩子每天说完“我喜欢你”就问“你喜欢我吗?”如果那女孩子说“不喜欢”就接着循环说“我喜欢你”直到那女孩子说“喜欢”为止,就结束循环。
- 循环问“你的名字叫什么?”,如果回答的是“不告诉你”,就继续问,否则输出“你的名字原来叫:**”。编程实现。
- 循环输入大于0的数字进行累加,直到输入的数字为0,就结束循环,并最后输出累加的结果。
- 循环输入字符串,将这些输入的字符串都连接起来,至到输入的字符串为“Esc”就结束循环,最后显示这个连接起来的字符串。比如:输入abc、输入def,输入Esc就输出abcdef。
- 输入一批数字,求这一批数字的最大值,最小值,输入0截止。
- 循环接收5名学生的成绩,统计有多少人的成绩大于80分。
- 实现1–100的偶数的和。
- 循环输入3次密码,当密码成功就结束循环,输入三次错误同样结束循环
-
7.7.5 嵌套循环作业
-
打印如下图形:
图形一 图形二 图形三 图形四
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 图形六 * * * * * * 图形五
-
使用循环打印九九乘法表。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lqKUaPGv-1629684194157)(课上图片/九九乘法表.jpg)] -
两个乒乓球队进行比赛,各出三人。甲队为A、B、C 3人。乙队为X、Y、Z 3人,已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比,请编写代码找出三队赛手名单。
-
接收控制台输入一个正奇整数,打印一个菱形。(动态打印菱形)
-
接收控制台输入一个正奇整数,打印下面的菱形。(动态打印,往后就是E,F,G…)
A
BBB
CCCCC
DDDDDDD
CCCCC
BBB
A -
一个人拿100元买100只鸡,已知公鸡每只2元,母鸡每只1.5元,小鸡每只0.5元,并且要求公鸡、母鸡、小鸡都至少要有一只,问有多少种买法?
-
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
-
百元买百鸡问题:公鸡每只5元,母鸡每只3元,小鸡每3只1元;一百元买一百只鸡,要求三种鸡都要买,有多少种购买组合?
-
编写Java程序,求13+23+33+43+…+973+983+993+1003的和。
-
编写Java程序,求13-23+33-43+…+973-983+993-1003的值。
-
求反序数:反序数就是将整数倒过来的整数,如整数12345,倒过来是54321。需求:求任何给定的整数的反序数。
-
水仙花数:是指一个三位或以上的数字,它的每个位上的数字的n次幂之和等于它本身。例如:153=1*1*1+5*5*5+3*3*3。要求:1.判断用户输入的三位数是不是水仙花数;2.求100-1000之间的水仙花数。
-
一共30个人,可能包括男人,女人,小孩,他们一家在饭馆吃饭一共花了50元,其中男人花了3元,每个女人花2元,小孩1元,请问男人,女人,小孩各几个人?
-
判断101-200之间有多少个素数,并输出所有素数。(素数:只能被1和本身整除数字叫素数)。
-
思考题:有五个 穷凶极恶 的海盗,他们既 贪婪又凶狠 。有一次他们五个人一起去海上寻找宝藏,发现了一箱金币,这箱金币总共有100枚,
每一枚都 非常非常的值钱 。但是问题来了,这箱金币到底要怎么分呢?他们想了一个办法,通过划拳的方式从一号到五号排序,然后再从一号开始决
定要怎么分这箱金币。只要除自己之外剩下的人中超过一半以上(包括一半,除自己外剩下三个人时必须两个人同意)的人同意这种分法,
则这个分金币的 方法通过 ,否则分金币的那个人 必须 跳海 自杀 。请问,他们要怎么分才能 既保命 又能分到的金币最多 ?
要求:1.写出从一号到五号每个人的分法,即五种分法(轮到分金币的那个人的时候,默认前面的人已跳海。比如,二号分的时候一号已经死了,以此类推)
2.分出的结果 必须符合逻辑 ,且必须要 符合题目的所有要求 。
-