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;
}
-
工作流程:
-
遍历输入字符串每个字符
-
转换为摩尔斯码后追加空格
-
返回如".- -... "格式的字符串
-
-
注意:生成的字符串末尾包含额外空格
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;
}
-
关键步骤:
-
使用空格作为分隔符分割字符串
-
将每个摩尔斯码转换为字符
-
拼接最终解密结果
-
-
潜在问题:末尾多余空格会导致空字符串错误
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. 代码特点总结
优势:
-
模块化设计:每个功能独立清晰
-
严格的错误处理:遇到非法输入立即终止
-
完整的测试覆盖:验证核心功能正确性
局限性与改进方向:
-
字符支持有限:
-
仅支持小写字母(需扩展大小写转换)
-
缺少标点符号支持(国际摩尔斯码包含标点)
-
-
错误处理较严格:
-
遇到无效字符直接退出(可改为异常处理)
-
-
字符串分割问题:
-
末尾空格导致空字符串错误(应去除首尾空格)
-
-
性能优化:
-
使用unordered_map实现双向查找
-
预先计算映射表提升效率
-
-
扩展性:
-
可添加文件加密功能
-
支持音频/灯光信号模拟
-
9. 示例运行流程
加密过程:
-
输入:"hello123"
-
加密步骤:
h -> "...."
e -> "."
l -> ".-.."
o -> "---"
1 -> ".----"
2 -> "..---"
3 -> "...--" -
输出:".... . .-.. .-.. --- .---- ..--- ...-- "
解密过程:
-
输入加密字符串
-
分割为["....", ".", ".-..", ".-..", "---", ".----", "..---", "...--"]
-
转换为字符序列:h e l l o 1 2 3
-
输出:"hello123"
通过这种分块解析,可以清晰理解每个模块的功能实现细节和相互之间的协作关系,同时识别出代码的优势和潜在改进方向。