从零开始学Java——多重循环的应用保姆级拆分讲解:统计班级平均分、打印九九乘法表、实心金字塔和空心金字塔的实现


前言

本篇文章是韩顺平老师课程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
        在这里插入图片描述
    • 统计所有班的平均分
      • 3.1 定义一个变量double totalScore 累计三个班所有学生的成绩总分
        在这里插入图片描述
    • 统计三个班的及格人数
      • 4.1 定义变量 int passNum用来记录及格的人数
      • 4.2 如果成绩 >= 60,这个人数就+1
        在这里插入图片描述
  • 完整代码实现:

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进行对齐
  • 最终代码实现

//打印九九乘法表
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有关多重循环内容的详细展开叙述。

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建立一个BBS论坛需要考虑以下几个方面: 1. 确定论坛类型和功能 2. 设计数据库结构 3. 编写前端界面 4. 编写后端逻辑 5. 部署和维护 下面是一个从零开始基于Python开发BBS论坛的保姆: 1. 确定论坛类型和功能 首先要确定你要创建的论坛类型和功能。是一个简单的问答论坛,还是一个社区论坛,还是一个资讯论坛?你需要确定你要实现的功能,例如用户注册、登录、发帖、回复、私信、搜索等等。 2. 设计数据库结构 我们需要设计数据库来存储用户信息、论坛帖子、回复等数据。可以使用MySQL、SQLite等关系型数据库。设计数据库结构时需要考虑到数据的关联性和一致性。 3. 编写前端界面 接下来,我们需要设计前端界面,包括网页布局、样式和交互效果。可以使用HTML、CSS和JavaScript等技术来实现。建议使用Bootstrap等前端框架来快速搭建界面。 4. 编写后端逻辑 编写后端逻辑需要使用Python开发框架,比如Django、Flask等。后端逻辑包括用户认证、数据读写、业务逻辑等。我们需要根据前端界面设计API接口,通过Python编写后端逻辑来实现这些功能。 5. 部署和维护 最后,我们需要将BBS论坛部署到服务器上,并对其进行维护。可以选择使用云服务器,比如AWS、阿里云等。并且需要定期更新代码、备份数据和优化性能等。 总结: 以上就是基于Python开发BBS论坛的保姆。需要注意的是,BBS论坛涉及到用户隐私和数据安全等问题,需要谨慎处理。另外,由于开发BBS论坛需要包括前端、后端和数据库等多个方面的知识,所以建议有一定的编程经验的人才尝试开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值