题目描述
2024年09月第三题是: 最佳情侣身高差
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)× 1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。
输入
输入第一行给出正整数 N(≤ 10),为前来查询的用户数。
随后 N 行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。
输出
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。
样例输入
2
M 1.75
F 1.8
样例输出
1.61
1.96
接下来,Talk is cheap. Show me the code.
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define N 1005
int a[N];
int main() {
int n;
cin >> n;
while (n--) {
char g;
double h;
cin >> g >> h;
if (g == 'M') {
cout << fixed << setprecision(2) << h / 1.09 << endl;
} else if (g == 'F') {
cout << fixed << setprecision(2) << h * 1.09 << endl;
}
}
return 0;
}
分析一下
1. 头文件包含与命名空间
- 包含的头文件:
#include <iostream>
:标准输入输出流,用于cin
和cout
。#include <cmath>
:数学函数库(如sqrt
、pow
),但本代码未使用。#include <stdio.h>
:C风格的输入输出库(如printf
),但代码中未使用。#include <bits/stdc++.h>
:非标准万能头文件,包含几乎所有C++标准库,但可能导致编译时间增加和可移植性问题(如不支持MSVC编译器)。
- 命名空间:
using namespace std;
:简化了std
命名空间的使用(如直接使用cout
而非std::cout
),但可能引发命名冲突,尤其在大型项目中不推荐。
2. 变量与常量定义
- 宏定义:
#define N 1005
:定义了一个数组大小的常量,但代码中未使用该数组a[N]
,属于冗余代码。
- 数组定义:
int a[N];
:定义了一个大小为1005的整型数组,但未在代码中调用,可能是遗留代码或误写。
3. 主函数逻辑
输入与循环
cin >> n;
:读取测试用例数量n
。while (n--)
:循环处理每个测试用例。
条件判断与计算
- 输入字符与数值:
char g; double h;
:读取字符g
和双精度数h
。- 条件分支:
g == 'M'
:输出h / 1.09
,保留两位小数(如输入M 100
,输出91.74
)。g == 'F'
:输出h * 1.09
,保留两位小数(如输入F 100
,输出109.00
)。
输出格式控制
fixed
和setprecision(2)
:确保浮点数以固定格式输出,小数点后保留两位(如122.00
而非科学计数法)。
4. 潜在问题与改进建议
- 冗余代码:
- 数组
a[N]
未被使用,建议删除。
- 数组
- 头文件冗余:
<stdio.h>
和<bits/stdc++.h>
可能重复包含,且后者非标准,建议改用具体需要的头文件(如仅保留<iostream>
和<fixed>
相关的<iomanip>
)。
- 命名空间风险:
using namespace std;
可能导致命名冲突,建议显式使用std::
前缀。
- 输入验证缺失:
- 未对输入字符
g
进行有效性检查(如非M
或F
时的处理),可能导致未定义行为。 -
总结
该代码的功能是根据输入的字符(
M
或F
)对数值进行不同计算并输出两位小数结果。核心逻辑清晰,但存在冗余代码和潜在问题。优化方向包括精简头文件、移除未使用的变量,并增强输入验证。
- 未对输入字符