二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $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 改为 `
(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)
程序构建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→类似分析。