题解:学而思编程 平均数

【题目来源】

学而思编程:平均数

【题目描述】

读取 \(4\) 个数字 \(N1,N2,N3,N4\),这 \(4\) 个数字都是保留 \(1\) 位小数的浮点数,对应于学生获得的 \(4\) 个分数。

\(4\) 个分数的权重分别为 \(2,3,4,1\),请你计算学生成绩的平均值 \(X\) 并输出 Media: X。其中,学生平均成绩\(=(2∗N1+3∗N2+4∗N3+N4)/10\)

接下来分为以下三种情况:

如果平均值为 \(7.0\) 或更高,则输出 Aluno aprovado.

如果平均值小于 \(5.0\),则输出 Aluno reprovado.

如果平均值大于等于 \(5.0\) 并且小于 \(7.0\),则输出 Aluno em exame.,并再读取一个数字 \(Y\),然后输出 Nota do exame: Y。接下来重新计算平均值 \(Z=(X+Y)/2\),如果 \(Z\) 大于或等于 \(5.0\),则输出 Aluno aprovado.,否则输出 Aluno reprovado.。最后输出 Media final: Z,表示学生的最终成绩。

【输入】

输入中包含四个浮点数,表示学生的四个成绩。

也有部分满足情况 \(3\) 的数据,多包含一个浮点数

【输出】

输出的结果均保留 \(1\) 位小数,具体形式参照题目描述和输出样例。

【输入样例】

2.0 4.0 7.5 8.0
6.4

【输出样例】

Media: 5.4
Aluno em exame.
Nota do exame: 6.4
Aluno aprovado.
Media final: 5.9

【核心思想】

  1. 问题分析:给定四个浮点数 \(N_1, N_2, N_3, N_4\) 及其权重 \(2, 3, 4, 1\),计算加权平均值 \(X = (2N_1 + 3N_2 + 4N_3 + N_4)/10\)。根据 \(X\) 的范围分三种情况输出判定结果;若 \(5.0 \le X < 7.0\),还需读取补考成绩 \(Y\),计算最终平均 \(Z = (X + Y)/2\) 并重新判定。这是一个加权计算 + 条件分支模拟问题,关键在于精确的分层判定和浮点格式化输出。

  2. 算法选择

    • 加权平均计算:按给定权重系数直接计算加权平均值
    • 分层条件分支:按 \(X \ge 7.0\)\(X < 5.0\)\(5.0 \le X < 7.0\) 三层嵌套判定,处理不同输出逻辑
  3. 关键步骤

    • 读取输入:读取 \(N_1, N_2, N_3, N_4\)(浮点数)
    • 计算加权平均
      • \(X \leftarrow (2 \times N_1 + 3 \times N_2 + 4 \times N_3 + N_4) / 10\)
    • 输出 \(X\):使用 %.1lf 格式保留一位小数
    • 三层判定
      • \(X \ge 7.0\):输出 Aluno aprovado.
      • 否则若 \(X < 5.0\):输出 Aluno reprovado.
      • 否则(\(5.0 \le X < 7.0\)):
        • 输出 Aluno em exame.
        • 读取补考成绩 \(Y\)
        • 输出 Nota do exame: Y(保留一位小数)
        • 计算最终成绩:\(Z \leftarrow (X + Y) / 2\)
        • \(Z \ge 5.0\):输出 Aluno aprovado.
        • 否则:输出 Aluno reprovado.
        • 输出 Media final: Z(保留一位小数)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),仅涉及固定次数的算术运算和条件判断
    • 空间复杂度:\(O(1)\),仅使用少量浮点变量
  5. 条件分支模拟的核心思想

    • 权重归一化:权重总和为 \(2+3+4+1=10\),直接除以 \(10\) 即得加权平均,无需额外归一化计算
    • 严格分层判定:使用 if-else if-else 结构确保三种情况互斥执行,判定顺序从高分段到低分段,避免区间重叠
    • 补考流程嵌入:第三种情况内部嵌套完整的补考处理流程(输入→输出→计算→再判定→输出),形成自包含的子逻辑块
    • 浮点输出精度:全程使用 %.1lf 控制保留一位小数,确保输出格式与题目要求一致,避免默认精度导致的显示差异
    • 适用于评分系统模拟、多条件分支处理、加权统计计算类问题

【解题思路】

【算法标签】

模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int main()
{
    // 定义变量并输入四个成绩
    double a, b, c, d;
    cin >> a >> b >> c >> d;

    // 计算加权平均成绩(权重分别为2,3,4,1)
    double x = (2 * a + 3 * b + 4 * c + d) / 10;

    // 输出平均成绩,保留1位小数
    printf("Media: %.1lf\n", x);

    // 判断学生成绩状态
    if (x >= 7.0)
    {
        // 平均分≥7.0,直接通过
        cout << "Aluno aprovado." << endl;
    }
    else if (x < 5.0)
    {
        // 平均分<5.0,直接不通过
        cout << "Aluno reprovado." << endl;
    }
    else
    {
        // 5.0≤平均分<7.0,需要补考
        cout << "Aluno em exame." << endl;

        // 输入补考成绩
        double y;
        cin >> y;
        printf("Nota do exame: %.1lf\n", y);

        // 计算最终成绩(原成绩和补考成绩的平均)
        double z = (x + y) / 2;

        // 判断补考后是否通过
        if (z >= 5.0)
        {
            cout << "Aluno aprovado." << endl;
        }
        else
        {
            cout << "Aluno reprovado." << endl;
        }

        // 输出最终成绩
        printf("Media final: %.1lf\n", z);
    }

    return 0;
}

【运行结果】

2.0 4.0 7.5 8.0
Media: 5.4
Aluno em exame.
6.4
Nota do exame: 6.4
Aluno aprovado.
Media final: 5.9
posted @ 2026-07-05 17:19  团爸讲算法  阅读(9)  评论(0)    收藏  举报