• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Автор темы ALDon
  • Дата начала Дата начала
A

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; 
}
 
ALDon
Может как-то сожмешь по вертикали!? Читать невозможно...

И выровни по блокам! Чем больше ты помогаешь нам - тем быстрее мы помогаем тебе!
 
Я не понял т,е надо установить эти символы в переменную и сравнивать его в введенными данными,если совпадает вывести эту переменную ?Я успешно кодировал англ. буквы и цифры в Морзе,таким оброзом,эту задачу то же хотел так решить
 
мы не проходили это, можеш написать по другому,хоть длиннее,но по понятнее,можеш и не писать цифры и буквы(только оставь комменты куда надо писать) Морзе я сам напишу
 
2 ALDon :
Ал, вот посмотри, тут тебе понятнее будет, писал не так давно. link removed
 
2 ALDon :
Ал, вот посмотри, тут тебе понятнее будет, писал не так давно. link removed

У тебя там пример кодирования в Морзу,а мне декодировать надо ,при этом главной трудностью является .Напр: если '.' это буква A и ' .-' это буква B ,и если я ввожу '.- ' оно выводит букву A, а не B
 
У тебя там пример кодирования в Морзу,а мне декодировать надо
А разница??? ;-))) Алгоритм же в обоих направлениях действует, чуть-чуть переделать нужно только ;-)

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

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

Я пробовал переделать твой код, но сталкиваюсь той же проблемой ,который я упоминул выше, Пожалуйста помоги переделать этот код!!!!!!
 
Ну вот как то так, если сильно не заморачиваться с заменой кода:
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
    19,6 КБ · Просмотры: 618
  • morse_2.jpg
    morse_2.jpg
    22,2 КБ · Просмотры: 610
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!