Задача: Декодировать код Морзе

Тема в разделе "C/C++/C#", создана пользователем ALDon, 12 ноя 2010.

  1. ALDon

    ALDon Гость

    Вводится код Морзе,нужно декодировать этот код на английские буквы.Посмотрел на Азбуку Морзе с Википедии.
    [post="0"]http://en.wikipedia.org/wiki/Morse_code[/post]
    Есть один пробел между каждым Морза-закодированными буквами и три пробела между каждым Морза-закодированным словом.Например:
    МЫ вводим
    -.. . -.-. --- -.. . .- --.. -... ..- -.- .- -- --- .-. --.. .

    Выводится:
    DECODE AZBUKA MORZE

    Я пробовал сам решить эту задачу,но не получилось,если не трудно не надо писать код сначала,а продолжите мой код(т.е помогите исправить ошибки в моем коду)
    Вот код написал
    Код (C++):
    #include <iostream>
    #include <string>

    using namespace std;
    int main(){
    string mas;
    getline(cin,mas);

    int i=0;

    for(int i=0;i<mas.size();i++){


    if(mas[i]=='.')


    cout<<"E";

    if(mas[i]=='-'){


    if( mas[i+1]=='.'){


    cout<<"N";


    i++;}}


    if(mas[i]=='-'){


    if(mas[i+1]=='-') {


    cout<<"M";


    i++;}}

    if(mas[i]=='-'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){


    cout<<"D";


    i+2;}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='-'){


    cout<<"O";


    i+2;}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='.'){


    cout<<"B";


    i+3;}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='.'){


    cout<<"C";


    i+3;}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='-'){


    cout<<"Q";


    i+3;}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='-'){


    cout<<"X";


    i+3;}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='-'){


    cout<<"Y";


    i+3;}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='.'){


    cout<<"Z";


    i+3;}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='.'){
    if(mas[i+4]=='.'){


    cout<<"6";


    i+4;}}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='.'){
    if(mas[i+4]=='.'){


    cout<<"7";


    i+4;}}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='.'){
    if(mas[i+4]=='.'){


    cout<<"8";


    i+4;}}}}}
    if(mas[i]=='-'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='-'){
    if(mas[i+4]=='.'){


    cout<<"9";


    i+4;}}}}}
    //for(int i=0;i<mas.size();i++){


    if(mas[i]=='-')


    cout<<"T";

    if(mas[i]=='.'){


    if( mas[i+1]=='-'){


    cout<<"A";


    i++;}}


    if(mas[i]=='.'){


    if(mas[i+1]=='.') {


    cout<<"I";


    i++;}}

    if(mas[i]=='.'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='.'){


    cout<<"R";


    i+2;}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){


    cout<<"S";


    i+2;}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='-'){


    cout<<"U";


    i+2;}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='.'){


    cout<<"F";


    i+3;}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='-'){


    cout<<"J";


    i+3;}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='.'){


    cout<<"L";


    i+3;}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='.'){


    cout<<"P";


    i+3;}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='-'){


    cout<<"V";


    i+3;}}}}

    if(mas[i]=='.'){


    if(mas[i+1]=='-') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='-'){
    if(mas[i+4]=='-'){


    cout<<"1";


    i+4;}}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='-'){
    if(mas[i+3]=='-'){
    if(mas[i+4]=='-'){


    cout<<"2";


    i+4;}}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='-'){
    if(mas[i+4]=='-'){


    cout<<"3";


    i+4;}}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='.'){
    if(mas[i+4]=='-'){


    cout<<"4";


    i+4;}}}}}
    if(mas[i]=='.'){


    if(mas[i+1]=='.') {
    if(mas[i+2]=='.'){
    if(mas[i+3]=='.'){
    if(mas[i+4]=='.'){


    cout<<"5";


    i+4;}}}}}
    }
    cout<<"\n";
    return 0;
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    ALDon
    Может как-то сожмешь по вертикали!? Читать невозможно...

    И выровни по блокам! Чем больше ты помогаешь нам - тем быстрее мы помогаем тебе!
     
  3. ALDon

    ALDon Гость

    Я не понял т,е надо установить эти символы в переменную и сравнивать его в введенными данными,если совпадает вывести эту переменную ?Я успешно кодировал англ. буквы и цифры в Морзе,таким оброзом,эту задачу то же хотел так решить
     
  4. Refrator

    Refrator Гость

    красиво написано кратка и компактно
     
  5. ALDon

    ALDon Гость

    мы не проходили это, можеш написать по другому,хоть длиннее,но по понятнее,можеш и не писать цифры и буквы(только оставь комменты куда надо писать) Морзе я сам напишу
     
  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
  7. ALDon

    ALDon Гость

    У тебя там пример кодирования в Морзу,а мне декодировать надо ,при этом главной трудностью является .Напр: если '.' это буква A и ' .-' это буква B ,и если я ввожу '.- ' оно выводит букву A, а не B
     
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    А разница??? ;-))) Алгоритм же в обоих направлениях действует, чуть-чуть переделать нужно только ;-)

    А коды букв обязательно должны разделятся пробелами, даже когда азбука морзе в работе была на кораблях, была пауза между буквами, что бы точно код можно принять...

    Вообщем, если мой код тебе более менее понятен, то могу помочь переделать, там делов то....
     
  9. ALDon

    ALDon Гость

    Я пробовал переделать твой код, но сталкиваюсь той же проблемой ,который я упоминул выше, Пожалуйста помоги переделать этот код!!!!!!
     
  10. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Ну вот как то так, если сильно не заморачиваться с заменой кода:
    Код (C++):
    /*
    codeby.net
    Autor: DarkKnight125
    */

    #include <iostream>
    #include <locale.h> //для локали
    #include <Windows.h> //только для локали
    #include <ctype.h> // для isspace

    using namespace std;

    char Morse[255][7]; //Наш как бы ассоциативный массив

    void InitMorse(void) //функция инициализации массива, русские буквы имеют значение со знаком минус, поэтому правельно будет
    //приобразовать знаение к беззнаковому типу
    {
    strcpy(Morse[(unsigned char) 'А'],".- ");
    strcpy(Morse[(unsigned char) 'Б'],"-.. ");
    strcpy(Morse[(unsigned char) 'В'],".-- ");
    strcpy(Morse[(unsigned char) 'Г'],"--. ");
    strcpy(Morse[(unsigned char) 'Д'],"-... ");
    strcpy(Morse[(unsigned char) 'Е'],". ");
    strcpy(Morse[(unsigned char) 'Ё'],"..-.. ");
    strcpy(Morse[(unsigned char) 'Ж'],"...- ");
    strcpy(Morse[(unsigned char) 'З'],"--.. ");
    strcpy(Morse[(unsigned char) 'И'],".. ");
    strcpy(Morse[(unsigned char) 'К'],"-.- ");
    strcpy(Morse[(unsigned char) 'Л'],".-.. ");
    strcpy(Morse[(unsigned char) 'М'],"-- ");
    strcpy(Morse[(unsigned char) 'Н'],"-. ");
    strcpy(Morse[(unsigned char) 'О'],"--- ");
    strcpy(Morse[(unsigned char) 'П'],".--. ");
    strcpy(Morse[(unsigned char) 'Р'],".-. ");
    strcpy(Morse[(unsigned char) 'С'],"... ");
    strcpy(Morse[(unsigned char) 'Т'],"- ");
    strcpy(Morse[(unsigned char) 'У'],"..- ");
    strcpy(Morse[(unsigned char) 'Ф'],".- ");
    strcpy(Morse[(unsigned char) 'Х'],".... ");
    strcpy(Morse[(unsigned char) 'Ц'],"-.-. ");
    strcpy(Morse[(unsigned char) 'Ч'],"---. ");
    strcpy(Morse[(unsigned char) 'Ш'],"---- ");
    strcpy(Morse[(unsigned char) 'Щ'],"--.- ");
    strcpy(Morse[(unsigned char) 'Ы'],"-.-- ");
    strcpy(Morse[(unsigned char) 'Ю'],"..-- ");
    strcpy(Morse[(unsigned char) 'Я'],".-.- ");
    strcpy(Morse[(unsigned char) 'Й'],".--- ");
    strcpy(Morse[(unsigned char) 'Ъ'],"-..- ");
    strcpy(Morse[(unsigned char) 'Ь'],"-..- ");
    strcpy(Morse[(unsigned char) 'Э'],"..-.. ");
    strcpy(Morse[(unsigned char) ' '],"  ");
    }




    int main (void)
    {
    setlocale(LC_ALL, "Russian");

    SetConsoleCP(1251); //Работаю с Visual C++, Так что для консольных приложений приходится играть с локалью
    //В данном случае для инициализации массива Азбуки Морзе

    InitMorse(); //Ицициализируем массив

    char buffer[1024]; //Буфер, в него мы вводим искомую строку

    SetConsoleCP(866); //Меняем консоль, что бы диалог вывелся не кракозябрами :-) Винда мать ее за ногу) Вывод в 866-codepage, ввод в 1251 :-) Че попало)
    cout<<"Введите строку в коде Морзе (буквы разделяя пробелом, а слова двумя или более):"<<endl;

    SetConsoleCP(1251);
    cin.getline(buffer,1024); //Получаем строку, только сначало кодировку опять поправим


    strcpy(buffer,strupr(buffer)); //из всех букв сделаем ВЕРХНИЙ регистр, короче CAPS

    SetConsoleCP(866); //Ну что бы дальше вывести все нормально опять переключаемся в 866
    cout<<endl<<endl<<"Введенная вами строка :"<<buffer<<endl;
    cout<<"Декодирование : ";


    char MorseWord[1024]; //Введем буферную переменную в которую будем писать завершенный код морзе для 1 буквы
    char *ptr = MorseWord; //Заведем указатель на нее
    memset(MorseWord,0,1024); //Обнулим ее
    for (int i=0;i<=strlen(buffer);i++) //Обходим каждый символ нашего буфера
    {
    if (isspace ((unsigned char)buffer[i]) || buffer[i]==0) //Если встретился пробел или завершающий символ
    {
    if (strlen(MorseWord) == 0) //Если повторный пробел поставим в предложении пробел
    {
    cout<<" ";
    continue;
    }
    *ptr = ' '; //Добавим пробел к коду морзе, т.к. я массив с конечным пробелом описывал
    for (int j=0;j<256; j++) //Переберем массив
    {
    if (strcmp(Morse[j],MorseWord)==0 || j+1 == 256) //Если строки совпали
    {
    if (j+1 != 256)
    cout<<(char)j; //Выведим символ (букву) на экран
    else cout<<"[?]"; //Если нет ассоциации
    memset(MorseWord,0,1024); //Обнулим буферную переменную
    ptr = MorseWord; //Опять поставим указатель на ее начало
    break; //Прервем вложеный цикл
    }
    }
    }
    else //Если же текущий символ не пробел
    *ptr++ = buffer[i]; //Пишим в буферную переменную текущий символ
    }
    cout<<endl;

    return 0;
    }
     

    Вложения:

    • morse.jpg
      morse.jpg
      Размер файла:
      35 КБ
      Просмотров:
      18
    • morse_2.jpg
      morse_2.jpg
      Размер файла:
      38,5 КБ
      Просмотров:
      12
Загрузка...
Похожие Темы - Задача Декодировать код
  1. Янчик
    Ответов:
    0
    Просмотров:
    473
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    778
  3. elzim
    Ответов:
    0
    Просмотров:
    929
  4. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.116
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.102

Поделиться этой страницей