JavaSE学习(循环结构案例3)

文章目录

  • 前言
  • 进阶案例
    • 1.用*打出正向的三角形
    • 2.用*打出菱形
    • 3.百马百担
    • 4.统计三个班的成绩情况,以及三个班的及格人数,每个班有五名同学,求出各个班的平均分和所有班级的平均分
  • 总结

前言

这篇博文依然是循环结构的经典案例,包括打星号、百马百担、统计成绩,更加侧重于对循环嵌套的练习以及对局部变量和全局变量(案例四)的理解


进阶案例

1.用*打出正向的三角形

示意图如下所示:
JavaSE学习(循环结构案例3)_第1张图片
代码如下:

    public static void start1() {
        for (int i = 0; i < 4; i++) {//遍历星号的每一行,一共有四行
            for (int k = 0; k < 3 - i; k++) {//打空格
                System.out.print(" ");
            }
            for (int j = 0; j < 2 * i + 1; j++) {//打星号
                System.out.print("*");
            }
            System.out.println();
        }
    }

这里我们可以发现,k和j的循环条件不是一个定值,而是一个关于i的数学表达式,这是因为我们每一行需要的空格数与星号数量都不相同。


2.用*打出菱形

    public static void start3() {
        for (int i = 0; i < 4; i++) {//打出一个四行的正三角形
            for (int k = 0; k < 3 - i; k++) {
                System.out.print(" ");
            }
            for (int j = 0; j < 2 * i + 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        for (int i = 0; i < 3; i++) {//打出一个三行的正三角形
            for (int k = 0; k <= i; k++) {
                System.out.print(" ");
            }
            for (int j = 0; j < 5 - 2 * i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

菱形只需要将两个方向相反的三角形拼在一起即可

我自己想了一个快速确定关于三角形行数的数学表达式的方法,就是根据关系列出一个二元一次方程组,解出未知数即可


3.百马百担

有 100 匹马驮 100 担货物,其中大马驮 3 担,中马驮 2 担,两匹小马驮 1 担。问大马、中马和小马各有多少匹?有哪几种排列组合?

    public static void horse() {
        int n = 0;
        for (int a = 0; a <= 33; a++) {
            for (int b = 0; b <= 50; b++) {
                for (int c = 0; c <= 100; c++) {
                    if (a + b + c == 100 && 3 * a + 2 * b + 0.5 * c == 100) {
                        n++;
                        System.out.println("大马:" + a + "中马:" + b + "小马:" + c);
                    }
                }
            }
        }
        System.out.println("共有以上" + n + "种组合");
    }

要问组合有多少种,肯定要对马的数量进行排列,那么我们首先要确定大马、中马、小马最多可以有几匹,即:
大马:33、中马:50、小马100
最后在内循环中加一个选择结构就行

另一种做法就是无需对小马的数量进行遍历,直接用min=100-max-mid表示小马的数量即可


4.统计三个班的成绩情况,以及三个班的及格人数,每个班有五名同学,求出各个班的平均分和所有班级的平均分

    public static void calScore() {
        Scanner scanner = new Scanner(System.in);
        int n = 0;
        double sum1 = 0;
        for (int i = 0; i < 3; i++) {
            double sum = 0;
            System.out.println("------请输入第" + (i + 1) + "个班级的成绩------");
            for (int j = 0; j < 5; j++) {
                System.out.println("请输入第" + (j + 1) + "个同学的成绩:");
                double score = scanner.nextInt();
                if (score > 60) {
                    n++;
                }
                sum += score;
            }
            System.out.println("第"+(i+1)+"个班级的平均分是:"+sum/5);
            sum1 += sum;
        }
        System.out.println("所有班级的及格人数是:"+n);
        System.out.println("所有班级的平均分是:"+sum1/15);
    }

我想说明几点:
1.三个班级,每个班有五名同学:考虑做一个外循环遍历三个班,做内循环遍历这三个班里每个班中的五名同学;
2.关于“全局变量”和局部变量
计数器n和所有班级总成绩sum1可以看作“全局变量”,在循环外定义,当成绩大于60时,n++;当一个班的总成绩sum被计算出时,就会存到sum1里面;
而每个班级的总成绩sum属于局部变量,在外循环定义,每遍历一个新班级,sum就会被重置为零,继续统计下一个班的总成绩。

注:严格意义上并不能称n、sum1为全局变量(成员变量),这里是为了便于理解和描述


总结

循环结构很重要,要深刻理解它并学会去应用他。我觉得他的作用就是进行一些重复的工作,比如在案例四中就很好的体现了。

你可能感兴趣的:(JavaSE,java,开发语言,学习)