Какая функция для азбуки Морзе в тексте Engli sh? - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу узнать, как go из азбуки Морзе вернуться к тексту. Код Морзе должен читаться в этом формате ... / --- / ... каждый символ отделяется символом "/". Я полагаю, вам придется разделить каждый код и сохранить его во временную строку, чтобы затем найти ее переменную engli sh, а затем сбросить временную строку

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

void displayMenu();
char menuChoice();
string toMorse(char);

const int NumChar = 26;

string morse[NumChar] = {
    ".-", "-...","-.-.", "-..", ".", "..-.",
    "--.", "....", "..", ".---",
    "-.-", ".-..", "--", "-.",
    "---", ".--.", "--.-", ".-.",
    "...", "-", "..-", "...-",
    ".--", "-..-", "-.--", "--.."
};

int main()
{
    cout<<"This is the Morse Code Converter."<<endl;
    char menu = 0, c;
    string str;
    do{
        switch(menu){
            case 'A':
                cout<<"Enter a word and I will translate it to Morse Code: \n";
                toMorse(c);
                break;
            case 'B':
                cout<<"Enter a Morse Code separated by /s and I will translate it to text.\n";
                break;
        }
        menu=menuChoice();
    }while(menu!='C');

    return 0;
}

void displayMenu(){
    cout<<"A) Text to Morse code"<<endl;
    cout<<"B) Morse code to text"<<endl;
    cout<<"C) Quit"<<endl;
}
char menuChoice(){
    char menu;
    displayMenu();
    cout<<"Pick Choice: ";
    cin>>menu;
    menu=toupper(menu);
    cin.ignore(1,'\n');

    while((menu<'A')||(menu>'C')){
        displayMenu();
        cout<<"Enter in a proper choice: ";
        cin>>menu;
        menu= toupper(menu);
        cin.ignore(1,'\n');
    }
        return menu;
}
string toMorse(char) {
    char letter[100];
    cin>>letter;
    int error=0;
    for (int i=0;i<strlen(letter);i++){
        letter[i]=toupper(letter[i]);
        for (int j=0;j<26;j++){
            if ( int(letter[i])-65 == j){
                error=1;
                cout<<morse[int(letter[i])-65]<<endl;
                break;
            }
        }
        if (error==0){
            cout<<"Error : word contains symbols"<<endl;
            break;
        }
    }
}

Это та часть, на которой я застрял прямо сейчас Я знаю, что я должен делать, но я не знаю, как написать это в коде.

string toEnglish(char,string) {

}

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Я рекомендую вам использовать таблицу mapping , которая представляет собой массив или std::vector пар:

struct Key_Value
{
    const * morse;
    char    alpha;
};

struct Key_Value    conversion_table[] =
{
    {".", 'E'},
    {"-", 'T'},
};
unsigned int size_conversion_table =
    sizeof(conversion_table) / sizeof(conversion_table[0]);

Если вы введете «слово» Морзе, вы можете go через таблицу сравнения слова с полем «Морзе» в строке. Если есть совпадение, используйте поле alpha, чтобы получить символ.

Пример:

std::string morse_letter = ".";
bool found = false;
char english_letter = '*';
for (unsigned int i = 0; i < size_conversion_table; ++i)
{
    std::string table_string = conversion_table[i].morse;
    if (morse_letter == table_string)
    {
        english_letter = conversion_table[i].alpha;
        found = true;
        break;
    }
}  

Одна приятная особенность поиска в таблице состоит в том, что вы можете получить код, работающий для 2 записей, а затем добавить больше записей без необходимости изменения кода.

Вы можете использовать ту же таблицу для отображения Engli sh писем к азбуке Морзе.

0 голосов
/ 10 апреля 2020

Использовать карту было бы проще, но, поскольку у вас уже есть массив с азбукой Морзе, вы можете использовать это. Вы можете использовать std::find, чтобы найти азбуку в массиве и преобразовать ее результат в символ:

#include <string>
#include <iostream>
#include <algorithm>


std::string morse[] = {".-", "-...","-.-.", "-..", ".", "..-.",
"--.", "....", "..", ".---",
"-.-", ".-..", "--", "-.",
"---", ".--.", "--.-", ".-.",
"...", "-", "..-", "...-",
".--", "-..-", "-.--", "--.."
};

char get_char(std::string m) {
    auto it = std::find(std::begin(morse),std::end(morse),m);
    if (it == std::end(morse)) return '0';
    return 'a' + std::distance(std::begin(morse),it);
}

int main () {
    std::cout << get_char("..-.") << get_char("---") << get_char("---");
}

Выход:

foo

PS: если функция, которую вы ищете предполагается преобразовать полную строку из множества азбуки Морзе в строку engli sh, тогда я неправильно понял ваш вопрос, и это потребовало бы немного больше информации с вашей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...