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

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

ALDon

Гость
#1
Вводится код Морзе,нужно декодировать этот код на английские буквы.Посмотрел на Азбуку Морзе с Википедии.
[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; 
}
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#2
ALDon
Может как-то сожмешь по вертикали!? Читать невозможно...

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

ALDon

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

Refrator

Гость
#4
красиво написано кратка и компактно
 
A

ALDon

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

ALDon

Гость
#7
2 ALDon :
Ал, вот посмотри, тут тебе понятнее будет, писал не так давно. http://codeby.net/ipb.html?s=&sh...st&p=185181
У тебя там пример кодирования в Морзу,а мне декодировать надо ,при этом главной трудностью является .Напр: если '.' это буква A и ' .-' это буква B ,и если я ввожу '.- ' оно выводит букву A, а не B
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#8
У тебя там пример кодирования в Морзу,а мне декодировать надо
А разница??? ;-))) Алгоритм же в обоих направлениях действует, чуть-чуть переделать нужно только ;-)

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

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

ALDon

Гость
#9
Вообщем, если мой код тебе более менее понятен, то могу помочь переделать, там делов то....
Я пробовал переделать твой код, но сталкиваюсь той же проблемой ,который я упоминул выше, Пожалуйста помоги переделать этот код!!!!!!
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#10
Ну вот как то так, если сильно не заморачиваться с заменой кода:
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;
}
 

Вложения