【问题标题】:How can I add space while decoding Morse code如何在解码摩尔斯电码时添加空间
【发布时间】:2015-02-23 14:17:57
【问题描述】:

我用 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
}   

【问题讨论】:

  • 不,它不能得到相同的结果
  • 我很确定它没那么笑:(
  • 请添加文字而不是屏幕截图。
  • 我一开始已经解释了如何通过 decoceMorseCode 函数添加空格来分隔结果中的所有单词

标签: c++ morse-code


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据维基:

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

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

    【讨论】:

    • 不知道在哪里放置“/s”
    • 实际情况并非如此。有一个处理单词边界的case ' ':。 (你可以说它忽略了换行符)
    • @LightnessRacesinOrbit 我用在线转换器测试了我的结果,结果是一样的
    • @MSalters 我试过 ''" 是我的代码,但没有得到我使用 decode.append(" ") 所需的结果;下面是 sentence.erase(0,pos + delimiter.length()) ; 我在每个字符之后而不是在单词之后得到空格
    【解决方案3】:

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

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

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

    例如

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

    翻译成

    at^by
    

    ^ 字符显示空格的位置。

    您的代码将其翻译为 atby

    【讨论】:

      【解决方案4】:

      我自己找到了一个解决方案,而且很简单——我只是添加了

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

      之前

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        相关资源
        最近更新 更多