本文主要是介绍c++ 摩尔斯电码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
摩尔斯电码是一种字符编码方式,使用不同长度的信号来表示不同的字母、数字和标点符号。它由美国发明家塞缪尔·摩尔斯和阿尔弗雷德·维尔斯利于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"编码为摩尔斯电码,并将其解码回原始文本。最后,我们输出编码后的摩尔斯电码和解码后的文本。
这篇关于c++ 摩尔斯电码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!