Опубликовано 03.01.2018 по предмету Информатика от Гость

Есть готовая программа Телеграф в Паскале ABC, которая переводит из букв в код Морзе. Помогите сделать так,чтобы она переводила из введенного кода в русские буквы
program telegraf2014;uses crt;label m;var a:array[а..я] of string; i,j:integer; t:string;begina[а]:=.-;a[б]:=-...;a[в]:=.---;a[г]:=--.;a[д]:=-..;a[е]:=.;a[ж]:=...-;a[з]:=--..;a[и]:=..;a[й]:=.---;a[к]:=-.-;a[л]:=.-..;a[м]:=--;a[н]:=-.;a[о]:=---;a[п]:=.--.;a[р]:=.-.;a[с]:=...;a[т]:=-;a[у]:=..-;a[ф]:=..-.;a[х]:=....;a[ц]:=-.-.;a[ч]:=---.;a[ш]:=----;a[щ]:=--.-;a[ъ]:=-..-;a[ы]:=-.--;a[ь]:=-..-;a[э]:=..-..;a[ю]:=..--;a[я]:=.-.-;m:ClrScr;GotoXY(30,1);writeln(Это программа телеграф);GotoXY (18,2);writeln(Введите слово строчными буквами на русском языке!);readln(t);beginfor i:=1 to length(t) dobeginif t[i]<> thenbeginwrite (a[t[i]], ); end; end;readln; end;goto m;end.

Ответ оставил Гость

{
Если мы попробуем кодировать точку нулем, тире - единицей, то получаем число
в двоичной системе с максимальным числом разрядов, равным 4. К сожалению,
в такой кодировке комбинации, начинающиеся с точки, будут неоднозначными,
потому что будут начинаться с незначащих нулей. Для устранения неоднозначности можно добавить еще три бита слева, которые будут указывать количество точек в коде до первого тире (0-4), но лучше добавить 4 бита и использовать для кодирования полный байт. Тогда его первая шестнадцатиричная цифра даст число незначащих нулей (точек), а вторая - сам код. Исключение - символ э, который кодируется 5 символами.
Для разделения слов введем еще символ пробела -...-

а .-     0001 0001 &11 = 17
б -...   0000 1000 &08 =  8
в .--    0001 0011 &13 = 19
г --.    0000 0110 &06 =  6
д -..    0000 0100 &04 =  4
е .      0001 0000 &10 = 16
ж ...-   0011 0001 &31 = 49
з --..   0000 1100 &0C = 12
и ..     0010 0000 &20 = 32
й .---   0001 0111 &17 = 23
к -.-    0000 0101 &05 =  5
л .-..   0001 0100 &14 = 20
м --     0000 0011 &03 =  3
н -.     0000 0010 &02 =  2
о ---    0000 0111 &07 =  7
п .--.   0001 0110 &16 = 22
р .-.    0001 0010 &12 = 18
с ...    0011 0000 &30 = 48
т -      0000 0001 &01 =  1
у ..-    0010 0001 &21 = 33
ф ..-.   0010 0010 &22 = 34
х ....   0100 0000 &40 = 64
ц -.-.   0000 1010 &0A = 10
ч ---.   0000 1110 &0E = 14
ш ----   0000 1111 &0F = 15
щ --.-   0000 1101 &0D = 13
ъ -..-   0000 1001 &09 =  9
ы -.--   0000 1011 &0B = 11
ь -..-   0000 1001 &09 =  9
э ..-..  0011 0100 &34 = 52
ю ..--   0010 0011 &23 = 35
я .-.-   0001 0101 &15 = 21

Конечно, можно было бы просто поместить коды в элементы массива и поиск
нужного производить поэлементым сравнением, но принятая нами кодировка позволит получать номер элемента массива сразу. Иными словами, мы построили так называемую ХЭШ-ФУНКЦИЮ для доступа к таблице перекодировки. Это очень популярное решение, которое применяется достаточно часто в различных алгоритмах кодировки и поиска.
Максимальный номер среди полученных нами = 64, минимальный - 1. Следовательно, нужно создать массив T[1..64] и поместить русские буквы в элементы с соответствующими индексами (а - в 17-й элемент, б - в 8-й и т.д.)
Получив очередное слово - "символ" азбуки Морзе, например, ..-., выполняем
следующие шаги:
1) Если пять правых символов слова равны ..-.., искомый символ T[52];
2) Если пять правых символов слова равны -...-, искомый символ T[63];
3) Подсчитываем k - количество точек в четырех правых символах слова
a5a6a7a8, пока не встретим тире. Вычисляем значение k:=16*k;
4) Начиная с первого слева тире заменяем в символах слова точки нулями,
тире - единицами;
5) Вычисляем сумму n=a5*8+a6*4+a7*2+a8 и увеличиваем на нее значение k.
k:=k+n
6) Искомый символ равен T[k]
Алгоритм кажется сложным, но его реализация в функции Hash проста.
}

var
  ptr: integer;

function Hash(s: string): integer;
{Возвращает номер элемента в таблице Т по коду Морзе из строки s}
var
  i, k, n, m: integer;
begin
  if s = then Result := 0
  else if s = ..-.. then Result := 52
  else if s = -...- then Result := 63
  else begin
    i := 1;
    k := 0;
    while i <= length(s) do
      if s[i] = . then
      begin
        i := i + 1;
        k := k + 1
      end
      else i := 5;
    n := 0;
    m := 1;
    for i := length(s) downto max(k, 1) do
    begin
      if s[i] = - then n := n + m;
      m := m * 2
    end;
    Result := 16 * k + n
  end
end;

function GetWord(s: string): string;
{Возвращает очередное слово строки s, начиная поиск с позиции ptr
По окончании поиска ptr устанавливается на следующий за пробелом символ или
выходит за конец строки}
var
  i: integer;
  c: string;
begin
  c := ;
  i := PosEx( , s, ptr);
  if i > 0 then
  begin
    Result := Copy(s, ptr, i - ptr);
    ptr := i + 1
  end
  else
  begin
    Result := Copy(s, ptr, length(s) - ptr + 1);
    ptr := length(s) + 1
  end;
end;



var
  s: string;
  n: integer;
  T: array[1..64] of char;

begin
  T[17] := а; T[8] := б; T[19] := в; T[6] := г; T[4] := д;
  T[16] := е; T[49] := ж; T[12] := з; T[32] := и; T[23] := й;
  T[5] := к; T[20] := л; T[3] := м; T[2] := н; T[7] := о;
  T[22] := п; T[18] := р; T[48] := с; T[1] := т; T[33] := у;
  T[34] := ф; T[64] := х; T[10] := ц; T[14] := ч; T[15] := ш;
  T[13] := щ; T[11] := ы; T[9] := ь; T[52] := э; T[35] := ю;
  T[21] := я; T[63] := ;
  { для отладки
  s := --.. -.. .-. .- .-- ... - .-- ..- .--- -...- -- .. .-.;}
  writeln(Введите строку в коде Морзе, пробел кодируется -...-);
  readln(s);
  ptr := 1;
  n := 100;
  write(Раскодировка: );
  while n > 0 do
  begin
    n := Hash(GetWord(s));
    if n > 0 then write(T[n]);
  end;

Тестовое решение:

Введите строку в коде Морзе, пробел кодируется -...-
--.. -.. .-. .- .-- ... - .-- ..- .--- -...- -- .. .-.
Раскодировка: здравствуй мир
  writeln
end.


Не нашел нужный ответ?

Если ответ по предмету Информатика отсутствует или он оказался неправильным, то попробуй воспользоваться поиском других ответов во всей базе сайта.


Найти другие ответы
Самые новые вопросы