一 do..while控制语句
基本语法:
循环变量控制化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);
说明:
- do while 是关键字
- 有不同于for和while语法的循环四要素
- 先执行,再判断(也就是说一定会执行一次,区别于while)
- 最后有一个;分号
注意事项:
- 循环条件返回一个布尔值的表达式
- do..while是先执行再判断,因此至少执行一次
public class dowhile01 { public static void main(String[] args) { int i = 0; do { System.out.println("i = " + i); i++; } while (i < 5); } }
如上述代码所示,正常进行打印,输出结果如左图所示。
将while中的条件判断更改为不成立时,如下述代码
public class dowhile01 {
public static void main(String[] args) {
int i = 6;
do {
System.out.println("i = " + i);
i++;
} while (i < 5);
}
}
可以看到输出结果明显是不相符的时候,但是依旧有一次执行。
简单写个小练习
import java.util.Scanner;
public class dowhileexercise {
public static void main(String[] args) {
char answer = ' ';
do{
Scanner sc = new Scanner(System.in);
System.out.println("高松灯:你愿意跟我组一辈子乐队吗?(y/n)");
answer = sc.next().charAt(0);
}while(answer != 'y');
System.out.println("高松灯:大家组一辈子乐队!");
}
}
可以看到如果while当中判断语句不成立时,是会一直持续执行下去的,只有当成立的时候才会退出循环。
二 多重循环控制
介绍:
- 将一个循环放在另一个循环内,就形成了嵌套循环。其中for,while,do...while均可作为外层循环和内层循环【建议一般都用两层,最多不要用三层,否则代码的可读性会很差】。
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
- 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。(数据结构计算时间复杂度爱考)
简单写个题目:统计三个班的成绩情况,每个班五个同学,求出每个班的平均分和所有班级的平均分(学生成绩由键盘输入),同时统计出及格人数。
import java.util.Scanner;
public class MulForExercise01 {
public static void main(String[] args) {
int i=0;
int sum1=0;
int StudetCount=0;
Scanner scanner = new Scanner(System.in);
for(;i<=2;i++){
int sum=0;
for(int j=0;j<=4;j++){
System.out.println("请输入第"+(i+1)+"个班的第"+(j+1)+"个学生的成绩:");
int score=scanner.nextInt();
if(score>=60){
StudetCount++;
}
sum+=score;
sum1+=score;
}
double average=sum/5.0;
System.out.println("第"+(i+1)+"个班的平均分为:"+average);
}
double average1=sum1/15.0;
System.out.println("所有班级的平均分为:"+average1);
System.out.println("及格人数为:"+StudetCount);
}
}
个人写出代码如上,这个过程当中有几个点需要注意:
- 关于变量的声明区域要取对,有的需要声明在外面作为总体变量使用,因为最后还会调用,有的仅在循环内使用,最好就放在循环内,且每次外层循环都把值给置为0。
- Scanner声明在循环外面,如果声明在循环内每次输入都会新建一个会影响性能可能引发资源泄漏。
再写一个经典的循环题,打印空心金字塔题 :
import java.util.Scanner;
public class starsExercise01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number of rows: ");
int n = sc.nextInt();
int i = 1;
for(i =1; i <=n; i++) {
for(int k=1; k <=n-i; k++) {
System.out.print(" ");
}
for(int j = 1; j <=2*i-1; j++) {
if(j == 1 || j == 2*i-1|| i == n) {
System.out.print("*");
}
else System.out.print(" ");
}
System.out.println();
}
}
}
代码如上所示,简单运行结果如图所示,这个题当中涉及到很多数据结构数组里面的东西,还是很有意思的,可以下来好好想一下,积累了一个经典题。
三 跳转控制语句break
基本介绍:break语句一般用于终止某个语句块的执行,一般用在switch或者循环中
基本语法:
{
...
break;
...
}
注意:
- break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块。
- break语句可以指定退出哪一层,搭配标签使用,break后指定哪个lable就退出到哪里,但在实际开发当中尽量不要使用标签,如果没有指定break,默认退出最近的循环体
public class breakTest01 {
public static void main(String[] args) {
int n = 5;
labele01:for (int i = 0; i < n; i++) {
lable02:for (int j = 0; j < n; j++) {
if (j == 2) {
break;
}
}
}
}
}
如该段代码,其实默认是break lable02,但是可以明确写出break lable 01,这样就会指定退出第一层循环,结束循环了。
简单写个练习:给两个随机数进行加法,如果随机数相加大于20则输出该两个数并break。
写出代码如下:
public class breakExercise01 {
public static void main(String[] args) {
for (int i = 1; i <= 1000000000; i++) {
int x = (int)(Math.random()*100)+1;
int y = (int)(Math.random()*100)+1;
if(x+y==20){
System.out.println("x="+x+" y="+y);
break;
}
}
}
}
输出如右图所示,再未得到该结果时会持续进行循环,直到得到想要的目的数然后break。