下面逐点指出代码中**与题目要求不符或容易出错的地方**,可逐条修改调试。

下面逐点指出代码中与题目要求不符或容易出错的地方,可逐条修改调试。


❗ 主要问题汇总:

① 输入部分没有限制只读前四行

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() 读入四行。
  • 正确统计最大高度。
  • 打印每行时先找到这一行最后一个 * 需要出现的位置,防止多余空格。
  • 按照示例输出格式逐行拼接。

posted @ 2025-08-04 09:18  kkman2000  阅读(17)  评论(0)    收藏  举报