如何在解码摩尔斯电码时添加空间

时间:2015-02-23 14:17:58

标签: c++ morse-code

我用c ++编写了一个用于编码和解码莫尔斯代码的程序。 我的程序正在运行,解码后的消息很好,但没有空格就有办法增加空间。enter image description here

#include <iostream>
#include <string>
using namespace std;
string translateMorseCode(string sentence);
string decoceMorseCode (string sentence);
int main()
{
 string sentence;
 cout<<"Enter word or sentence: ";
 getline(cin,sentence);
 cout<<"\nMorse Code is:\n";
 //convert input message into morse
 cout<<translateMorseCode(sentence)<<endl;

 //copying morse code into decode string for decoding 
 string decode = translateMorseCode(sentence);
 cout<<"\nDecoding morse code is text"<<endl;
 //converting back ito text string
 cout<<decoceMorseCode (decode);
 return 0;
}


string decoceMorseCode (string sentence)
{

string delimiter = " ";
string decode ="";
int pos = 0;
string token;

while ((pos = sentence.find(delimiter)) != string::npos) {
    token = sentence.substr(0, pos);

    if(token==".-")
    {
        decode.append("a");
    }
    else if(token=="-...")
    {
        decode.append("b");
    }

    else if(token=="-.-.")
    {
        decode.append("c");
    }
    else if(token=="-..")
    {
        decode.append("d");
    }
        else if(token==".")
    {
        decode.append("e");
    }
        else if(token=="..-.")
    {
        decode.append("f");
    }
        else if(token=="--.")
    {
        decode.append("g");
    }
    else if(token=="....")
    {
        decode.append("h");
    }
    else if(token=="..")
    {
        decode.append("i");
    }
    else if(token==".---")
    {
        decode.append("j");
    }
    else if(token=="-.-")
    {
        decode.append("k");
    }
    else if(token==".-..")
    {
        decode.append("l");
    }
    else if(token=="--")
    {
        decode.append("m");
    }
        else if(token=="-.")
    {
        decode.append("n");
    }
    else if(token=="---")
    {
        decode.append("o");
    }
 else if(token==".--.")
    {
        decode.append("p");
    }
    else if(token=="--.-")
    {
        decode.append("q");
    }
    else if(token==".-.")
    {
        decode.append("r");
    }
    else if(token=="...")
    {
        decode.append("s");
    }
    else if(token=="-")
    {
        decode.append("t");
    }
   else if(token=="..-")
    {
        decode.append("u");
    }
   else if(token=="...-")
    {
        decode.append("v");
    }
    else if(token==".--")
    {
        decode.append("w");
    }
    else if(token=="-..-")
    {
        decode.append("x");
    }
        else if(token=="-.--")
    {
        decode.append("y");
    }
    else if(token=="--..")
    {
        decode.append("z");
    }
    else if(token=="-----")
    {
        decode.append("0");
    }
        else if(token==".----")
    {
        decode.append("1");
    }
    else if(token=="..---")
    {
        decode.append("2");
    }
    else if(token=="...--")
    {
        decode.append("3");
    }
    else if(token=="....-")
    {
        decode.append("4");
    }
    else if(token==".....")
    {
        decode.append("5");
    }
    else if(token=="-....")
    {
        decode.append("6");
    }
        else if(token=="--...")
    {
        decode.append("7");
    }
    else if(token=="---..")
    {
        decode.append("8");
    }
    else if(token=="----.")
    {
        decode.append("9");
    }

    sentence.erase(0,pos + delimiter.length());

}

return decode ; // returnung decoded text 
}




//function convert input message into morse return Morse Code as String
string translateMorseCode(string sentence)
{
 string MorseCode="";
 for(int i=0;i<sentence.length();i++){
 switch (sentence[i]){
 case 'a':
 case 'A':
 MorseCode.append(".- ");
 break;
 case 'b':
 case 'B':
 MorseCode.append("-... ");
 break;
 case 'c':
 case 'C':
 MorseCode.append("-.-. ");
 break;
 case 'd':
 case 'D':
 MorseCode.append("-.. ");
 break;
 case 'e':
 case 'E':
 MorseCode.append(". ");
 break;
 case 'f':
 case 'F':
 MorseCode.append("..-. ");
 break;
 case 'g':
 case 'G':
 MorseCode.append("--. ");
 break;
 case 'h':
 case 'H':
 MorseCode.append(".... ");
 break;
 case 'i':
 case 'I':
 MorseCode.append(".. ");
 break;
 case 'j':
 case 'J':
 MorseCode.append(".--- ");
 break;
 case 'k':
 case 'K':
 MorseCode.append("-.- ");
 break;
 case 'l':
 case 'L':
 MorseCode.append(".-.. ");
 break;
 case 'm':
 case 'M':
 MorseCode.append("-- ");
  break;
 case 'n':
 case 'N':
 MorseCode.append("-. ");
 break;
 case 'o':
 case 'O':
 MorseCode.append("--- ");
 break;
 case 'p':
 case 'P':
 MorseCode.append(".--. ");
 break;
 case 'q':
 case 'Q':
 MorseCode.append("--.- ");
 break;
 case 'r':
 case 'R':
 MorseCode.append(".-. ");
 break;
 case 's':
 case 'S':
 MorseCode.append("... ");
 break;
 case 't':
 case 'T':
 MorseCode.append("- ");
 break;
 case 'u':
 case 'U':
 MorseCode.append("..- ");
 break;
 case 'v':
 case 'V':
 MorseCode.append("...- ");
 break;
 case 'w':
 case 'W':
 MorseCode.append(".-- ");
 break;
 case 'x':
 case 'X':
 MorseCode.append(".-- ");
 break;
 case 'y':
 case 'Y':
 MorseCode.append("-.-- ");
 break;
 case 'z':
 case 'Z':
 MorseCode.append("--.. ");
 break;
 case ' ':
 MorseCode.append(" ");
 break;
 case '1':
 MorseCode.append(".---- ");
 break;
 case '2':
 MorseCode.append("..--- ");
 break;
 case '3':
 MorseCode.append("...-- ");
 break;
 case '4':
 MorseCode.append("....- ");
 break;
 case '5':
 MorseCode.append("..... ");
 break;
 case '6':
 MorseCode.append("-.... ");
 break;
 case '7':
 MorseCode.append("--... ");
 break;
 case '8':
 MorseCode.append("---.. ");
 break;
 case '9':
 MorseCode.append("----. ");
 break;
 case '0':
 MorseCode.append("----- ");
 break;
}
}
 return MorseCode;// return Morse Code
}   

4 个答案:

答案 0 :(得分:3)

问题是您在莫尔斯输出中使用双空格编码字边界,但解码器会跳过所有空格。因此它也会跳过双倍空格,这就是为什么它不知道在解码输出中放置空格的原因。

答案 1 :(得分:1)

根据维基:

  

每个字符(字母或数字)由唯一的点序列表示   和破折号。破折号的持续时间是点的持续时间的三倍。每   点或短划线之后是短暂的静音,等于点持续时间。该   一个单词的字母用等于三个点(一个破折号)的空格分隔,并且   单词用等于七个点的空格分隔。点持续时间是   代码传输中的基本时间测量单位。[1]提高速度   通信,字符编码所以每个字符的长度   莫尔斯与其出现频率大致成反比   英语。因此,最常见的英文字母,字母&#34; E,&#34;有   最短的代码,一个单点。

所以在我看来: 两个&#34; \ s&#34;应该在单词之间。 一个&#34; \ s&#34;在单个字符之间。

答案 2 :(得分:1)

@Neska给了你基本答案,但没有解释空间被解释的位置。

当您获得解码后的标签时,您的逻辑应该能够检测点和短划线之间的静音。否则,它将无法确定单个角色的结束位置和下一个角色的开始位置。该逻辑应该检测单词结尾和下一个工作开始之间的较长(七个点长)间隔。放入一个特殊字符(不是。或破折号)来解释为摩尔斯电码解释器中的空格。

如果要解释文本输入并搜索下一个分隔符(例如空格)以便转换点和短划线,也可以输出分隔符。这将放入适当数量的空格

例如

.-^-^^-...^-.--

转换为

at^by

其中^字符显示空格应该在哪里。

您的代码将其翻译为atby

答案 3 :(得分:0)

我自己找到了一个解决方案,这很简单 - 我刚刚添加了

else if (" ")
    {
        decode.append(" ");
    }

之前的

 sentence.erase(0,pos + delimiter.length());