前言
本篇文章是韩顺平老师课程P135(多重循环控制练习)内容的拓展,也是韩顺平老师笔记系列04有关多重循环内容的详细展开叙述,是第五章的重点,也是难点,多重循环在实际运用中用得也是非常多的。
在这篇文章里,我们将一起实现四个案例,从分析思路出发,每一步如何实现,运行结果如何都会放出来,一步步拆解步骤,让新手小白更好体会编程思想。案例包括统计班级平均分、九九乘法表、金字塔的打印。所有完整代码我会放在每个案例分析的最后。每个案例都十分经典,所有完整代码我都会放在案例最后。
一、统计班级平均分和及格人数
-
需求一:统计3个班成绩情况,每个班有5名同学,求出每个班的平均分和所有班级的平均分,要求学生的成绩从键盘输入。
-
需求二:统计3个班及格人数,每个班有5名同学
-
思路分析:化繁为简
- 要统计三个班的情况,我们先计算一个班(5个学生)的成绩,再把同样的思路扩展到三个班(用一个for循环就可以解决)
- 1.1 创建Scanner对象,接受输入成绩
- 1.2 要得到该班级平均分,先定义一个double sum的变量用来存放一个班五个学生成绩的总和,用sum/5就可以了
- 统计三个班每个班的总分和平均分(实现二重循环)
- 2.1 加入三个班级的循环(外层再加一个班级for循环1-3)
for(int i = 1; i <= 3; i++) { }//i表示班级1-3
for(int j = 1; j <= 5; j++) { }//j表示学生1-5
- 2.1 加入三个班级的循环(外层再加一个班级for循环1-3)
- 统计所有班的平均分
- 3.1 定义一个变量double totalScore 累计三个班所有学生的成绩总分
- 3.1 定义一个变量double totalScore 累计三个班所有学生的成绩总分
- 统计三个班的及格人数
- 4.1 定义变量 int passNum用来记录及格的人数
- 4.2 如果成绩 >= 60,这个人数就+1
- 要统计三个班的情况,我们先计算一个班(5个学生)的成绩,再把同样的思路扩展到三个班(用一个for循环就可以解决)
-
完整代码实现:
import java.util.Scanner;
public class MulForExercise1{
public static void main(String[] args) {
//思路分析:
//1. 要统计三个班的情况,我们先计算一个班(5个学生)的成绩,再把同样的思路扩展到三个班(for)
//1.1 创建Scanner对象,接受输入成绩
//1.2 要得到该班级平均分,先定义一个double sum的变量
// 用来存放一个班五个学生成绩的总和
//2. 统计每个班的总分
//2.1 加入每个班级的循环(外层再加一个班级for循环)
//3. 统计所有班的平均分
//3.1 定义一个变量double totalScore 累计三个班所有学生的成绩总分
//4. 统计三个班的及格人数
//4.1 定义变量 int passNum用来记录及格的人数
//4.2 如果成绩 >= 60,这个人数就+1
//5. 优化
//创建Scanner对象,由于成绩这个变量会在整个代码里反复使用
//放在for循环外面,作为全局变量使用
Scanner myScanner = new Scanner(System.in);
double sum = 0;//一个班五个学生的总分
double totalScore = 0;//三个班所有学生的成绩总分
int passNum = 0;//定义变量 int pass用来记录及格的人数
//2.1 加入三个班级的循环
for(int i = 1; i <= 3; i++) { //i表示班级1-3
for(int j = 1; j <= 5; j++) { //j表示学生1-5
//1.1 提示根据顺序输入学生成绩
//2.1 加入每个班级的循环
System.out.println("请输入第" + i + "个班第" + j + "个学生的成绩:");
double score = myScanner.nextDouble();
//4.2 如果成绩 >= 60,这个人数就+1
if(score >= 60) {
passNum++;
}
//1.2 累计和
sum += score;
System.out.println("成绩为:" + score);
}
//1.2 因为sum是五个学生的总成绩,求一个班的平均分,用sum/5就可以了
System.out.println("第" + i + "班的总分为:" + sum + "平均分为:" + (sum / 5));
//3.1 把sum累积到总分
totalScore += sum;
}
System.out.println("所有班的总分为:" + totalScore + "平均分为:" + (totalScore / 15));
System.out.println("及格人数为:" + passNum);
}
}
- 运行结果展示:
练习1 完成。
二、打印九九乘法表
-
预期实现效果为
-
先构建第一层循环,实现第一竖列的1 * x = y
-
实现横向乘法表,再次在外部构建一个循环
- 注意乘法表横向来看,乘法符号前面的数总是小于等于乘法符号后面的数,也就是说,当表达式为a*b时,a总是<=b
- 为了得到理想的打印效果,我们需要让代码在每次一横排打印完成后再进行换行,相邻的横向表达式输出后用制表符\t进行对齐
- 注意乘法表横向来看,乘法符号前面的数总是小于等于乘法符号后面的数,也就是说,当表达式为a*b时,a总是<=b
-
最终代码实现
//打印九九乘法表
public class MulForExercise2{
public static void main(String[] args) {
//创建变量int result,存储乘法的结果
int result;
//第二层循环,实现横向的乘法表打印
for(int b = 1; b <= 9; b++) {
//先构建第一层循环,实现第一竖列的1-9打印
//注意乘法表横向来看,前面的数总是小于等于乘法符号后面的数
for(int a = 1; a <= b; a++) {
result = a * b;
//横向打印不换行,用print
System.out.print( a + " * " + b + " = " + result + "\t");
}
//每一横排打印结束后要换行,用println
System.out.println();
}
}
}
- 运行结果
练习2完成。
三、打印实心金字塔
-
思路分析:化繁为简
-
打印一个矩形
-
打印半个金字塔
-
打印完整实心金字塔
-
调格式,每一行在输出之前都要先输入一定数量的空格,保证居中
-
完整代码:
public class MulForExercise3{
public static void main(String[] args) {
/*
思路分析:化繁为简
1. 先打印一个矩形
*****
*****
*****
*****
*****
2. 打印半个金字塔
*
**
***
****
*****
3. 打印整个金字塔
* 第一层1个 4个空格(5-1)
*** 第二层3个 3个空格(5-2)
***** 第三层5个 2个空格(5-3)
******* 第四层7个 1个空格(5-4)
********* 第五层9个 0个空格(5-5)
每一行:2n-1个*(n为层数);总层数-当前层个空格
*/
for(int b = 1; b <= 5; b++) { //这里的b是当前层数
//在输出*之前,还要输出对应的空格保证居中,空格数=总层数-当层数
for(int k = 5-b; k >= 0; k--) {
System.out.print(" ");
}
//这里的a是每一行打印的*数量
for(int a = 1; a <= ((2 * b) - 1); a++) {
System.out.print("*");
}
System.out.println();
}
}
}
四、打印空心金字塔
-
在上面的打印实心金字塔的基础上继续改写代码
-
保证当前行的第一个和最后一个位置都是*
-
最后一层全部都是*,只需要加一种情况,就是层数b=5时,全部输出星号,不需要空格
-
先死后活:要求层数由人为决定,做成一个变量 int totalLevel
-
完整代码
public class MulForExercise3{
public static void main(String[] args) {
/*
4. 打印空心金字塔
* 第一层1个 当前行的第一个和最后一个位置都是*
* * 第二层2个 当前行的第一个和最后一个位置都是*
* * 第三层2个 当前行的第一个和最后一个位置都是*
* * 第四层2个 当前行的第一个和最后一个位置都是*
********* 第五层9个 全部输出
每一行:2n-1个*(n为层数);总层数-当前层个空格
5. 先死后活
要求层数由人为决定,做成一个变量
*/
int totalLevel = 10;//总层数
for(int b = 1; b <= totalLevel; b++) { //这里的b是当前层数
//在输出*之前,还要输出对应的空格保证居中,空格数=总层数-当层数
for(int k = totalLevel-b; k >= 0; k--) {
System.out.print(" ");
}
//这里的a是每一行打印的*数量
for(int a = 1; a <= 2 * b - 1; a++) {
//当前行的第一个和最后一个位置都是*,最后一层全部都是*
if(a == 1 || a == 2 * b - 1 || b == totalLevel) {
System.out.print("*");
} else { //其他情况输出空格
System.out.print(" ");
}
}
System.out.println();
}
}
}
至此,一个灵活的空心金字塔就写完了,也可以把层数做成可以人为输入的变量(用Scanner),再试试效果,这样对编程的灵活变通性也会有更好的了解~
总结
在这篇笔记里,我们实现了四个案例,包括统计班级平均分、九九乘法表、金字塔的打印,挖掘核心思想,是韩顺平老师笔记系列04有关多重循环内容的详细展开叙述。