【老韩b站视频p133-136】
1. 多重循环【重难点】
1.1 什么是多重循环
- 将一个循环放在另一个循环里面,就形成了嵌套循环。【老韩建议一般使用2层,最多不要超过 3 层。否则,可读性很差】
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的外层循环。
- 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
1.2 步骤分析(老韩的内存分析法)
请分析下面的多重循环执行步骤, 并写出输出 => 韩老师的内存分析法
1.3 应用练习
- 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
- 统计三个班及格人数,每个班有5名同学。
- 打印出九九乘法表。
【化繁为简,缝缝补补,先死后活】
public class MulFor {
public static void main(String[] args) {
//1. 统计3个班成绩情况,每个班有5名同学
//求出各个班的平均分和所有班级的平均分。
//2. 统计三个班及格人数,每个班有5名同学。
//
//思路:
//(1)先计算一个班,5个学生的成绩和平均分。
//1.1 创建一个Scanner对象来接收用户输入。
//1.2 计算平均分,需要sum
//(2)统计3个班(每个班5个学生)的平均分。
//(3) 计算所有班级的平均分,定义double来累积所欲学生的成绩。
//(4)统计3个班的几个人数
//定义一个变量,int passNum = 0;>= 60,就++。【接收成绩就马上判断】
Scanner myScanner = new Scanner(System.in);
double totalSum = 0; //3个班级总分数
int passNum = 0; //累计及格人数
int classNum = 3; //班级数
int stdNum = 5; //学生数
for(int i = 1; i <= classNum; i++){
//i表示班级,j表示学生。
double sum = 0; //每个班的总分。
for(int j = 1; j <= stdNum; j++){//5个学生
System.out.println("请输入第1个班的第" + j + "个学生的成绩");
double score = myScanner.nextDouble();
//成绩输入进来就马上判断,是否>= 60
if(score >= 60){
passNum++;
}
sum += score;
System.out.println("成绩为" + score);
}
totalSum += sum;
System.out.println("sum=" + sum + "平均分" + (sum / stdNum));
}
System.out.println("totalSum=" + totalSum + "总平均分=" + (totalSum / (classNum * stdNum)));
System.out.println("及格人数=" + passNum);
//3. 打印出九九乘法表。
//打印1-9
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= i; j++){
System.out.println(j + "*" + i + "=" + (i * j));
}
}
}
}
1.4 经典案例 - 打印金字塔
- 请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔【用for循环】。
- 注意⚠️:
- System.out.print()里的print不写ln表示不换行,写了表示print完就换行。
- System.out.print(“\n”) == System.out.println()。因为println打印完本身就会换行。
public class Stars {
public static void main(String[] args) {
//请编写一个程序,可以接收一个整数,表示层数(totalLevel),
//打印出金字塔【用for循环】。
/*
思路分析:
化繁为简
1. 先打印一个矩形5*5
*****
*****
*****
*****
*****
2. 打印半个金字塔。
*
**
***
****
*****
3. 打印整个实心金字塔【2n - 1】
要考虑空格
* //第1层有1个* 【4个空格】(总层数 - 1)
*** //第2层有3个* 【3个空格】(总层数 - 2)
***** //第3层有5个* 【2个空格】(总层数 - 3)
******* //第4层有7个* 【1个空格】(总层数 - 4)
********* //第5层有9个* 【0个空格】(总层数 - 5)
4. 打印空心金字塔
* //第1层有1个* 【当前行的第一个位置是*,最后一个位置也是*】
* * //第2层有2个* 【当前行的第一个位置是*,最后一个位置也是*】
* * //第3层有2个* 【当前行的第一个位置是*,最后一个位置也是*】
* * //第4层有2个* 【当前行的第一个位置是*,最后一个位置也是*】
********* //第5层有2个* 【全部输出】
5. 先死后活
常数 ---> 变量
*/
int totallevel = 5;
for(int i = 1; i <= totallevel; i++){ //i表示层数
//输出*之前要输出,输出每行的空格。
for(int k = 1; k <= totallevel-i; k++){
System.out.print(" ");
}
//输出每行的*
for(int j = 1; j<= 2 * i - 1; j++){ //j表示每层的个数
//当前行的第一个位置是*,最后一个位置也是*。最后一层全部输出
if(j == 1 || j == 2 * i - 1 || i == totallevel){
System.out.print("*"); //这里print不写ln表示不换行,写了表示print完就换行。
}else{//其他情况输出空格
System.out.print(" ");
}
}
//每打完一层的*,就换行。
System.out.println();// println本身打印完就会换行。
//或者写System.out.print("\n");也行。
}
}
}