Я делал программу, которая конвертирует буквы, цифры и знаки препинания в азбуку Морзе.
С буквами и цифрами он работает так, как я хочу.
Но с пунктуацией я не могу заставить это работать должным образом. Я надеялся, что кто-нибудь сможет взглянуть на мой код и помочь мне.
#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;
}
Ваша основная проблема заключается в том, что вы не предоставили брекеты для 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 ++ и делает ваш код непереносимым (см. Вот также).
Других решений пока нет …