CSP-J 入门级 · CSP 2020 入门级第一轮 第 16 题

阅读程序 · 答案 ABD · 考点:字符数组与字符串处理、字符串(string)

← 整套速查表 CSP-J 入门级 全部真题

题目

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $1.5$ 分,选择题 $3$ 分,共计 $40$ 分)

1.

#include <cstdlib>
#include <iostream>
using namespace std;

char encoder[26] = {'C','S','P',0};
char decoder[26];

string st;

int main()  {
  int k = 0;
  for (int i = 0; i < 26; ++i)
    if (encoder[i] != 0) ++k;
  for (char x ='A'; x <= 'Z'; ++x) {
    bool flag = true;
    for (int i = 0; i < 26; ++i)
      if (encoder[i] ==x) {
        flag = false;
        break;
      }
      if (flag) {
        encoder[k]= x;
        ++k;
      }
  }
  for (int i = 0; i < 26; ++i)
     decoder[encoder[i]- 'A'] = i + 'A';
  cin >> st;
  for (int i = 0; i < st.length( ); ++i)
    st[i] = decoder[st[i] -'A'];
  cout << st;
  return 0;
}

•判断题

1) 输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( ) 2) 若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。() 3) 将第 12 行的 i < 26 改为 i < 16,程序运行结果不会改变。( ) 4) 将第 26 行的 i < 26 改为 `

(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)

答案:ABD

考点

字符数组与字符串处理 讲解 →字符数组与字符串处理 真题汇总 →字符串(string)

解题思维

程序构建encoder映射表(CSP开头的字母表),再生成decoder解码器。输入大写字母串,输出解码后的字符串。

常见错误

注意encoder初始只有"C","S","P"三个字符,其余按字母顺序填充。decoder是encoder的逆映射。最后用decoder对输入进行替换解码。

详细解析(节选)

考察知识点:字符数组 + 映射 + 编码

程序功能分析: 1. encoder初始为{'C','S','P',0,...},k初始为3 2. 遍历A-Z,如果不在encoder中则添加到encoder 3. 最终encoder = {'C','S','P','A','B','D','E','F','G','H','I','J','K','L','M','N','O','Q','R','T','U','V','W','X','Y','Z'} (顺序:C,S,P,然后A-Z中除C,S,P外的字母按顺序) 4. decoder是encoder的逆:decoder[encoder[i]-'A'] = i+'A' 即decoder将encoder中的字符映射回其在encoder中的索引

逐题解析: 1. ✅ 输入必须是大写字母,否则st[i]-'A'可能为负(访问越界) 2. ❌ 输入和输出可以相同(对于某些字符,解码=编码时) 3. ✅ 第12行i<26改为i<16:encoder此时已填充了C,S,P和一些字母,encoder[16]已有值,所以不影响 4. ❌ 第26行i<26改为i<16:只能计算前16个字符的decoder映射,后10个字符的decoder未定义 5. 输出ABCABCABCA→解码结果,输入的字符通过decoder映射后得到ABC。需要分析哪些字符映射到A、B、C。 6. 输出CSPCSPCSPCSP→类似分析。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断