2017-02-11 3 views
0

J'ai fait un programme qui convertit les lettres, les nombres et les ponctuations en code morse.C++ convertir ASCII en code morse

Avec les lettres et les chiffres fonctionnent comme je le veux.

Mais avec les ponctuations je ne peux pas le faire fonctionner correctement. J'espérais que quelqu'un pourrait jeter un oeil à mon code et m'aider.

#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

Bienvenue dans Stack Overflow. Veuillez prendre le temps de lire [The Tour] (http://stackoverflow.com/tour) et de consulter le contenu du [Centre d'aide] (http://stackoverflow.com/help/asking) quoi et comment vous pouvez demandez ici. –

+1

_ "Mais avec les ponctuations je ne peux pas le faire fonctionner correctement." _ Quel est votre problème réel? Quelle est l'entrée, la sortie attendue et la sortie réelle? –

+0

Au moment où je veux être en mesure d'entrer: point, point d'interrogation et marque eksklamation. Quand je saisis le point, il le convertit très bien. Mais quand j'introduis les deux autres ça me donne:? U ???. –

Répondre

1

Votre principal problème est que vous avez manqué de fournir des accolades pour la boucle while() dans votre fonction 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 

Une approche généralement mieux serait:

Carte tous connus caractères qui peuvent être convertis en code morse en utilisant un std::map<char,std::string>, et ont une seule fonction pour gérer ceux-ci:

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 ""; 
} 

et l'utiliser comme:

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; 
} 

Le problème avec votre code actuel est qu'il fait des hypothèses reposant sur les correspondances des tables de caractères ASCII, et que 'Z' - 'A' == 25.
Ceci n'est pas garanti par la norme C++ et rend votre code non-portable (voir aussi here).

+1

La prochaine étape de l'évolution serait de séparer les données morse sous-jacentes de sa représentation. Au lieu de 'std :: string', le type mappé de' std :: map' pourrait être une classe comme 'MorseCode', qui stocke en interne la série de" points "et" traits d'union "comme par ex. un membre de données 'private' de type' std :: bitset'. Et puis fournissez une fonction comme 'std :: string ToString (MorseCode const & morse_code)'. –

+0

@ Christian Bien sûr. Gardons les choses simples pour le newb. Vous êtes un vrai passionné ;-). Ne pas oublier, avec une telle classe, un 'std :: set ' devrait suffire. –

+0

@LasseHedegard Arrêtez d'éditer ma réponse s'il vous plaît. Améliorez votre question à la place. –