2015-02-23 246 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());