• 时长: 90 分钟
  • 教学目标:
    • 复习 math 模块的基本使用 (import math, math.sqrt, math.pow, math.pi)。
    • 学习 math 模块中更多实用的数学函数和常量(例如:math.ceil, math.floor, math.fabs)。
    • 理解“算法”在解决问题中的概念(即:解决问题的步骤和方法)。
    • 练习使用列表和字典来组织需要进行数学计算的数据。
    • 掌握如何结合 math 模块、数据结构(列表、字典)、循环、条件判断和函数来解决需要多步骤计算的问题。
    • 提高分析问题、分解问题、设计解决步骤(算法)的能力。

课程内容

1. 复习与引入 (10 分钟)

  • 复习: 快速回顾我们之前学过的模块是什么(别人写好的代码,我们可以导入使用),以及 datetimeos 模块的一些简单功能。回顾列表和字典这两种数据结构如何存储多个数据。
  • 提出问题: 老师提问:“上次我们用模块让程序知道时间和日期,或者操作文件和文件夹。Python 还有很多其他的‘工具箱’模块。比如,如果我想计算一个数的平方根怎么办?我想精确地使用圆周率怎么办?” “我们学了列表和字典来存数据,学了循环和判断来处理数据。但面对一个稍微复杂一点的问题,比如计算几个点的距离,或者分析一组温度数据,怎么一步一步地思考和写代码呢?这就要用到‘算法’了。”
  • 引出新知识: 今天我们深入学习一个非常重要的数学“工具箱”—— math 模块,它提供了很多数学计算的功能。同时,我们会学习如何把数学计算、数据结构和我们学过的控制结构结合起来,解决一些实际问题。解决问题的步骤,就是我们说的“算法”。

2. 更深入地使用 math 模块 (20 分钟)

  • 复习 import math: 首先要导入 math 模块才能使用里面的功能。
    import math
    
  • 复习常用功能:
    • 平方根:math.sqrt(数字)
      print(math.sqrt(9)) # 结果是 3.0
      print(math.sqrt(2)) # 结果是 1.414...
      
    • 幂运算:math.pow(底数, 指数) (和 ** 类似,但结果总是浮点数)
      print(math.pow(2, 3)) # 结果是 8.0
      print(math.pow(5, 2)) # 结果是 25.0
      
    • 圆周率:math.pi (一个非常精确的圆周率值)
      radius = 5
      area = math.pi * math.pow(radius, 2) # 计算圆的面积
      print("圆的面积是:", area)
      
  • 学习新的实用函数:
    • 向上取整:math.ceil(数字) (返回大于或等于该数字的最小整数)
      print(math.ceil(3.14)) # 结果是 4
      print(math.ceil(3.9))  # 结果是 4
      print(math.ceil(3.0))  # 结果是 3
      
    • 向下取整:math.floor(数字) (返回小于或等于该数字的最大整数)
      print(math.floor(3.14)) # 结果是 3
      print(math.floor(3.9))  # 结果是 3
      print(math.floor(3.0))  # 结果是 3
      
    • 绝对值:math.fabs(数字) (返回数字的绝对值,结果总是浮点数)
      print(math.fabs(-10)) # 结果是 10.0
      print(math.fabs(10))  # 结果是 10.0
      
  • 动手实践: 学生尝试使用 math.ceil(), math.floor(), math.fabs() 处理一些数字,观察结果。 使用 math.pi 计算一个不同半径的圆的周长(周长 = 2 * π * 半径)。

3. 用数据结构组织数学问题中的数据 (15 分钟)

  • 为什么要组织数据: 在解决实际问题时,我们经常需要处理一组相关的数字或信息。把它们存到列表或字典里,可以更方便地进行计算和管理。
  • 列表的应用: 列表很适合存储一系列同类的数据,比如:
    • 一组测量值:measurements = [1.5, 2.3, 1.8, 2.0]
    • 一个数列:numbers = [4, 9, 16, 25]
  • 字典的应用: 字典很适合存储有“标签”或有关联的数据,比如:
    • 一个点的坐标:point_a = {'x': 3, 'y': 4}
    • 物体的属性:item = {'weight': 50, 'height': 1.2}
  • 回顾访问方式: 复习如何通过索引访问列表元素 列表[索引],如何通过键访问字典值 字典[键]字典.get(键),以及如何用 for 循环遍历列表和字典的键值对。

4. 解决问题:思考“步骤” (算法初步) (25 分钟)

  • 什么是算法? 简单来说,算法就是解决一个问题的详细步骤方法。就像做蛋糕有步骤、搭积木有步骤一样,编程解决问题也需要一步一步来。
  • 问题示例:计算平面上两点之间的距离。 假设我们知道两个点 A 和 B 的坐标 (x1, y1) 和 (x2, y2)。
    • 数学公式: 距离 = √((x2 – x1)² + (y2 – y1)²)
    • 思考步骤 (算法):
      1. 确定点 A 和点 B 的坐标值 (x1, y1, x2, y2)。
      2. 计算 x 方向的差值 dx = x2 - x1
      3. 计算 y 方向的差值 dy = y2 - y1
      4. 计算 dx 的平方 dx_squared = dx * dxmath.pow(dx, 2)
      5. 计算 dy 的平方 dy_squared = dy * dymath.pow(dy, 2)
      6. 将 dx 的平方和 dy 的平方相加 sum_of_squares = dx_squared + dy_squared
      7. 计算 sum_of_squares 的平方根 distance = math.sqrt(sum_of_squares)
      8. 打印结果 distance。
  • 用代码实现这个算法: 我们将使用函数把这段计算逻辑封装起来,使用字典来存储点的坐标,使用 math 模块进行计算。
    import math
    
    # 定义一个函数来计算两点距离
    # 参数 p1 和 p2 是字典,例如 {'x': 3, 'y': 4}
    def calculate_distance(p1, p2):
        # 1. 获取坐标值
        x1 = p1.get('x', 0) # 使用 .get() 更安全,如果键不存在默认给 0
        y1 = p1.get('y', 0)
        x2 = p2.get('x', 0)
        y2 = p2.get('y', 0)
    
        # 2. 计算差值
        dx = x2 - x1
        dy = y2 - y1
    
        # 3 & 4. 计算差值的平方
        dx_squared = math.pow(dx, 2)
        dy_squared = math.pow(dy, 2)
    
        # 5. 计算平方和
        sum_of_squares = dx_squared + dy_squared
    
        # 6. 计算平方根 (距离)
        distance = math.sqrt(sum_of_squares)
    
        # 返回距离结果
        return distance
    
    # --- 主程序部分 ---
    # 定义两个点的坐标 (使用字典)
    point_a = {'x': 3, 'y': 4}
    point_b = {'x': 6, 'y': 8}
    
    # 调用函数计算距离
    dist_ab = calculate_distance(point_a, point_b)
    
    # 打印结果
    print(f"点 A 的坐标是 {point_a}")
    print(f"点 B 的坐标是 {point_b}")
    print(f"点 A 和点 B 之间的距离是: {dist_ab}") # 结果应该是 5.0
    
    # 尝试计算其他点之间的距离
    point_c = {'x': 0, 'y': 0}
    point_d = {'x': 5, 'y': 0}
    dist_cd = calculate_distance(point_c, point_d)
    print(f"点 C 和点 D 之间的距离是: {dist_cd}") # 结果应该是 5.0
    
  • 引导与讨论: 带领学生一步步理解算法的每个步骤如何转换为代码。强调如何使用字典来组织点的坐标,如何使用 math 模块,以及如何用函数把这段逻辑打包。

5. 解决问题:结合数据结构、循环和数学 (15 分钟)

  • 问题示例:计算列表中所有大于 10 的数字的平方根的平均值。
    • 思考步骤 (算法):
      1. 准备一个列表,里面有一些数字。
      2. 初始化一个变量来累加符合条件的数字的平方根的总和,初始值为 0。
      3. 初始化一个变量来计数符合条件的数字有多少个,初始值为 0。
      4. 遍历列表中的每一个数字。
      5. 对于每个数字,判断它是否大于 10。
      6. 如果数字大于 10:
        • 计算这个数字的平方根(使用 math.sqrt)。
        • 将平方根加到总和变量里。
        • 计数器变量加一。
      7. 遍历结束后,检查计数器是否大于 0 (避免除以零)。
      8. 如果计数器大于 0,计算平均值:总和除以计数。
      9. 如果计数器等于 0,说明没有符合条件的数字,平均值可以设为 0 或者打印提示信息。
      10. 打印计算得到的平均值。
  • 用代码实现这个算法:
    import math
    
    # 定义一个函数来计算符合条件的数字的平方根的平均值
    # 参数 numbers_list 是数字列表,threshold 是阈值(比如 10)
    def average_sqrt_of_filtered_numbers(numbers_list, threshold):
        sum_of_sqrt = 0     # 初始化平方根总和
        count_filtered = 0  # 初始化符合条件的数字计数
    
        # 遍历列表中的每个数字
        for num in numbers_list:
            # 判断数字是否大于阈值
            if num > threshold:
                # 计算平方根(先检查数字是否非负,虽然这个例子假定数字是正的)
                if num >= 0:
                    sqrt_val = math.sqrt(num)
                    sum_of_sqrt = sum_of_sqrt + sqrt_val # 累加平方根
                    count_filtered = count_filtered + 1  # 计数加一
                # else: # 如果数字小于0,平方根是复数,这里忽略或者特殊处理
    
        # 计算平均值
        average = 0.0 # 默认平均值为 0.0
        if count_filtered > 0: # 避免除以零
            average = sum_of_sqrt / count_filtered
    
        # 返回平均值
        return average
    
    # --- 主程序部分 ---
    my_numbers = [15, 4, 20, 8, 12, 5, 25]
    filter_threshold = 10
    
    # 调用函数计算平均值
    avg = average_sqrt_of_filtered_numbers(my_numbers, filter_threshold)
    
    # 打印结果
    print(f"数字列表: {my_numbers}")
    print(f"只计算大于 {filter_threshold} 的数字的平方根的平均值")
    print(f"计算结果: {avg:.2f}") # 格式化输出两位小数
    
  • 引导与讨论: 带领学生理解如何用循环遍历列表,用条件判断进行筛选,用累加器计算总和和个数,最后计算平均值。强调这是把多种编程结构组合起来解决问题。

6. 课堂练习 (15 分钟)

让学生独立完成以下练习:

  • 练习 1: 编写一个程序,计算并打印一个直角三角形斜边的长度。让用户输入两条直角边的长度(可能是小数)。斜边长度公式:sqrt(a² + b²)。(提示:使用 math.sqrtmath.pow**)。
    import math
    # TODO: 获取用户输入的直角边 a 和 b 的长度 (转换为浮点数)
    # TODO: 计算斜边长度
    # TODO: 打印结果
    
  • 练习 2: 编写一个程序,有一个数字列表 temperatures = [25.5, 26.0, 24.8, 27.1, 23.9]。计算并打印列表中所有温度的平均值和最高温度。(提示:使用 sum()len() 计算平均值,使用 max() 找出最高温度)。
  • 练习 3: 编写一个程序,有一个商品字典 items = {"apple": 3.5, "banana": 2.0, "orange": 4.0, "grape": 6.0}。找出并打印出价格低于 3.0 元的商品名称和价格。

7. 总结与提问 (5 分钟)

  • 回顾: 回顾本节课内容:math 模块的更多实用功能 (ceil, floor, fabs),如何用列表和字典组织数学问题的数据,解决问题时的“算法”概念(步骤),以及如何把 math 模块、数据结构、循环、条件判断和函数结合起来解决综合问题。
  • 提问:
    • math.ceil(4.1)math.floor(4.9) 的结果分别是多少?
    • 计算一个负数的绝对值用什么函数?
    • 在解决两点距离问题时,我们用字典存坐标有什么好处?
    • 在解决平均平方根问题时,我们为什么要用循环和条件判断?
    • “算法”简单来说是什么?
  • 答疑: 回答学生问题。

8. 布置课后作业 (5 分钟)

  • 作业 1: 编写一个函数 calculate_cylinder_volume(radius, height),接收圆柱体的半径和高作为参数,计算并返回圆柱体的体积。(体积公式:π * 半径² * 高)。在主程序中调用函数并打印结果。
  • 作业 2: 编写一个程序,有一个数字列表 nums = [1, -2, 3, -4, 5, -6]。创建一个新的列表,将原列表中所有数字的绝对值添加到新列表中,并打印新列表。(提示:遍历原列表,使用 math.fabs() 计算绝对值,添加到新列表)。
  • 作业 3: 编写一个程序,有一个学生分数字典 grades = {"小明": 75, "小红": 92, "小刚": 60, "小丽": 88, "小强": 50}。找出并打印出分数最高的学生的名字和分数。(提示:遍历字典的 items,比较分数,记录最高分和对应的名字)。
  • 作业 4: (选做) 编写一个程序,有一个数字列表。找出列表中所有能被 3 整除的数字,计算它们的总和。找出列表中所有能被 5 整除的数字,计算它们的总和。最后打印两个总和。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。