下面逐点指出代码中**与题目要求不符或容易出错的地方**,可逐条修改调试。
下面逐点指出代码中与题目要求不符或容易出错的地方,可逐条修改调试。
❗ 主要问题汇总:
① 输入部分没有限制只读前四行
while(cin>>c){
- 这样会一直读取到 EOF,而题目明确是 只输入四行;
- 此外
cin >> c会跳过空格和回车,而样例中输入里包含空格和标点符号,你希望避开它们,这里是可行的,但建议用getline()更安全。
② 数组 sum[1005] 多余,实际只需要统计 26 个大写字母
int sum[1005];
- 实际我们只关心
'A'~'Z'所以sum[26]足够; - 后面
for(int i=0;i<1000;i++)也会遍历无意义的数据,容易越界访问。
③ 错误地 sum[i]++,影响统计真实次数
for(int i=0;i<1000;i++){
maxx=max(sum[i], maxx);
sum[i]++;
}
- 你在统计最大值的时候又把
sum[i]++了! - 这样会导致每个柱子的高度被 人为 +1,后面的打印就不准确。
④ 打印柱状图的逻辑有误,与题目格式不符
for(int i=maxx;i>1;i--){
for(int j=0;j<26;j++){
if(i==25){ ... }
- 判断
i==25来决定输出"*"还是"* "明显不合理,和 i 值没关系; - 正确方式应该是每行判断是否到最后一个需要输出星号的位置(
lastPos),否则结尾会多输出空格; - 题目要求“行末不能有多余空格”,你的实现无法保证这一点。
⑤ 最后一行字母的输出方式不一致
for(int i=0;i<25;i++){
printf("%c ", i+'A');
}
cout<<"Z";
- 这里虽然看似没问题,但建议与前面统一使用
cout; - 更重要的是:上一层输出时有可能多输出空格,导致和这行无法对齐。
✅ 建议修复方向:
sum数组只开26。- 使用
getline()读入四行。 - 正确统计最大高度。
- 打印每行时先找到这一行最后一个
*需要出现的位置,防止多余空格。 - 按照示例输出格式逐行拼接。

浙公网安备 33010602011771号