// 包含标准库头文件,提供一些通用功能
#include <cstdlib>
// 包含输入输出流头文件,用于输入输出操作
#include <iostream>
// 使用标准命名空间,这样可以直接使用 std 中的元素,如 cout、cin 等
using namespace std;
// 定义一个字符数组 encoder,前几个元素为 'C'、'S'、'P',其余后续会填充,末尾以 0 作为初始部分结束标记
char encoder[26] = {'C', 'S', 'P', 0};
// 定义一个字符数组 decoder,用于存储解码映射
char decoder[26];
// 定义一个字符串 st,用于存储输入的字符串
string st;
int main() {
    // 初始化变量 k 为 0,用于记录 encoder 中已有的有效字符数量
    int k = 0;
    // 遍历 encoder 数组,统计其中非 0 的字符数量
    for (int i = 0; i < 26; ++i)
        if (encoder[i] != 0) 
            ++k;
    // 遍历从 'A' 到 'Z' 的每个大写字母
    for (char x = 'A'; x <= 'Z'; ++x) {
        // 初始化 flag 为 true,用于标记当前字母 x 是否在 encoder 中
        bool flag = true;
        // 遍历 encoder 数组,检查 x 是否存在于其中
        for (int i = 0; i < 26; ++i)
            if (encoder[i] == x) {
                // 如果存在,将 flag 设为 false,并跳出内层循环
                flag = false;
                break;
            }
        // 如果 flag 为 true,说明 x 不在 encoder 中,将其添加到 encoder 中,k 自增
        if (flag) {
            encoder[k] = x;
            ++k;
        }
    }
    // 根据 encoder 构建 decoder 解码映射,encoder 中索引为 i 的字符,在 decoder 中对应位置为 i + 'A'
    for (int i = 0; i < 26; ++i)
        decoder[encoder[i] - 'A'] = i + 'A';
    // 从标准输入读取字符串到 st 中
    cin >> st;
    // 遍历输入的字符串 st,对每个字符进行解码
    for (int i = 0; i < st.length(); ++i)
        st[i] = decoder[st[i] - 'A'];
    // 输出解码后的字符串
    cout << st;
    // 主函数返回 0,表示程序正常结束
    return 0;
}

程序整体功能、流程与用途

  • 功能:该程序主要实现了一种基于自定义编码表的字符串编码与解码功能。首先构建一个包含所有大写字母(补充初始未包含的)的编码表encoder,然后根据encoder构建解码表decoder,最后将输入的字符串按照解码表进行解码并输出。
  • 流程
    1. 初始化encoder数组,前几个元素为'C''S''P',其余初始为0
    2. 统计encoder中已有的非0字符数量k
    3. 遍历所有大写字母,将encoder中没有的大写字母补充到encoder中,使encoder最终包含所有26个大写字母。
    4. 根据encoder构建decoderdecoder的索引由encoder中字符与'A'的差值确定,对应的值为该索引加上'A'
    5. 输入字符串st,遍历st的每个字符,利用decoder对每个字符进行解码(通过字符与'A'的差值作为索引查找decoder)。
    6. 输出解码后的字符串。
  • 用途:可用于简单的字符串编码解码场景,帮助理解编码表的构建以及基于编码表的字符转换过程,是学习字符映射和字符串处理的一个示例。

对于题目中的判断“输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。 ()”,答案是正确。因为代码中在解码时,使用st[i] - 'A'作为decoder的索引,若输入的字符不是大写字母,st[i] - 'A'的结果可能超出0 - 25的范围,从而导致访问decoder数组越界。2

0 条评论

目前还没有评论...