3.1循环结构语句
想要同样的操作执行多次,重复的行为 反复出现 就可以使用循环 来处理。
循环语句有三种: if 循环
while循环
do-while循环
循环中包含重复执行的语句的部分称为循环体。
循环体执行-次称为循环的一次选代。
无限循环是指循环语句被无限次执行。
3.2循环结构for语句的格式和基本使用
-
语法格式如下:
for(初始化; 布尔表达式; 更新) { //代码语句 }
-
执行流程
1.初始化语句 2.判断条件语句 true --> 循环体 false -->结束循环 3.执行循环体 4.控制条件语句 5.回到2继续
3.3 循环结构for语句的注意事项
循环继续条件语句的结果是一个boolean类型
循环体语句如果是一条语句
大括号可以省略 有左大括号就没有分号,有分号就没有左大括号
3.4 循环结构while语句的格式和基本使用
-
格式
while( 布尔表达式 ) { //循环内容 }
-
执行过程
1.执行初始化语句 2.执行判断条件语句 看其返回值是true 还是false 如果是 true: 就继续执行 循环体中的内容 如果是 false: 就结束循环 3.执行循环体语句 4.执行控制条件语句 5.回到2继续
3.5 循环结构do-while语句的格式和基本使用
-
语句格式:
do{ 循环体语句; 控制条件语句; }while(判断条件语句);
-
执行流程
执行流程: 1.执行初始化语句 2.执行循环体语句 3.执行控制条件语句 4.执行判断条件语句 如果是true 就继续循环执行 如果是false 就结束循环 5.回到2继续 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190121201542920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2luZmVybm9fZGV2aWw=,size_16,color_FFFFFF,t_70)
3.6 循环结构while语句和for语句的区别
for已知循环次数 while不知循环次数
for循环只在循环体内部可以使用
while在方法体中可以继续使用
3.7 循环结构循环注意事项和死循环
**注意事项
1.判断条件语句 无论简单还是复杂 结果必须是boolean
2.循环体语句如果是一条语句,花括号可以省略,如果是多条语句,就不可以省略 建议永远不要省略。
3. while和do-while循环常用于循环次数不确定的情况。
4. while循环和for循环都称为前测循环,因为在循环体执行之前,要检测一下是否满足条件。
5. 在循环中可以使用break和continue这两个关键字。
6. 建议使用自己觉得最自然、最舒服的种循环语句。通常,
如果已经提前知道重复次数,那就采用for循环那就采用for循环。
如果无法确定重复次数,就采用while循环,
如果在检验继续条件前需要执行循环体,就用do-while循环替代while循环。
**死循环
while(true){
//语句体;
}
for(;;){
//语句体;
}
这两种循环会成为无限循环,因为没有结束条件。想要变成正确的代码,在语句体中有break。
注意: 要保证循环继续条件最终可以变为false,以便程序能够结束。如果程序运行了不寻常的长时间而不结束,可能其中有无限循环。
3.8 控制跳转语句break
关键字break立即终止包含break的最内层循环。
-
break的使用场景:
选择结构switch语句中 循环语句中
-
break的作用:
跳出单层循环 跳出多层循环(建议少使用):带标签跳出,标签名:循环语句
3.9 控制跳转语句continue
关键字continue只是终止当前迭代。
-
continue的使用场景:
在循环语句中 离开使用场景的存在是没有意义的
-
continue的作用:
退出当前循环,开启下一次循环,也可带标签
3.10使用标记值控制循环
一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特殊值。
这个特殊的输人值也称为标记值,用以表明循环的结束。如果一个循环使用
标记值来控制它的执行,它就称为标记位控制的循环
3.10常见的错误
无限循环(也就是说,循环会永远执行下去)。按CTRL+C键来结束
or子句的末尾何循环体之间多写一个分号是一个常见的错误。
3.11 小结
1循环语可有三类: while循环、do-while循环和for循环。
2.循环中包含重复执行的语句的部分称为循环体。
3.循环体执行-次称为循环的一次选代。
4.无限循环是指循环语句被无限次执行。
5.在设计循环时,既需要考虑循环控制结构,还需要考虑循环体。
6. nhile循环首先检查循环继续条件。如果条件为true,则执行循环体:如果条件为faise,则循环结束。
7. do-while循环与while循环类似,只是do while循环先执行循环体,然后再检直循环维续条件,以确定是继续还是终止。
8. while和do-while循环常用于循环次数不确定的情况。
9.标记值是一个特殊的值,用来标记循环的结束。
10. for循环般用在循环体执行次数固定的情况。
11.for循环控制由三部分组成。第一部分是初始操作, 通常用于初始化控制变量。
第二部分是循环继续条件,决定是否执行循环体。
第三部分是每次迭代后执行的操作,经常用于调整控制变量。通常不要在控制结构中初始化和修改循环控制变量。
12. while循环和for循环都称为前测循环因为在循环体执行之前,要检测一下循环继续条件。
13 do-while循环称为后测循环,因为在循环体执行之后,要检测一下这个条件。
14.在循环中可以使用break和continue这两个关键字。
15.关键字break立即终止包含break的最内层循环。
16.关键字continue只是终止当前迭代。
3.12经典例题
-
猜数
要解决的问题是猜测计算机“脑子”里想的是什么数。编写一个程序,随机产生一个0到100之间且包含0和100的整数。程序提示用户连续输人一个数字,直到它和计算机随机产生的数字相匹配为止。对用户每次输人的数字,程序都要告诉用户该输人值是偏大了,还是偏小了,这样用户可以明智地进行下一轮的猜测。 -
最大公约数
import java.util.Scanner; public class If { //最大公约数 public static void main(String[] args) { Scanner sc=new Scanner(System.in); int num1=sc.nextInt(); int num2=sc.nextInt(); for(int i=Math.min(num1,num2);i>=0;i--) { //找出最小的数,开始循环 if(num1%i==0&&num2%i==0) { //同时被两个数整除 System.out.print("最大公约数"+i); } } } }
这个题的用到了if选择语句,还有一个好的思路是:直接从两个数中最小的那个数开始循环,遇到的第一个能被两个数同时整除的数一定是最大公约数。比较循环从1开始找完全部公约数,在比较出最大公约数,思路更清晰简洁。
-
打印菱形
public class Four { /* i()行 j (列) k(空格) * * 1 1 3 * * * * 2 1 2 2 * * * * * * 3 1 2 3 1 * * * * * * * * 4 1 2 3 4 0 * * * * * * 5 1 2 3 1 * * * * 6 1 2 2 * * 7 1 3 (a) (b) */ public static void main(String[] args) { for(int i=1;i<=7;i++) { //行 for(int k=1;k<=Math.abs(i-4);k++) { //空格 System.out.print(" "); } for(int j=1;j<=i&&j+i<=8;j++) { //列 星星 System.out.print("* "); } System.out.println(); //换行 } } }
解题思路:如果用每颗星的位置进行计算输出非常的麻烦,可以发现每行,每列,空格之间的关系进行计算输出更加方便。如图想要输出(a)图是从(b)图在前边加上空格,和星星后面加上空格(分隔两个星星)变化过来的。双从循环,外层循环控制行,内层循环控制列和空格,所以内层循环两个是并列的(千万不能想成嵌套关系),外层循环从1到7层,内层循环列是前四行 列小于等于行 后三行行加列等于八。空格是一个绝对值函数 y=|4-i|。
-
打印空心菱形
public class Five { /* i j k * 1 1 3 * * 2 1 2 2 * * 3 1 2 3 1 * * 4 1 2 3 4 0 * * 5 1 2 3 1 * * 6 1 2 2 * 7 1 3 */ public static void main(String[] args) { for(int i=1;i<=7;i++) { //行 for(int k=1;k<=Math.abs(i-4);k++) { //菱形外的空格 System.out.print(" "); } for(int j=1;j<=i&&j+i<=8;j++) { //列 星星 if(j==1||j==i||j+i==8)){ // 具体的星星在那里打印 System.out.print("*"); }else { System.out.print(" "); // 菱形内的空格 } } System.out.println(); //换行 } } }
解题思路:在打印实心菱形的基础上打印空心菱形。建议,不要以位置关系思考,很麻烦。先打印成三角形 再在前面打上空格添加成菱形。极限的思维,第一的打星星,最后一个打星星,第一个都是列为1的时候打的,最后一个星星是前四行列数等于行数,后三行是行加列等于八。空格用绝对值函数y=|4-i|。
-
将十进制数转为十六进制数
import java.util.Scanner; public class Switch { //进制转换 public static void main(String[] args) { Scanner sc=new Scanner(System.in); int num=sc.nextInt(); String res=""; //定义字符串用于接受十六进制数 while(true) { //循环 倒叙取余 int n=num%16; if(n>9) { res=(char)(n+55)+res; A~F的显示 }else { res=n+res; // 0~9的显示 } num=num/16; //步长 if(num==0) { break; //死循环必须有跳出条件 } } System.out.println("结果是"+res); } }
解题思路:十进制数不停地除以十六后所得的余数倒序取余,得到十六进制数。有一个小问题就是,在组成十六进制数的时候是倒序取余,所以是n+res,而不是res+n。
-
for循环打印输出下列所示
1 1 2 1 1 2 4 2 1 1 2 4 8 4 2 1 public class Tri { /* 1 1 2 1 1 2 4 2 1 1 2 4 8 4 2 1 0 1 2 3 2 1 0 次方 */ public static void main(String[] args) { for(int i=1;i<=4;i++) { //行 for(int j=-(i-1);j<=(i-1);i++) { //列 打印数字 System.out.print((int)(Math.pow(2,i-1-Math.abs(j)))+" "); } for(int k=1;k<=4-i;k++) { System.out.print(" "); //前面的空格 } System.out.println(); //换行 } } }
解题思路:每一行的数字都是2的次方。次方的范围是-(i-1)到(i-1)使用绝对值函数转换下得到。绝对值函数的转换方法如图:①–>②–>③。