前言
这篇博文依然是循环结构的经典案例,包括打星号、百马百担、统计成绩,更加侧重于对循环嵌套的练习以及对局部变量和全局变量(案例四)的理解
进阶案例
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为全局变量(成员变量),这里是为了便于理解和描述
总结
循环结构很重要,要深刻理解它并学会去应用他。我觉得他的作用就是进行一些重复的工作,比如在案例四中就很好的体现了。