Перевести текст из азбуки в Морзе в обычную запись - Free Pascal
Формулировка задачи:
Помогите пожалуйста.
Нужно перевести из азбуки в Морзе в обычную запись.
При вводе текста буквы разделяются одним пробелом, а слова двумя и более пробелами.
var
s, s1, s2:string;
i,j,l,r:integer;
mrz:array[1..32] of string=
('.-','-...','.--','--.','-..','.','...-','--..',
'..','.---','-.-','.-..','--','-.','---','.--.',
'.-.','...','-','..-','..-.','....','-.-.','---.',
'----','--.-','-..-','-.--','-..-','..-.','..--','.-.-');
b: string='АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
begin
readln (s);
l:=0;
r:=0;
for i:=1 to length(s)+1 do
begin
if (s[i]=' ') or (i=length(s)+1) then
begin
r:=i;
s1:=copy(s,l+1,r-l-1);
l:=i;
for j:=1 to 32 do begin
if s1=mrz[j] then s2:=b[j];
if s1='' then s2:=' ';
end;
write(s2);
end;
end;
end.Решение задачи: «Перевести текст из азбуки в Морзе в обычную запись»
textual
Листинг программы
Const
nM = 32;
zn = ['.','-'];
Var
mrz : array[1..nM] of string :=
('.-','-...','.--','--.','-..','.','...-','--..',
'..','.---','-.-','.-..','--','-.','---','.--.',
'.-.','...','-','..-','..-.','....','-.-.','---.',
'----','--.-','-..-','-.--','-..-','..-.','..--','.-.-');
RUch : string :='аАбБвВгГдДеЕжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ';
Function Mcod(S : String) : String;
Var i,k : Integer;
sc : String;
Begin
sc:='';
For i:=1 to Length(S) do
Begin
k:=Pos(S[i],RUch);
If k>0 then sc:=sc+mrz[(k+Ord(Odd(k))) div 2]+' ' else sc:=sc+S[i];
end;
If sc[Length(sc)]=' ' then Delete(sc,Length(sc),1);
Mcod:=sc;
end;
Function GetCharM(ss : String) : String;
Var j : Integer;
Begin
GetCharM:=ss;
For j:=1 to nM do If mrz[j]=ss then GetCharM:=RUch[j*2];
end;
Function Mdecod(S : String) : String;
Var i,j,k : Integer;
sc : String;
Begin
sc:=''; k:=0; S:=S+'~';
For i:=1 to Length(S) do
Begin
If not (S[i] in zn) then
Begin
If k<>0 then
Begin
sc:=sc+GetCharM(Copy(S,k,i-k));
k:=0;
end;
If (S[i]=' ') and (S[i+1]=' ') then sc:=sc+S[i];
end
else If k=0 then k:=i;
end;
Mdecod:=sc;
end;
Begin
Writeln(Mcod('Азбука Морзе'));
Writeln(Mdecod(Mcod('Азбука Морзе')));
end.
Объяснение кода листинга программы
- В коде определены две константы:
nM- количество символов в азбуке Морзе (32), иzn- массив из двух символов, обозначающих точки и тире, используемые в азбуке Морзе. - Далее определены две переменные:
mrz- массив строк, содержащий соответствие между символами азбуки Морзе и обычной записи, иRUch- строка, содержащая алфавит в обычной записи. - Затем определены две функции:
Mcod, преобразующая обычный текст в азбуку Морзе, иGetCharM, преобразующая символ азбуки Морзе в соответствующий символ обычной записи. - Функция
Mdecodвыполняет обратное преобразование, преобразуя текст из азбуки Морзе в обычный текст. - В основной части программы вызываются функции
McodиMdecodдля преобразования строки 'Азбука Морзе' в азбуку Морзе, и обратно в обычный текст. Результат выводится на экран.