2017-02-11 3 views
0

Я делаю программу, которая преобразует буквы, числа и пунктуации в код Морзе.C++ конвертировать ASCII в код Морзе

С буквами и цифрами его работая, как я хочу.

Но с пунктуациями я не могу заставить его работать правильно. Я надеялся, что кто-то сможет взглянуть на мой код и помочь мне.

#include <iostream> 
#include <cstring> 
#include <sstream> 
using namespace std; 



    char ch; 
    string morseWord = ""; 

    for(unsigned int i=0; i < word.length(); i++) 
    { 
     if(isalpha(word[i])) 
     { 
      ch ; 
     } 
    } 
    return morseWord; 
} 


    char ch; 
    string morseWord = ""; 

    for(unsigned int i=0; i < word.length(); i++) 
    { 
     if(isdigit(word[i])) 
     { 
      ch = word[i]; 
      ch = toupper(ch); 
      morseWord += morseCode[ch - '0']; 
      morseWord += " "; 

    string morseWord = ""; 

    for(unsigned int i=0; i < word.length(); i++) 
    { 
     if(ispunct(word[i])) 
     { 
      ch = word[i]; 
      ch = toupper(ch); 
      morseWord += morseCode[ch - '.']; 
      morseWord += " "; 
     } 
    } 
    return morseWord; 
} 



int main() 
{ 
    stringstream ss; 
    string sentence; 
    string word = ""; 

    code: " << endl; 

    while(ss >> ToMorse(word) << endl; 
     cout << PunctuationToMorse(word) << endl; 
} 
+0

Добро пожаловать в переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+1

_ «Но с пунктуациями я не могу заставить его работать должным образом». Какова ваша фактическая проблема? Каков вход, ожидаемый выход и фактический выход? –

+0

На данный момент я хочу иметь возможность ввода: точка, знак вопроса и знак экламации. Когда я ввожу точку, она преобразует ее в порядке. Но когда я ввожу два других, это дает мне:? U ???. –

ответ

1

Ваша основная проблема заключается в том, что вы пропустили, чтобы обеспечить скобки для цикла while() в вашей main() функции:

while(ss >> word) { // <<<< Put an opening brace here 
    cout << EnglishToMorse(word) << endl; 
    cout << NumbersToMorse(word) << endl; 
    cout << PunctuationToMorse(word) << endl; 
} // <<<<< ... and a closing brace here 

А вообще лучше подход будет:

Карта всех известных символы, которые могут быть преобразованы в код Морзе с использованием std::map<char,std::string> и имеют одну функцию для обработки:

string CharToMorse(char c) { 
    static const std::map<char,std::string> morseCode = { 
     { 'A', ".-" } , 
     { 'B' , "-..." } , 
     { 'C', "-.-." } , 
     // ... 
     { 'Z', "--.." }, 
     { '0', ".----" } , 
     { '1', "..---" } , 
     { '2', "...--" } , 
     // ... 
     { '9', "-----" } , 
     { ' ', "......." } // Consider to support spaces between words 
     { '.', ".-.-.-" } , 
     { '!' , "..--.." } , 
     { '?' , "-.-.--"} 
    }; 

    auto morseString = morseCode.find(toUpper(c)); 
    if(morseString != morseCode.end()) { 
     return morseString->second; 
    } 
    return ""; 
} 

и использовать его как:

int main() { 
    stringstream ss; 
    string sentence; 

    cout << "Enter a English word, number or punctuation: "; 
    getline(cin, sentence); 
    ss << sentence; 
    cout << "Morse code: " << endl; 
    char c; 
    while(ss >> c) { 
     cout << CharToMorse(c); 
    } 
    cout << endl; 
} 

Проблемы с вашим фактическим кодом, что делает предположение, опираясь на таблицы отображений ASCII кодов символов, а 'Z' - 'A' == 25.
Это не гарантируется стандартом C++ и делает ваш код незарегистрированным (см. Также here).

+1

Следующим шагом эволюции было бы разделение основных данных морзе от его представления. Вместо «std :: string» отображаемый тип «std :: map» может быть классом типа «МорзеКод», который внутри хранит серию «точек» и «дефис», например. член данных 'private' типа' std :: bitset'. А затем предоставите функцию типа 'std :: string ToString (MorseCode const & morse_code)'. –

+0

@Christian Конечно. Давайте сохраним это просто для newb. Вы настоящий энтузиаст ;-). Не стоит забывать, что для такого класса должно быть достаточно 'std :: set '. –

+0

@ LasseHedegard Прекратите редактировать мой ответ, пожалуйста. Вместо этого улучшите свой вопрос. –