for循环-2

1.for循环嵌套练习

例1:打印图案

      *
    ***
  *****
*******
--------------------------------------------
public class DoubleFor001 {
    public static void main(String[] args) {
        for (int i = 1; i <= 4; i++) {
            for (int j = 1; j <= 7; j++) {
                if (j <= (8 - 2 * i)) {
                    System.out.print(" ");
                } else {
                    System.out.print("*");
                }
            }
            System.out.println("");
        }
    }
}    

或:

public class DoubleFor001 {
    public static void main(String[] args) {
        // 外层控制行,总共四行
        for (int i = 1; i < 5; i++) {
            // 内层循环控制列 负责打印空格
            for (int j = 2 * (4 - i); j > 0; j--) {

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

2.while循环

语法:

while(具有布尔值的表达式){
    //循环体
}

一般而言,需要在循环体里面去控制循环的次数
可以使用之前for中的i循环变量的写法或者break

3.for和while的区别

  1. for有3个条件,while有1个
    for可以进行循环次数的精确控制,while适用于不明确需要循环多少次的情况
  2. 趋向于结束的方式
    for使用循环变量i使得循环结束,while使用break使得循环结束

4.do…while

语法:

do{
    //循环体
}while();

注意:while()后面的;绝对不能省略

结论:\

  1. 如果判断条件为真,do循环体可以执行;\
  2. 如果判断条件为假,do循环体可以执行;最多执行一次;
    即使判断条件为假,dowhile循环也会执行一次

5.forLabel

语法:

label:for(a;b;c){
    //循环体
    break label;
}

label相当于给for循环起名字,必须符合标识符命名规范
break label:可以结束指定名称的循环

6.双层for中的break

break的执行和判断条件无关,只取决于break所在的循环.
如果break位于内层循环,提前结束内层循环
如果break位于外层循环,提前结束外层循环

练习

1.求1至1000之间满足”用3除余2;用5除余3;用7除余2”的数,且一行只打印5个数

public class Test01 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <= 1000; i++) {
            if (i % 3 == 2 && i % 5 == 3 & i % 7 == 2) {
                count++;
                if (count % 5 == 0) {
                    System.out.println(i);
                } else {
                    System.out.print(i+" ");
                }
            }
        }
    }
}

2.求1-3+5-7+ …… -99+101的值

public class Test02 {
    public static void main(String[] args) {
        int sum = 0;
        int count = 0;
        for (int i = 1; i < 102; i += 2) {
            count++;
            if (count % 2 == 0) {
                sum -= i;
            } else {
                sum += i;
            }
        }
        System.out.println(sum);
    }
}

3.打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身

public class Test03 {
    public static void main(String[] args) {
        for (int i = 100; i < 1000; i++) {
            int il = i / 100;
            int im = i / 10 % 10;
            int ir = i % 10;
            if (i == (il*il*il+im*im*im+ir*ir*ir)) {
                System.out.println(i);
            }
        }
    }
}
//!!我居然连立方和,立方差都不记得了

4.输入两个正整数m和n,求其最大公约数和最小公倍数

import java.util.Scanner;
public class Test04 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入第一个正整数");
        int m = sc.nextInt();
        System.out.println("输入第二个正整数");
        int n = sc.nextInt();
        int pro = m * n;
        // 公约数,用的是欧几里得算法(辗转相除法)
        do {
            if (n > m) {
                m = m + n;
                n = m - n;
                m = m - n;
            }//判断m,n大小,大的值给m,小的给n
            m = m % n;//大的数对小的数取余,再用小的数和余数比较,再取余,直到整除为止
        } while (m != 0);
        System.out.printf("最大公约数是%d,", n);
        // 公倍数
        int result = pro / n;
        System.out.printf("最小公倍数是%d", result);
        sc.close();
    }
}

5.百元百鸡问题:公鸡5元一只,母鸡3元一只,3只小鸡1元,如果用100元钱,买100只鸡,不佘不欠,可以买公鸡,母鸡,小鸡,各多少只。

public class Test05 {
    public static void main(String[] args) {
         for (int male = 0; male <= 20; male++) {//公鸡
            for (int female = 0; female <= 34; female++) {//母鸡
                for (int child = 0; child <= 300; child += 3) {//小鸡
                    int pay = 5 * male + 3 * female + child / 3;
                    if (pay == 100) {
                        System.out.printf("公鸡%d只,母鸡%d只,小鸡%d只", male, female, child);
                        System.out.println();
                    }
                }
            }
        }
    }
}

6.编写一个Java应用程序,用循环结构打印如下的数值列表:
N 10*N 100*N 1000*N
1 10 100 1000
2 20 200 2000
3 30 300 3000
4 40 400 4000
5 50 500 5000

public class Test06 {
    public static void main(String[] args) {
        System.out.println("N  10*N  100*N  1000*N");
        for (int n = 1; n <= 5; n++) {
            System.out.println(n + "  " + 10 * n + "  " + 100 * n + "  " + 1000 * n);
        }
    }
}

7.打印2到10000的所有素数,每行显示8个素数

public class Test07 {
    public static void main(String[] args) {
        int count = 0;//计数
        for (int i = 2; i <= 10000; i++) {
            boolean status = true;//给定状态
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    status = false;//有能被整除的数,状态改为false,退出循环
                    break;
                }
            }
            if (status) {//如果没有能被整除的数,及状态没被改变,为true时
                count++;//计数
                if (count % 8 == 0) {
                    System.out.println(i);
                } else {
                    System.out.print(i+" ");
                }
            }
        }
    }
}

8.商品价格表
(1)用户从控制台输入需要查询的商品编号,根据编号现实对应商品价格。
(2)循环查询商品价格 (商品名称 单价)
(3)输入n退出循环

//这是什么奇怪的题
import java.util.Scanner;
public class Test08 {
    public static void main(String[] args) {
        System.out.println("input num");
        Scanner sc = new Scanner(System.in);
        while (true) {
            String num = sc.next();
            if (num.equals("n")) {
                break;
            }
            switch (num) {
            case "101": {
                System.out.println(num + "苹果 1.5元");
                break;
            }
            case "102": {
                System.out.println(num + "Switch 4500元");
                break;
            }
            case "103": {
                System.out.println(num + "Xperia1 5999元");
                break;
            }
            default: {
                System.out.println("商品不存在");
                break;
            }
            }
        }
        sc.close();
    }
}

关于next()、nextLine()、nextInt(){target=”_blank”
rel=”noopener”}
1.nextLine()方法,不将空格看做是两个字符串的间隔,而是看作字符串的一部分,返回时,它作为String类型一并返回
输入23 24 25
输出”23 24 25”
2.使用next()方法时,将空格看作是两个字符串的间隔
输入23 24 25
输出”23”输出”24”输出”25”
3.nextInt()方法,与next()方法类似,只是它的返回值是int类型的,依旧将空格看作是两个输入的数据的间隔
输入23 24 25
输出23输出24输出25
只能输入int类型的

9.开发一个标题为”FilpFlop”的游戏程序。它从1计数到100,遇到3的倍数就替换为单词Filp,5的倍数就替换为单词Flop,既为3的倍数又为5的倍数则替换单词FilpFlop.

public class Test09 {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            if (i % 3 == 0 && i % 5 == 0) {
                System.out.println("FilpFlop");
            } else if (i % 3 == 0) {
                System.out.println("Filp");
            } else if (i % 5 == 0) {
                System.out.println("Flop");
            } else {
                System.out.println(i);
            }
        }
    }
}

面试题:
1.什么时候用for循环,什么时候用while循环
for可以进行循环次数的精确控制,while适用于不明确需要循环多少次的情况

2.while循环和do-while循环的区别
while先判断,符合条件后才执行;do-while先执行再判断,即便判断条件为假,do-while循环也会执行一次

3.break、continue、return的区别
break在for循环中退出当前层循环或指定循环,switch循环中退出循环执行下一条语句,
continue退出本次循环直接进入下一次循环,
return退出函数返回到调用位置