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

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы 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; 
}
 
L

lazybiz

ALDon
Может как-то сожмешь по вертикали!? Читать невозможно...

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

ALDon

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

ALDon

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

DarkKnight

2 ALDon :
Ал, вот посмотри, тут тебе понятнее будет, писал не так давно. link removed
 
A

ALDon

2 ALDon :
Ал, вот посмотри, тут тебе понятнее будет, писал не так давно. link removed

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

DarkKnight

У тебя там пример кодирования в Морзу,а мне декодировать надо
А разница??? ;-))) Алгоритм же в обоих направлениях действует, чуть-чуть переделать нужно только ;-)

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

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

ALDon

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

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

DarkKnight

Ну вот как то так, если сильно не заморачиваться с заменой кода:
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 КБ · Просмотры: 591
  • morse_2.jpg
    morse_2.jpg
    22,2 КБ · Просмотры: 579
Мы в соцсетях:

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