Предмет: Информатика,
автор: nikitenkoljona
Есть готовая программа Телеграф в Паскале 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.
Ответы
Автор ответа:
0
{
Если мы попробуем кодировать точку нулем, тире - единицей, то получаем число
в двоичной системе с максимальным числом разрядов, равным 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.
Если мы попробуем кодировать точку нулем, тире - единицей, то получаем число
в двоичной системе с максимальным числом разрядов, равным 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.
Похожие вопросы
Предмет: Химия,
автор: Lucky969
Предмет: Математика,
автор: AvaSmith1904
Предмет: Математика,
автор: Аноним
Предмет: География,
автор: maksimbelyaev