Есть готовая программа Телеграф в Паскале ABC, которая переводит из букв в код Морзе. Помогите сделать так,чтобы она переводила из введенного кода в русские буквыprogram telegraf2014;uses crt;label m;var a:array['а'..'я'] of st...

Есть готовая программа Телеграф в Паскале 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.
Гость
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.
Не нашли ответ?
Ответить на вопрос
Похожие вопросы