c++ 摩尔斯电码

发布时间:2024年01月12日

????????摩尔斯电码是一种字符编码方式,使用不同长度的信号来表示不同的字母、数字和标点符号。它由美国发明家塞缪尔·摩尔斯和阿尔弗雷德·维尔斯利于1836年设计。

????????摩尔斯电码使用两种信号表示,一种是点(.),代表短信号,另一种是线(-),代表长信号。字母和数字由若干个点和线的组合表示,不同的字符之间用空格隔开。

摩尔斯电码的编码规则如下:

1、字母A-Z和数字0-9分别对应不同的摩尔斯电码序列。
2、信号之间的间隔用空格表示。
3、单词之间用空格或斜杠表示。
下面是一些常见字符的摩尔斯电码编码示例:

  • A: .-
  • B: -...
  • C: -.-.
  • D: -..
  • E: .
  • F: ..-.
  • G: --.
  • H: ....
  • I: ..
  • J: .---
  • K: -.-
  • L: .-..
  • M: --
  • N: -.
  • O: ---
  • P: .--.
  • Q: --.-
  • R: .-.
  • S: ...
  • T: -
  • U: ..-
  • V: ...-
  • W: .--
  • X: -..-
  • Y: -.--
  • Z: --..
  • 0: -----
  • 1: .----
  • 2: ..---
  • 3: ...--
  • 4: ....-
  • 5: .....
  • 6: -....
  • 7: --...
  • 8: ---..
  • 9: ----.

????????通过解码摩尔斯电码,可以将摩尔斯电码转换回原始文本,以实现信息的传输和交流。?

示例一:

/**
?* @file
?* @author [Deep Raval](https://github.com/imdeep2905)
?*
?* @brief Implementation of [Morse Code]
?* (https://en.wikipedia.org/wiki/Morse_code).
?*
?* @details
?* Morse code is a method used in telecommunication to encode text characters
?* as standardized sequences of two different signal durations, called dots
?* and dashes or dits and dahs. Morse code is named after Samuel Morse, an
?* inventor of the telegraph.
?*/
#include <cassert>
#include <iostream>
#include <string>
#include <vector>

/** \namespace ciphers
?* \brief Algorithms for encryption and decryption
?*/
namespace ciphers {
/** \namespace morse
?* \brief Functions for [Morse Code]
?* (https://en.wikipedia.org/wiki/Morse_code).
?*/
namespace morse {
/**
?* Get the morse representation for given character.
?* @param c Character
?* @returns morse representation string of character
?*/
std::string char_to_morse(const char &c) {
? ? // return corresponding morse code
? ? switch (c) {
? ? ? ? case 'a':
? ? ? ? ? ? return ".-";
? ? ? ? case 'b':
? ? ? ? ? ? return "-...";
? ? ? ? case 'c':
? ? ? ? ? ? return "-.-.";
? ? ? ? case 'd':
? ? ? ? ? ? return "-..";
? ? ? ? case 'e':
? ? ? ? ? ? return ".";
? ? ? ? case 'f':
? ? ? ? ? ? return "..-.";
? ? ? ? case 'g':
? ? ? ? ? ? return "--.";
? ? ? ? case 'h':
? ? ? ? ? ? return "....";
? ? ? ? case 'i':
? ? ? ? ? ? return "..";
? ? ? ? case 'j':
? ? ? ? ? ? return ".---";
? ? ? ? case 'k':
? ? ? ? ? ? return "-.-";
? ? ? ? case 'l':
? ? ? ? ? ? return ".-..";
? ? ? ? case 'm':
? ? ? ? ? ? return "--";
? ? ? ? case 'n':
? ? ? ? ? ? return "-.";
? ? ? ? case 'o':
? ? ? ? ? ? return "---";
? ? ? ? case 'p':
? ? ? ? ? ? return ".--.";
? ? ? ? case 'q':
? ? ? ? ? ? return "--.-";
? ? ? ? case 'r':
? ? ? ? ? ? return ".-.";
? ? ? ? case 's':
? ? ? ? ? ? return "...";
? ? ? ? case 't':
? ? ? ? ? ? return "-";
? ? ? ? case 'u':
? ? ? ? ? ? return "..-";
? ? ? ? case 'v':
? ? ? ? ? ? return "...-";
? ? ? ? case 'w':
? ? ? ? ? ? return ".--";
? ? ? ? case 'x':
? ? ? ? ? ? return "-..-";
? ? ? ? case 'y':
? ? ? ? ? ? return "-.--";
? ? ? ? case 'z':
? ? ? ? ? ? return "--..";
? ? ? ? case '1':
? ? ? ? ? ? return ".----";
? ? ? ? case '2':
? ? ? ? ? ? return "..---";
? ? ? ? case '3':
? ? ? ? ? ? return "...--";
? ? ? ? case '4':
? ? ? ? ? ? return "....-";
? ? ? ? case '5':
? ? ? ? ? ? return ".....";
? ? ? ? case '6':
? ? ? ? ? ? return "-....";
? ? ? ? case '7':
? ? ? ? ? ? return "--...";
? ? ? ? case '8':
? ? ? ? ? ? return "---..";
? ? ? ? case '9':
? ? ? ? ? ? return "----.";
? ? ? ? case '0':
? ? ? ? ? ? return "-----";
? ? ? ? default:
? ? ? ? ? ? std::cerr << "Found invalid character: " << c << ' ' << std::endl;
? ? ? ? ? ? std::exit(0);
? ? }
}
/**
?* Get character from the morse representation.
?* @param s Morse representation
?* @returns corresponding character
?*/
char morse_to_char(const std::string &s) {
? ? // return corresponding character
? ? if (s == ".-") {
? ? ? ? return 'a';
? ? } else if (s == "-...") {
? ? ? ? return 'b';
? ? } else if (s == "-.-.") {
? ? ? ? return 'c';
? ? } else if (s == "-..") {
? ? ? ? return 'd';
? ? } else if (s == ".") {
? ? ? ? return 'e';
? ? } else if (s == "..-.") {
? ? ? ? return 'f';
? ? } else if (s == "--.") {
? ? ? ? return 'g';
? ? } else if (s == "....") {
? ? ? ? return 'h';
? ? } else if (s == "..") {
? ? ? ? return 'i';
? ? } else if (s == ".---") {
? ? ? ? return 'j';
? ? } else if (s == "-.-") {
? ? ? ? return 'k';
? ? } else if (s == ".-..") {
? ? ? ? return 'l';
? ? } else if (s == "--") {
? ? ? ? return 'm';
? ? } else if (s == "-.") {
? ? ? ? return 'n';
? ? } else if (s == "---") {
? ? ? ? return 'o';
? ? } else if (s == ".--.") {
? ? ? ? return 'p';
? ? } else if (s == "--.-") {
? ? ? ? return 'q';
? ? } else if (s == ".-.") {
? ? ? ? return 'r';
? ? } else if (s == "...") {
? ? ? ? return 's';
? ? } else if (s == "-") {
? ? ? ? return 't';
? ? } else if (s == "..-") {
? ? ? ? return 'u';
? ? } else if (s == "...-") {
? ? ? ? return 'v';
? ? } else if (s == ".--") {
? ? ? ? return 'w';
? ? } else if (s == "-..-") {
? ? ? ? return 'x';
? ? } else if (s == "-.--") {
? ? ? ? return 'y';
? ? } else if (s == "--..") {
? ? ? ? return 'z';
? ? } else if (s == ".----") {
? ? ? ? return '1';
? ? } else if (s == "..---") {
? ? ? ? return '2';
? ? } else if (s == "...--") {
? ? ? ? return '3';
? ? } else if (s == "....-") {
? ? ? ? return '4';
? ? } else if (s == ".....") {
? ? ? ? return '5';
? ? } else if (s == "-....") {
? ? ? ? return '6';
? ? } else if (s == "--...") {
? ? ? ? return '7';
? ? } else if (s == "---..") {
? ? ? ? return '8';
? ? } else if (s == "----.") {
? ? ? ? return '9';
? ? } else if (s == "-----") {
? ? ? ? return '0';
? ? } else {
? ? ? ? std::cerr << "Found invalid Morse code: " << s << ' ' << std::endl;
? ? ? ? std::exit(0);
? ? }
}
/**
?* Encrypt given text using morse code.
?* @param text text to be encrypted
?* @returns new encrypted text
?*/
std::string encrypt(const std::string &text) {
? ? std::string encrypted_text = ""; ?// Empty string to store encrypted text
? ? // Going through each character of text and converting it
? ? // to morse representation
? ? for (const char &c : text) {
? ? ? ? encrypted_text += ciphers::morse::char_to_morse(c) + " ";
? ? }
? ? return encrypted_text; ?// Returning encrypted text
}
/**
?* Decrypt given morse coded text.
?* @param text text to be decrypted
?* @returns new decrypted text
?*/
std::string decrypt(const std::string &text) {
? ? // Going through each character of text and converting it
? ? // back to normal representation.
? ? std::string decrypted_text = ""; ?// Empty string to store decrypted text
? ? // Spliting string (with delimiter = " ") and storing it
? ? // in vector
? ? std::size_t pos_start = 0, pos_end = 0, delim_len = 1;
? ? std::vector<std::string> splits;
? ? while ((pos_end = text.find(' ', pos_start)) != std::string::npos) {
? ? ? ? std::string token = text.substr(pos_start, pos_end - pos_start);
? ? ? ? pos_start = pos_end + delim_len;
? ? ? ? splits.push_back(token);
? ? }

? ? // Traversing through each morse code string
? ? for (const std::string &s : splits) {
? ? ? ? // Add corresponding character
? ? ? ? decrypted_text += ciphers::morse::morse_to_char(s);
? ? }

? ? return decrypted_text; ?// Returning decrypted text
}
} ?// namespace morse
} ?// namespace ciphers

/**
?* @brief Function to test above algorithm
?* @returns void
?*/
static void test() {
? ? // Test 1
? ? std::string text1 = "01234567890";
? ? std::string encrypted1 = ciphers::morse::encrypt(text1);
? ? std::string decrypted1 = ciphers::morse::decrypt(encrypted1);
? ? assert(text1 == decrypted1);
? ? std::cout << "Original text : " << text1 << std::endl;
? ? std::cout << "Encrypted text : " << encrypted1 << std::endl;
? ? std::cout << "Decrypted text : " << decrypted1 << std::endl;
? ? // Test 2
? ? std::string text2 = "abcdefghijklmnopqrstuvwxyz";
? ? std::string encrypted2 = ciphers::morse::encrypt(text2);
? ? std::string decrypted2 = ciphers::morse::decrypt(encrypted2);
? ? assert(text2 == decrypted2);
? ? std::cout << "Original text : " << text2 << std::endl;
? ? std::cout << "Encrypted text : " << encrypted2 << std::endl;
? ? std::cout << "Decrypted text : " << decrypted2 << std::endl;
}

/**
?* @brief Main function
?* @returns 0 on exit
?*/
int main() {
? ? // Testing
? ? test();
? ? return 0;
}

示例二:

实现摩尔斯电码编码和解码的C++示例:

#include <iostream>
#include <map>
#include <string>
#include <sstream>
#include <algorithm>

std::map<char, std::string> morseCode = {
? {'A', ".-"}, {'B', "-..."}, {'C', "-.-."}, {'D', "-.."}, {'E', "."}, {'F', "..-."}, {'G', "--."},
? {'H', "...."}, {'I', ".."}, {'J', ".---"}, {'K', "-.-"}, {'L', ".-.."}, {'M', "--"}, {'N', "-."},
? {'O', "---"}, {'P', ".--."}, {'Q', "--.-"}, {'R', ".-."}, {'S', "..."}, {'T', "-"}, {'U', "..-"},
? {'V', "...-"}, {'W', ".--"}, {'X', "-..-"}, {'Y', "-.--"}, {'Z', "--.."},
? {'0', "-----"}, {'1', ".----"}, {'2', "..---"}, {'3', "...--"}, {'4', "....-"},
? {'5', "....."}, {'6', "-...."}, {'7', "--..."}, {'8', "---.."}, {'9', "----."},
? {'.', ".-.-.-"}, {',', "--..--"}, {'?', "..--.."}, {'!', "-.-.--"}
};

std::string encodeToMorseCode(const std::string& text) {
? std::stringstream encodedText;
? for (char c : text) {
? ? if (morseCode.count(std::toupper(c)) > 0) {
? ? ? encodedText << morseCode[std::toupper(c)] << " ";
? ? }
? }
? return encodedText.str();
}

std::string decodeFromMorseCode(const std::string& morse) {
? std::stringstream decodedText;
? std::stringstream morseStream(morse);
? std::string code;
? while (morseStream >> code) {
? ? auto it = std::find_if(morseCode.begin(), morseCode.end(), [&](const auto& pair) {
? ? ? return pair.second == code;
? ? });
? ? if (it != morseCode.end()) {
? ? ? decodedText << it->first;
? ? }
? }
? return decodedText.str();
}

int main() {
? std::string text = "HELLO WORLD";
? std::string morse = encodeToMorseCode(text);
? std::cout << "Morse code: " << morse << std::endl;
? std::string decodedText = decodeFromMorseCode(morse);
? std::cout << "Decoded text: " << decodedText << std::endl;
? return 0;
}
????????在上述示例中,`encodeToMorseCode`函数接受一个字符串作为输入,并将其转换为摩尔斯电码。`decodeFromMorseCode`函数接受一个摩尔斯电码字符串,并将其解码为原始文本。

????????在主函数中,我们将字符串"HELLO WORLD"编码为摩尔斯电码,并将其解码回原始文本。最后,我们输出编码后的摩尔斯电码和解码后的文本。

文章来源:https://blog.csdn.net/hefeng_aspnet/article/details/135544308
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。