题解:学而思编程 平均数
【题目来源】
学而思编程:平均数
【题目描述】
读取 \(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
【核心思想】
-
问题分析:给定四个浮点数 \(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\) 并重新判定。这是一个加权计算 + 条件分支模拟问题,关键在于精确的分层判定和浮点格式化输出。
-
算法选择:
- 加权平均计算:按给定权重系数直接计算加权平均值
- 分层条件分支:按 \(X \ge 7.0\)、\(X < 5.0\)、\(5.0 \le X < 7.0\) 三层嵌套判定,处理不同输出逻辑
-
关键步骤:
- 读取输入:读取 \(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(保留一位小数)
- 输出
- 若 \(X \ge 7.0\):输出
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),仅涉及固定次数的算术运算和条件判断
- 空间复杂度:\(O(1)\),仅使用少量浮点变量
-
条件分支模拟的核心思想:
- 权重归一化:权重总和为 \(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
浙公网安备 33010602011771号