Есть готовая программа телеграф в паскале 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.
157
397
Ответы на вопрос:
{если мы попробуем кодировать точку нулем, тире - единицей, то получаем число в двоичной системе с максимальным числом разрядов, равным 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.
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.
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
Yanchic0223.01.2022 17:13
-
mashamariya1111110.04.2022 11:18
-
so9a06.04.2022 18:18
-
xiumin9003.02.2020 22:06
-
AFilchac04.06.2021 08:53
-
Semykina200325.03.2023 14:28
-
Кет123503.02.2022 01:53
-
Nadya111111111111131.10.2020 11:43
-
skripalevadiana15.09.2020 20:25
-
kashamovasha30.06.2022 16:45
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.