C++实现摩斯电码

摩尔斯电码是一种在电信领域使用的方法,它将文本字符编码为两种不同信号时长的标准化序列,这两种信号时长分别被称为点(dots 或 dits)和划(dashes 或 dahs)。摩尔斯电码以电报机发明者塞缪尔・莫尔斯(Samuel Morse)的名字命名。

1. 头文件与命名空间

#include <cassert>   // 断言检查
#include <iostream>  // 输入输出
#include <string>    // 字符串处理
#include <vector>    // 动态数组

namespace ciphers {  // 密码算法命名空间
    namespace morse { // 莫尔斯电码子命名空间
  • 作用:引入必要库文件并组织代码结构

  • 细节

    • <cassert> 用于测试断言

    • <vector> 用于存储分割后的摩尔斯码

    • 命名空间层级清晰分离不同算法

2. 字符到摩尔斯码映射

std::string char_to_morse(const char& c) {
    switch (c) {  // 字符匹配
    case 'a': return ".-";
    case 'b': return "-...";
    // ...(其他字母数字映射)
    default:  // 错误处理
        std::cerr << "无效字符: " << c << std::endl;
        std::exit(0);
    }
}
  • 作用:实现ASCII字符到摩尔斯码的转换

  • 关键点

    • 支持a-z小写字母和0-9数字

    • 严格校验输入字符,遇到非法字符立即终止程序

    • 返回字符串包含标准摩尔斯符号(.和-)

3. 摩尔斯码到字符映射

char morse_to_char(const std::string& s) {
    if (s == ".-") return 'a';
    else if (s == "-...") return 'b';
    // ...(其他码表匹配)
    else {  // 错误处理
        std::cerr << "无效摩尔斯码: " << s << std::endl;
        std::exit(0);
    }
}
  • 作用:实现逆向转换

  • 特点

    • 使用if-else链实现反向查找

    • 严格匹配摩尔斯码格式

    • 处理非法输入方式与正向转换一致

4. 加密功能

std::string encrypt(const std::string& text) {
    std::string encrypted_text;
    for (const char& c : text) {
        encrypted_text += char_to_morse(c) + " ";  // 添加空格分隔
    }
    return encrypted_text;
}
  • 工作流程

    1. 遍历输入字符串每个字符

    2. 转换为摩尔斯码后追加空格

    3. 返回如".- -... "格式的字符串

  • 注意:生成的字符串末尾包含额外空格

5. 解密功能

std::string decrypt(const std::string& text) {
    std::vector<std::string> splits;  // 存储分割后的摩尔斯码
    std::size_t pos_start = 0, pos_end;
    
    // 分割字符串逻辑
    while ((pos_end = text.find(' ', pos_start)) != std::string::npos) {
        splits.push_back(text.substr(pos_start, pos_end - pos_start));
        pos_start = pos_end + 1;
    }

    // 转换每个摩尔斯码
    std::string decrypted_text;
    for (const auto& code : splits) {
        decrypted_text += morse_to_char(code);
    }
    return decrypted_text;
}
  • 关键步骤

    1. 使用空格作为分隔符分割字符串

    2. 将每个摩尔斯码转换为字符

    3. 拼接最终解密结果

  • 潜在问题:末尾多余空格会导致空字符串错误

6. 测试用例

static void test() {
    // 测试1:数字转换
    std::string text1 = "01234567890";
    assert(ciphers::morse::decrypt(ciphers::morse::encrypt(text1)) == text1);

    // 测试2:全小写字母
    std::string text2 = "abcdefghijklmnopqrstuvwxyz";
    assert(ciphers::morse::decrypt(ciphers::morse::encrypt(text2)) == text2);
}
  • 验证重点

    • 加密解密过程的完整性(加密后能正确还原)

    • 覆盖数字和全部字母的测试

  • 局限性

    • 未测试大写字母

    • 未测试特殊字符

    • 未测试边界条件(如空字符串)


7. 主函数

int main() {
    test();  // 执行测试用例
    return 0;
}
  • 设计特点

    • 简洁的入口函数

    • 完全依赖自动化测试

    • 无用户交互功能


8. 代码特点总结

优势

  1. 模块化设计:每个功能独立清晰

  2. 严格的错误处理:遇到非法输入立即终止

  3. 完整的测试覆盖:验证核心功能正确性

局限性与改进方向

  1. 字符支持有限:

    • 仅支持小写字母(需扩展大小写转换)

    • 缺少标点符号支持(国际摩尔斯码包含标点)

  2. 错误处理较严格:

    • 遇到无效字符直接退出(可改为异常处理)

  3. 字符串分割问题:

    • 末尾空格导致空字符串错误(应去除首尾空格)

  4. 性能优化:

    • 使用unordered_map实现双向查找

    • 预先计算映射表提升效率

  5. 扩展性:

    • 可添加文件加密功能

    • 支持音频/灯光信号模拟


9. 示例运行流程

加密过程

  1. 输入:"hello123"

  2. 加密步骤:
    h -> "...."
    e -> "."
    l -> ".-.."
    o -> "---"
    1 -> ".----"
    2 -> "..---"
    3 -> "...--"

  3. 输出:".... . .-.. .-.. --- .---- ..--- ...-- "

解密过程

  1. 输入加密字符串

  2. 分割为["....", ".", ".-..", ".-..", "---", ".----", "..---", "...--"]

  3. 转换为字符序列:h e l l o 1 2 3

  4. 输出:"hello123"


通过这种分块解析,可以清晰理解每个模块的功能实现细节和相互之间的协作关系,同时识别出代码的优势和潜在改进方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值