0

我用 C++ 编写了一个用于编码和解码莫尔斯电码的程序。我的程序正在运行并且解码的消息很好但是没有空格有没有办法添加空间。在此处输入图像描述

#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

4 回答 4

3

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

于 2015-02-23T14:44:29.840 回答
1

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

当您解码标签时,您的逻辑应该能够检测到点和破折号之间的静默。否则,它将无法确定单个字符的结束位置和下一个字符的开始位置。该逻辑应该检测单词结尾和下一个作品开始之间的较长(七个点长)间隔。输入一个特殊字符(不是 . 或破折号)以在您的莫尔斯电码解释器中解释为空格。

如果您正在解释文本输入并搜索下一个分隔符(例如空格)以翻译点和破折号,请同时输出分隔符。这将放入适当数量的空格

例如

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

翻译成

at^by

^ 字符显示空间应该在哪里。

您的代码将其翻译为 atby

于 2015-02-23T14:57:54.187 回答
1

根据维基:

每个字符(字母或数字)都由唯一的点和破折号序列表示。破折号的持续时间是点的持续时间的三倍。每个点或破折号后面都有一个短暂的沉默,等于点的持续时间。单词的字母由等于三个点(一个破折号)的空格分隔,单词由一个等于七个点的空格分隔。点时长是码传输中时间测量的基本单位。 [1] 为了提高交流的速度,字符被编码,所以每个字符在莫尔斯语中的长度大约与它在英语中出现的频率成反比。因此,英语中最常见的字母“E”的代码最短,只有一个点。

所以在我看来:两个“\s”应该在单词之间。单个字符之间有一个“\s”。

于 2015-02-23T14:33:36.960 回答
0

我自己找到了一个解决方案,而且非常简单 - 我刚刚添加了

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

之前

 sentence.erase(0,pos + delimiter.length());
于 2015-02-26T01:25:18.730 回答