Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2010, 17:20   #1
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
Радость Простейший анализатор текста

Всем доброго времени суток.

Я пишу простейший анализатор текста. Текст вводится в Memo и нужно этот текст проверять. Например есть условие, что текст должен состоять только из символов 'a', 'b', 'c' и 'd' и второе условие что первые два символа этого слова должны быть 'a' и 'c', т.е. слова должны быть такого вида: acccbcbab, acc, acbd, acddd и т.д.

Чтобы это реализовать, я решил весь текст перевести в массив символов, а потом посимвольно пройтись по тексту, для этого сделал так:

Код:
var
  frmMain: TfrmMain;
  ChrAr: array of char;
  Num: integer;

implementation

{$R *.dfm}

{ TfrmMain }

// Заполняю массив буквами из Мемо
procedure TfrmMain.ArrayInitialization(Sender: TObject);
var
  i, j: integer;
begin
  Num := 1;
  for j := 0 to memText.Lines.Count - 1 do
  begin
    for i := 1 to length(memText.Lines[j])  do
    begin
      ChrAr[Num] := Copy(memText.Lines[j], i, 1)[1];
      Num := Num + 1;
    end;
  end;
end;

//Проверка текста
procedure TfrmMain.ArrayScan(Sender: TObject);
var
  i: integer;
begin
  if ChrAr[1] <> 'a' then
  begin
    lblLog.Caption := 'Ошибка: первый символ второго слова должен быть "a"';
    Exit;
  end;
  if ChrAr[2] <> 'c' then
  begin
    lblLog.Caption := 'Ошибка: второй символ второго слова должен быть "c"';
    Exit;
  end;
  if Length(ChrAr) > 2 then
  begin
    for i := 3 to Length(ChrAr) - 1 do
    begin
      if Not (ChrAr[i] in ['a', 'b', 'c', 'd']) then
      begin
        lblLog.Caption := 'Ошибка: встречен недопустимый символ ' +
                          ChrAr[i];
        Exit;
      end;
    end;
  end;
end;

procedure TfrmMain.btnScanClick(Sender: TObject);
begin
  ArrayInitialization(Sender);
  ArrayScan(Sender);
end;
Компилируется нормально, но потом вылазит ошибка, когда на кнопку жмёш: Access violation at adress ... in module... Write of adress ...

Почему вылазаит ошибка понять не могу. И ещё есть вопрос, у меня проверяется первый символ текста, а как сделать чтобы неограниченное множество пробелов перед словом не учитывались. Т.е. если перд словом стоят пробелы.
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 18.02.2010, 17:23   #2
Google2010
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 316
По умолчанию

Цитата:
чтобы неограниченное множество пробелов перед словом не учитывались
процедура Trim
Google2010 вне форума Ответить с цитированием
Старый 18.02.2010, 17:25   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Вы пошли не по очень хорошему пути. Разбивайте текст не на символы, а на слова.
Код:
S // Здесь у нас текст.
S2:=S;
SetLegth(Arr,0);//массивчик из ShortString;
While S2<>'' do
 Begin
  While S2[1] = ' ' do Delete(S2,1,1);
  If S2<>'' do
   Begin 
    SetLegth(Arr,Length(Arr)+1);
    Arr[Length(Arr) - 1]:=Copy(S2,1,Pos(' ',S2);
   End;
 End;
Массив заполнили, дальше уже работайте со словами. Можно в цикле, так как это массив.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.02.2010, 17:27   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

У вас динамический массив ChrAr не создан. И обращаетесь вы не известно куда, поэтому и вылазит ошибка.
p51x вне форума Ответить с цитированием
Старый 18.02.2010, 17:37   #5
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Alex Cones, в тексте будет всего два слова, поэтому наверна бессмысленно делить текст на слова.

p51x, ну так и показали бы как нада, а то не очень понятно

Google2010, спасибо большое вам за подсказку
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 18.02.2010 в 17:40.
Marsel737 вне форума Ответить с цитированием
Старый 18.02.2010, 17:39   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Alex Cones, в тексте будет всего два слова, поэтому наверна бессмысленно делить текст на слова.
1) А какая разница?
2) А вдруг захочется 500?
3) Ничего не надо придумывать - код выше.
4) Удобно, оптимально.

Убедил?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.02.2010, 17:41   #7
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Alex Cones, убедили, щас буду разбираться с вашим кодом, спс

Оппа, опять ошибка, Out of memory!!!
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 18.02.2010 в 17:47.
Marsel737 вне форума Ответить с цитированием
Старый 18.02.2010, 18:16   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Оппа, опять ошибка, Out of memory!!!
Код в студию.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.02.2010, 18:41   #9
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Код:
procedure TForm1.Butto1Click(Sender: TObject);
var
  s, s2: string;
  Arr: array of ShortString;
begin
  S := memText.Text;
  S2:=S;
  SetLength(Arr,0);//массивчик из ShortString;
  While S2<>'' do
  Begin
    While S2[1] = ' ' do Delete(S2,1,1);
    If S2<>'' then
    Begin
      SetLength(Arr,Length(Arr)+1);
      Arr[Length(Arr) - 1] := Copy(S2,1,Pos(' ',S2));
    End;
  End;
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 18.02.2010, 19:01   #10
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Код:
SetLength(Arr,0);//массивчик из ShortString;
Из нуля элементов?)
TwiX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простейший фаерволл wall66 Софт 0 24.10.2009 17:36
простейший basic beerperson Помощь студентам 3 17.05.2009 18:14
[Turbo Prolog] Анализатор текста на языке Pascal Arkuz Помощь студентам 1 04.05.2009 20:41
Простейший firewall ytkopobot Помощь студентам 1 08.05.2008 13:14