2015-02-23 187 views
0

我在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 
} 
+0

没有它不工作越来越相同的结果 – 2015-02-23 14:24:52

+0

m很确定它没有这么微笑:( – 2015-02-23 14:25:38

+0

请添加文本而不是截图 – MSalters 2015-02-23 14:41:43

回答

1

根据维基:

每个字符(字母或数字)由点 和破折号的一个独特的序列表示。短划线的持续时间是点的持续时间的三倍。每个 点或短划线之后是短暂的静默,等于点的持续时间。单词的字母由等于三个点(一个短划线)的空格分开,并且 这些单词由等于七个点的空格分开。点的持续时间是代码传输中基本的时间测量单位[012]。为了提高通信的速度,对字符进行编码,使得Morse中每个字符的长度与其出现频率大致成反比,其中英文为 。因此,英文中最常见的字母“E”具有最短的代码,即单个点。

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

+0

是不明白它在哪里放置“/ s” – 2015-02-23 14:39:55

+0

他说你的莫尔斯是错误的。 – 2015-02-23 14:42:45

+0

事实并非如此。有一个'case':'处理单词的边界。 (你可以争辩说,它忽略换行符) – MSalters 2015-02-23 14:45:47

3

的问题是,你用你的莫尔斯电输出的双重空间编码一个单词边界,但你的解码器跳过所有空格。因此,它也跳过了双倍空间,这就是为什么它不知道在解码输出中放置空间的位置。

1

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

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

如果您正在解释文本输入并搜索下一个分隔符(例如空格)以便翻译点和破折号,请输出分隔符。这将摆在空间

适当数量例如

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

转化为

at^by 

其中^字符显示了空间应该。

您的代码转换这是atby

0

我已经自己找到了解决办法,这是很简单 - 我只是说

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

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