Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2022, 08:33   #1
KaLivaN_853
Новичок
Джуниор
 
Регистрация: 17.06.2022
Сообщений: 1
По умолчанию Проблема с программой для перевода азбуки Морзе в Английский текст

Доброго времени суток.
Пытался сделать программу для "перевода англоязычного текста в азбуку морзе и обратно". С Английского языка в Морзе программа переводит. А вот если скопировать этаже сообщение и попытаться его перевести в Англоязычный текст, то программа по какой-то неизвестной для меня причине ничего не делает.
Я программист совсем еще начинающий, и если что-то не так, то пожалуйста не ругайте.
P.S. если вы можете сказать как написать код как нибудь более удачно, то буду рад принять к сведению!
И еще, мне уже сказали: "Вы пытаетесь в переменную типа char впихать значение типа String", но я до конца не понимаю что это значит. Вроде же присвоил переменной тип String.

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioGroup1: TRadioGroup;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
implementation

{$R *.lfm}

{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  s,c,d,b:string;
begin
  {s:=LowerCase(Memo1.Text);
   d:='';}
  if RadioButton1.Checked=True then
  begin
   s:=LowerCase(Memo1.Text);
   d:='';
   for i:=1 to Length(s) do
   begin
     if s[i]='a' then
     d:=d+'.-_';
     if s[i]='b' then
     d:=d+'-... ';
     if s[i]='c' then
     d:=d+'-.-. ';
     if s[i]='d' then
     d:=d+'-.. ';
     if s[i]='e' then
     d:=d+'. ';
     if s[i]='f' then
     d:=d+'..-. ';
     if s[i]='g' then
     d:=d+'--. ';
     if s[i]='h' then
     d:=d+'.... ';
     if s[i]='i' then
     d:=d+'.. ';
     if s[i]='j' then
     d:=d+'.--- ';
     if s[i]='k' then
     d:=d+'-.- ';
     if s[i]='l' then
     d:=d+'.-.. ';
     if s[i]='m' then
     d:=d+'-- ';
     if s[i]='n' then
     d:=d+'-. ';
     if s[i]='o' then
     d:=d+'--- ';
     if s[i]='p' then
     d:=d+'.--. ';
     if s[i]='q' then
     d:=d+'--.- ';
     if s[i]='r' then
     d:=d+'.-. ';
     if s[i]='s' then
     d:=d+'... ';
     if s[i]='t' then
     d:=d+'- ';
     if s[i]='u' then
     d:=d+'..- ';
     if s[i]='v' then
     d:=d+'...- ';
     if s[i]='w' then
     d:=d+'.-- ';
     if s[i]='x' then
     d:=d+'-..- ';
     if s[i]='y' then
     d:=d+'-.-- ';
     if s[i]='z' then
     d:=d+'--.. ';
     if s[i]='0' then
     d:=d+'----- ';
     if s[i]='1' then
     d:=d+'.---- ';
     if s[i]='2' then
     d:=d+'..--- ';
     if s[i]='3' then
     d:=d+'...-- ';
     if s[i]='4' then
     d:=d+'....- ';
     if s[i]='5' then
     d:=d+'..... ';
     if s[i]='6' then
     d:=d+'-.... ';
     if s[i]='7' then
     d:=d+'--... ';
     if s[i]='8' then
     d:=d+'---.. ';
     if s[i]='9' then
     d:=d+'----. ';
     if s[i]='.' then
     d:=d+'...... ';
     if s[i]=',' then
     d:=d+'.-.-.- ';
     if s[i]=';' then
     d:=d+'-.-.-. ';
     if s[i]=':' then
     d:=d+'---... ';
     if s[i]='?' then
     d:=d+'..--.. ';
     if s[i]='!' then
     d:=d+'--..-- ';
     if s[i]='-' then
     d:=d+'-....- ';
     if s[i]='(' then
     d:=d+'.-.--.- ';
     if s[i]=')' then
     d:=d+'-.--.- ';
   end;
   Memo2.Lines.Add(d);
  end
  else
  if RadioButton2.Checked=True then
  begin
   c:=(Memo1.Text);
   b:='';
   for i:=1 to Length(s) do
   begin
     if s[i]='.-_' then
     d:=d+'a';
     if s[i]='-... ' then
     d:=d+'b';
     if s[i]='-.-. ' then
     d:=d+'c';
     if s[i]='-.. ' then
     d:=d+'d';
     if s[i]='. ' then
     d:=d+'e';
     if s[i]='..-. ' then
     d:=d+'f';
     if s[i]='--. ' then
     d:=d+'g';
     if s[i]='.... ' then
     d:=d+'h';
     if s[i]='.. ' then
     d:=d+'i';
     if s[i]='.--- ' then
     d:=d+'j';
     if s[i]='-.- ' then
     d:=d+'k';
     if s[i]='.-.. ' then
     d:=d+'l';
     if s[i]='-- ' then
     d:=d+'m';
     if s[i]='-. ' then
     d:=d+'n';
     if s[i]='--- ' then
     d:=d+'o';
     if s[i]='.--. ' then
     d:=d+'p';
     if s[i]='--.- ' then
     d:=d+'q';
     if s[i]='.-. ' then
     d:=d+'r';
     if s[i]='... ' then
     d:=d+'s';
     if s[i]='- ' then
     d:=d+'t';
     if s[i]='..- ' then
     d:=d+'u';
     if s[i]='...- ' then
     d:=d+'v';
     if s[i]='.-- ' then
     d:=d+'w';
     if s[i]='-..- ' then
     d:=d+'x';
     if s[i]='-.-- ' then
     d:=d+'y';
     if s[i]='--.. ' then
     d:=d+'z';
     if s[i]='----- ' then
     d:=d+'0';
     if s[i]='.---- ' then
     d:=d+'1';
     if s[i]='..--- ' then
     d:=d+'2';
     if s[i]='...-- ' then
     d:=d+'3';
     if s[i]='....- ' then
     d:=d+'4';
     if s[i]='..... ' then
     d:=d+'5';
     if s[i]='-.... ' then
     d:=d+'6';
     if s[i]='--... ' then
     d:=d+'7';
     if s[i]='---.. ' then
     d:=d+'8';
     if s[i]='----. ' then
     d:=d+'9';
     if s[i]='...... ' then
     d:=d+'.';
     if s[i]='.-.-.- ' then
     d:=d+',';
     if s[i]='-.-.-. ' then
     d:=d+';';
     if s[i]='---... ' then
     d:=d+':';
     if s[i]='..--.. ' then
     d:=d+'?';
     if s[i]='--..-- ' then
     d:=d+'!';
     if s[i]='-....- ' then
     d:=d+'-';
     if s[i]='.-.--.- ' then
     d:=d+'(';
     if s[i]='-.--.- ' then
     d:=d+')';
   end;
  end
  else
  ShowMessage('Необходимо выбрать способ перевода!');

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;
  Memo2.Clear;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Form1.Close;
  Form1.Free;
end;

end.
Изображения
Тип файла: png Безымянный.png (21.6 Кб, 20 просмотров)
KaLivaN_853 вне форума Ответить с цитированием
Старый 17.06.2022, 09:10   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,406
По умолчанию

Код:
var s: string;
if s[i] ='.-_' 
элемент строки s[i] это ОДИН символ.
и он НЕ может быть равен НЕСКОЛЬКИМ символам(строке)

http://www.delphibasics.ru/Copy.php
Код:
if copy(s, i, 3) ='.-_'
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.06.2022, 11:00   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,067
По умолчанию

1. Для буквы а почему-то разделителем выбран не пробел, а подчёркивание.
2. Поскольку символы в коде Морзе имеют разную длину, простым Copy не обойтитсь - неизвестен 3-й параметр. Нужно парсить строку для поиска пробела.

Последний раз редактировалось digitalis; 17.06.2022 в 11:03.
digitalis вне форума Ответить с цитированием
Старый 17.06.2022, 12:16   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,406
По умолчанию

Цитата:
2. Поскольку символы в коде Морзе имеют разную длину, простым Copy не обойтитсь - неизвестен 3-й параметр.
для каждой буквы ее длина известна можно каждый раз выбирать(делать copy) нужное число знаков
P.S. длина с пробелом после знака.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.06.2022 в 12:20.
evg_m вне форума Ответить с цитированием
Старый 17.06.2022, 13:37   #5
macomics
Форумчанин
 
Регистрация: 17.04.2022
Сообщений: 614
По умолчанию

А еще стоит при переводе из морзянки в буквы упорядочить строки в азбуке Морзе по убыванию длины
Код:
const
  alphabet: array [0 .. 44] of Char = ('(', '.', '?', ',', '-', ')', ';', '!', ':', '5', '4', '3', '2', '1', '6', '7', '8', '9', '0', 'h', 'v', 'f', 'l', 'p', 'j', 'b', 'x', 'c', 'y', 'z', 'q', 's', 'u', 'r', 'w', 'd', 'k', 'g', 'o', 'i', 'a', 'n', 'm', 'e', 't');
  morzebet: array [0 .. 44] of String = ('.-.--.-', '......', '..--..', '.-.-.-', '-....-', '-.--.-', '-.-.-.', '--..--', '---...', '.....', '....-', '...--', '..---', '.----', '-....', '--...', '---..', '----.', '-----', '....', '...-', '..-.', '.-..', '.--.', '.---', '-...', '-..-', '-.-.', '-.--', '--..', '--.-', '...', '..-', '.-.', '.--', '-..', '-.-', '--.', '---', '..', '.-', '-.', '--', '.', '-');

implemenration

function alpha2morze(alpha: String): String;
var
  i, j: Integer;
  r: String;
begin
  r := '';
  for i := Low(alpha) to High(alpha) do
    for j := Low(alphabet) to High(alphabet) do
      if alpha[i] = alphabet[j] then begin
        r := r + morzebet[j] + ' ';
        break;
      end;
  alpha2morze := r;
end;

function morze2alpha(morze: String): String;
var
  i, j: Integer;
  m, r: String;
begin
  m := morze;
  r := '';
  while Length(m) > 0 do
    for j := Low(morzebet) to High(morzebet) do
      if Pos(mozebet[j], m) = 0 then begin
        r := r + alphabet[j];
        delete(m, Low(m), Length(morzebet[j]));
        while m[Low(m)] = ' ' do delete(m, Low(m), 1);
        break;
      end;
  morze2alpha := r;
end;
Не самый тоже оптимальный вариант, зато набирать было просто.

Последний раз редактировалось macomics; 17.06.2022 в 13:47.
macomics вне форума Ответить с цитированием
Старый 18.06.2022, 11:17   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,067
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
для каждой буквы ее длина известна можно каждый раз выбирать(делать copy) нужное число знаков
Дык мы же из Морзе дешифруем - неизвестно же заранее, что будет за буква !
Простой вариант: копировать 7 символов в tmp строку, там обязательно будет конечный пробел, через Pos находим его позицию и уж тогда копируем нужной длины подстроку, включая завершающий пробел. Дешифруем букву, передвигаем указатель на уже_знаем_сколько позиций и т.д.
Настолько просто, что писать лень.
digitalis вне форума Ответить с цитированием
Старый 18.06.2022, 12:01   #7
macomics
Форумчанин
 
Регистрация: 17.04.2022
Сообщений: 614
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Дык мы же из Морзе дешифруем - неизвестно же заранее, что будет за буква !
Простой вариант: копировать 7 символов в tmp строку, там обязательно будет конечный пробел, через Pos находим его позицию и уж тогда копируем нужной длины подстроку, включая завершающий пробел. Дешифруем букву, передвигаем указатель на уже_знаем_сколько позиций и т.д.
Настолько просто, что писать лень.
Мне вот было лень копировать, я ограничился поиском подстроки и удалением найденного символа из исходной строки сначала, а за ним и всего набора пробелов
macomics вне форума Ответить с цитированием
Старый 19.06.2022, 13:09   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,067
По умолчанию

Учитывая, что предлагаемый вариант не только не проверялся, но даже не компилировался, глядя на Pos(mozebet нельзя не вспомнить:
Цитата:
"Верной дорогой идёте, товарищи!!
©Иван Сусанин"
Исправвил, компильнул. Моему Лазарю что-то не понравилось, выдал ошибку исполнения. Но даже если бы не это - т.к. Pos(mozebet[j], m) = 0 мы бы получили строку, состоящую из (, бо условие =0 (ПОЗИЦИЯ НЕ НАЙДЕНА) выполнится уже на первом шаге. Далее, проверять нужно было не на Pos, а на равенство, бо .- уже даст положительный результат Pos > 0 и на .-.-
И хоть ТСу это уже давно до фонаря, я как бывший в молодости коротковолновик-морзист не мог пройти мимо и накропал без Low, High и delete. В виде обработчика батона
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, l: Integer;
  m, r, s10: String;
begin
  m := Edit1.Text + ' ';
  r := '';
  i := 1 ;
  l := Length (m) ;
  while i<l do
     begin
       s10 := Copy (m,i,10) ;
       j := Pos (' ',s10) ;
       s10 := Copy (s10,1,j-1) ;
       i := i + j ;
       For j := 0 to 44 do
          if s10 = morzebet[j] then
             begin
               r := r + alphabet[j] ; Break
             end;
       while ( morzebet[i] = ' ') and (i<l) do Inc (i) ;
     end;
  Memo1.Lines.Add(r);
end;
.

Последний раз редактировалось digitalis; 19.06.2022 в 13:49.
digitalis вне форума Ответить с цитированием
Старый 19.06.2022, 14:51   #9
macomics
Форумчанин
 
Регистрация: 17.04.2022
Сообщений: 614
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Исправвил, компильнул. Моему Лазарю что-то не понравилось, выдал ошибку исполнения. Но даже если бы не это - т.к. Pos(mozebet[j], m) = 0 мы бы получили строку, состоящую из (, бо условие =0 (ПОЗИЦИЯ НЕ НАЙДЕНА)
Там не 0, а Low(morze). Если подстрока найдена в начале строки. Идея была такая, но напутал с индексами.
macomics вне форума Ответить с цитированием
Старый 19.06.2022, 18:04   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,067
По умолчанию

Аль глаза меня подводят?
Код:
   if Pos(mozebet[j], m) = 0
Если в начале строки, то Pos = 1 (позиции в строке нумеруются с 1, а не с 0 ). 0 = ВХОЖДЕНИЕ ПОДСТРОКИ В СТРОКУ НЕ ОБНАРУЖЕНО. Т.е. если мы подстроки в строке НЕ обнаруживаем, то ... пихаем её символьный эквивалент в выходную строку. Логика наоборот.
Ну да ладно. Решение есть, ТСу оно уже до #опы - и ладушки.
Любопытно, что я за свою многотрудную жисть я Low и High не использовал. Моя лень не позволяла плодить сущности без необходимости.
digitalis вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование азбуки морзе - Visual Basic 2010 я принял из эфира позывной сигнал азбукой морзе, а нужно озвучить код Alex Kul Свободное общение 26 18.10.2018 19:03
Комментарии к программе перевода слов английский-русский. язык С++ Девяностик Помощь студентам 6 02.11.2014 23:01
Дешифратор азбуки морзе Exibet179 Общие вопросы Delphi 11 24.12.2011 02:28
Лексический анализатор азбуки Морзе в виде конечного автомата MrBrain Помощь студентам 1 08.11.2010 10:23