一、For循环结构的使用

一、循环结构的4要素(三种循环结构)
(1)初始化条件
(2)循环条件 ---->是boolean类型
(3)循环体
(4)迭代条件

二、for循环的结构

for(1;2;4){
     3
 }
  执行过程:1->2->3->4->2->3->->4...->2
//练习:
int num =1;
for (System.out.println('a');num<=3; System.out.println('c'),num++){
    System.out.println('b');
}
//输出结果:abcbcbc

举例:

* 输入两个正整数m和n,求其最大公约数和最小公倍数
* 比如: 12和20的最大公约数是4,最小公倍数是60
*
* 说明:break关键字的作用
Scanner scan= new Scanner(System.in);
System.out.println("请输入第一个正整数: ");
int m = scan.nextInt();
System.out.println("请输入第二个正整数: ");
int n = scan.nextInt();

int min =m<n?m:n;

for (int i=min;i>1;i--){
    if (m%i==0&&n%i==0){
        System.out.println("最大公约数: "+i);
        break;
        //一旦在循环中执行到break,就跳出循环
    }
}

//获取最小公倍数
//1.获取两个数中的较大值
int max=m>n?m:n;
//2.遍历
for (int i =max;i<=m*n;i++){
    if (i%m==0&& i%n==0){
        System.out.println("最小公倍数: "+i);
        break;
    }
}

二、while循环的结构

一、循环结构的4要素(三种循环结构)
(1)初始化条件
(2)循环条件 ---->是boolean类型
(3)循环体
(4)迭代条件
二、while循环的结构

(1)
while(2){
     3;
     4;
 }
执行过程:1->2->3->4->2->3->4->...->2

说明:
1.写while循环千万小心不要丢迭代条件。一旦丢了,就可能导致死循环
2.我们写程序,要避免出现死循环
3.for循环和while循环是可以相互转换的!

区别:for循环和while循环的初始化条件部分(1)的作用范围不同

算法:有限性

//遍历100以内的所有偶数
int i =1;
while (i<=100){
    if (i%2==0){
        System.out.println(i);
    }
    i++;
}
//出了while循环以后,仍可以调用
System.out.println(i);
//101

三、do-while循环结构

一、循环结构的4要素(三种循环结构)
(1)初始化条件
(2)循环条件 ---->是boolean类型
(3)循环体
(4)迭代条件

(1)
  do{
      3;
      4;
  }while(2)
 执行过程:1->3->4->2->3->4->....->2

说明;
1.do-while循环至少会执行一次循环体!
2.开发中,使用for和while更多一些,较少使用do-while

//遍历100以内的偶数,并计算所有偶数的和及偶数的个数
int num =1;
//记录总和
int sum=0;
//记录个数
int count=0;

do{
    if (num % 2==0){
        System.out.println(num);
        sum+=num;
        count++;
    }
    num++;
}while (num<=100);
System.out.println("总和为: "+sum);
System.out.println("个数为: "+count);

//***************体会do-while至少执行一次循环体***************
//多次的时候没有区别,单个的时候do-while至少执行一次
int number1 = 10;
while (number1 >10){
    System.out.println("hello:while");
    number1--;
}

int number2 = 10;
do{
    System.out.println("hello:do-while");
    number2--;
}while (number2 >10);

四、嵌套循环的使用

1、嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
2
外层循环:循环结构B
内层循环:循环结构A
3、说明:
(1)内层循环结构遍历一遍,只相当于外层循环循环体执行了一次
(2)假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
4.技巧:
外层循环控制行数,内层循环控制列数

//******
//System.out.println("******");
for (int i =1;i<=6;i++){
    System.out.print('*');
}
/*
 ******
 ******
 ******
 ******
 */
for (int j =1;j<=4;j++){
    for (int i =1;i<=6;i++){
        System.out.print('*');
    }
    System.out.println();
}
/*  i(行数)  j(*的个数)
 *      1          1
 **     2          2
 ***    3          3
 ****   4          4
 ****** 5          5
 */
//控制行数
for (int i=1;i<=5;i++){
    //控制列数
    for (int j =1;j<=i;j++){
        System.out.print('*');
    }
    System.out.println();
}
/*     i(行数)  j(*的个数)  规律:i+j=5 换句话说:j=5-i;
 ****     1         4
 ***      2         3
 **       3         2
 *        4         1
  */
//控制行数
for (int i=1;i<=4;i++){
    //控制列数
    for (int j =1;j<=5-i;j++){
        System.out.print('*');
    }
    System.out.println();
}

五、break和continue关键字的使用

使用范围            循环中使用的作用(不同点)     相同点
 break:       switch-case          结束当前循环             关键字后面不能声明执行语句
               循环结构中
               
continue:      循环结构中           结束当次循环             关键字后面不能声明执行语句

举例:

for (int i =1;i<=10;i++){
    if (i%4==0){
        //break;//123
        continue;
        //123567910
        //System.out.println("aaaa");//编译报错
    }
    System.out.print(i);
}
System.out.println();
//********************************

label:for (int i = 1; i <=4 ; i++) {
    for (int j = 1; j <=10 ; j++) {
        if (j%4==0){
            //break;//默认跳出包裹关键字最近的一层循环
            //continue;

            //break label;//结束指定标识的一层循环结构
            continue label;//结束指定标识的一层循环结构的当次循环
        }
        System.out.print(i);
    }
    System.out.println();
}

六、练习

题目1;从键盘读入不确

定的整数,并判断读入的正数和负数的个数,输入为0时结束程序
说明:
1.不在循环条件部分限制次数的结构:for(;;)或者while(true)
2.结束循环有几种方式?
方式一:循环条件部分返回false
方式二:在循环体中,执行break

Scanner scan=new Scanner(System.in);
//记录正数的个数
int positiveNumber =0;
//记录负数的个数
int negativeNumber =0;

for(;;){//while (true){
    int number = scan.nextInt();
    //判断number的正负情况
    if (number>0){
        positiveNumber++;
    }else if (number<0){
        negativeNumber++;
    }else {
        //一旦执行break,跳出循环
        break;
    }
}
System.out.println("输入的正数个数为: "+positiveNumber);
System.out.println("输入负数的个数为: "+negativeNumber);

题目2:九九乘法表

1*1=1
 2*1=2 2*2=4
 ...
 9*1=9 ...9*9=81

for(int i=1;i<=9;i++){
    for (int j=1;j<=i;j++){
        System.out.print(i+" * "+j+" = "+(i*j)+"  ");
    }
    System.out.println();
}

题目3:
输出100以内的质数:只能被1和它本身整除的数,2是最小的质数

long start=System.currentTimeMillis();
//标识i是否被j除尽,一旦除尽,修改其值
boolean isFlag=true;
//遍历100以内的自然数
for (int i =2;i<=100000;i++){
    //j被i去除
    //优化二:根号
    for (int j=2;j<Math.sqrt(i);j++){
        //i被j除尽
        if (i%j==0){
            isFlag=false;
            //优化1:只对本身非质数是自然数是有效的
             break;
        }
    }
    if (isFlag==true){
        System.out.println(i);
    }
    //重置isFlag
    isFlag=true;
}
long end =System.currentTimeMillis();
System.out.println("所花费的时间为: "+(end - start));
//优化前:12965  加上break优化后:1107