当前位置: 首页 > news >正文

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"


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

http://www.xdnf.cn/news/332641.html

相关文章:

  • 基于房屋框架结构的房屋布局大模型
  • Python操作MySQL
  • 大模型工具与案例:云服务器部署dify与使用
  • 《人工智能:如何重塑教育模式与学习图景》
  • MySQL5.6-5.7-8.0在线DDL操作锁表介绍
  • # 构建机器学习模型的桌面应用程序:从训练到部署
  • 前端实现简易 计时器
  • 多层PCB SMT贴装全流程指南:从物料准备到回流焊工艺控制
  • allegro出gerber时,单击Artwork并没有弹窗的问题
  • 数据分析案例(2)
  • 【AI落地应用实战】Amazon Bedrock 零门槛使用 DeepSeek-R1:在 Amazon Bedrock 上部署与调用的完整实践指南
  • 15_sysfsLinux内核模块
  • influxdb实战
  • CPU-GPU-NPU-TPU 概念
  • 统一返回JsonResult踩坑
  • 今日行情明日机会——20250507
  • 前端三大件--HTML
  • svn服务器迁移
  • BK精密电源操作软件 9130BA系列和手侧user manual
  • 文生图(Text-to-Image)的发展
  • 人工智能如何进行课堂管理?
  • 分布式爬虫去重:Python + Redis实现高效URL去重
  • 多账号管理、反追踪与自动化测试:我的浏览器实战笔记
  • string--OJ4
  • LeetCode106_从中序与后序遍历序列构造二叉树
  • 迈向AI辅助数据分析代码生成的透明性与知识共享
  • #黑马点评#(三)缓存穿透/雪崩/击穿
  • hadoop中的序列化和反序列化(1)
  • MySQL的information_schema在SQL注入中的关键作用与防御策略
  • 由浅入深谈Python书写规范