В
Все
М
Математика
О
ОБЖ
У
Українська мова
Д
Другие предметы
Х
Химия
М
Музыка
Н
Немецкий язык
Б
Беларуская мова
Э
Экономика
Ф
Физика
Б
Биология
О
Окружающий мир
Р
Русский язык
У
Українська література
Ф
Французский язык
П
Психология
А
Алгебра
О
Обществознание
М
МХК
В
Видео-ответы
Г
География
П
Право
Г
Геометрия
А
Английский язык
И
Информатика
Қ
Қазақ тiлi
Л
Литература
И
История
alexrukek
alexrukek
12.05.2021 15:29 •  Информатика

Есть готовая программа телеграф в паскале 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.

Показать ответ
Ответ:
loikomatveico
loikomatveico
08.07.2020 07:58
{
Если мы попробуем кодировать точку нулем, тире - единицей, то получаем число
в двоичной системе с максимальным числом разрядов, равным 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.
0,0(0 оценок)
Ответ:
Galinachlen
Galinachlen
08.07.2020 07:58
Program telegraf2014;
uses crt;
label m;
var
  a: array[1..32] of string;
  i, j: integer;
  t,s: string;
begin   
a[1] := '.-';a[2] := '-...';a[3] := '.---';a[4] := '--.';a[5] := '-..';a[6] := '.';a[7] := '...-';a[8] := '--..';a[9] := '..';a[10] := '.---';a[11] := '-.-';a[12] := '.-..';a[13] := '--';a[14] := '-.';a[15] := '---';a[16] := '.--.';a[17] := '.-.';a[18] := '...';a[19] := '-';a[20] := '..-';a[21] := '..-.';a[22] := '';a[23] := '-.-.';a[24] := '---.';a[25] := '';a[26] := '--.-';a[27] := '-..-';a[28] := '-.--';a[29] := '-..-';a[30] := '..-..';a[31] := '..--';a[32] := '.-.-';   
m: ClrScr;     
GotoXY(30, 1);     
writeln('Это программа телеграф');     
GotoXY(18, 2);     
writeln('Введите телеграфный код');     
readln(t);     
repeat
        j:=pos(' ',t);
        if j>0 then s:=copy(t,1,j-1)
          else
            begin
            s:=t;
            t:='';
            end;
        delete(t,1,j);
        for i:=1 to 32 do
          if a[i]=s then write(chr(i+223));
        until t='';     
readln;      
goto m;
end.
0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота