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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2011, 20:39   #1
Balloonatic
 
Регистрация: 08.07.2011
Сообщений: 4
По умолчанию Delphi работа со строками

Задание - найти в тексте первое вхождение слова с заданным окончанием. Нашла стандартную функцию AnsiEndsText, но компилятор выдает ошибку - необъявленный идентификатор. Подскажите, пожалуйста, в чем может быть причина?
Balloonatic вне форума Ответить с цитированием
Старый 08.07.2011, 20:56   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

По-моему эта функция тут не сильно поможет.

Простой вариант: разделить строку на слова, используя массив (либо смотреть только на 'a'..'z', 'A'..'Z' и когда попадется что-то другое с помощью флага (boolean) +1 к индексу массива, либо использовать множество (set of...) разделителей слов аналогично) и потом в массиве искать это слово.

Более компактный вариант: в цикле проходим строку и ищем это слово, не забывая отделять слова, как в 1 варианте, но вместо массива используем 1 переменную типа string.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.07.2011 в 21:01.
Alex11223 вне форума Ответить с цитированием
Старый 08.07.2011, 21:26   #3
Balloonatic
 
Регистрация: 08.07.2011
Сообщений: 4
По умолчанию

Ну, изначально я эту функцию и писала вручную. Прога не работает в двух случаях: если задать окончание длиной 1 символ и при этом в первом слове, оканчивающемся на эту букву, уже есть эта буква - то есть написать, например, "рама" и окончанием задать букву А; и второй случай - если в тексте встречаются слова длиной меньше, чем заданное окончание.

Вот код:
Код:
var  s2:string;
var tmp: string;
var s1: TStringList;
var i, j, position: Integer;
begin
s1:=TStringList.Create;
s2:=edt2.Text;
try
  s1.Delimiter:=' ';
  s1.DelimitedText:=Edit1.Text;
  for i:=s1.Count-1 downto 0 do
    begin
    tmp:=s1[i];
    position:=Pos(s2, tmp);
    if position-1= length(tmp)-length(s2) then
      Label4.Caption:=tmp;
    end;
finally
s1.Free;
end;
end;
end.

Последний раз редактировалось Stilet; 08.07.2011 в 21:38.
Balloonatic вне форума Ответить с цитированием
Старый 08.07.2011, 22:01   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
for i:=s1.Count-1 downto 0 do
begin
tmp:=s1[i];
position:=Pos(s2, tmp);
if position-1= length(tmp)-length(s2) then
Label4.Caption:=tmp;
end;
Эм...Что-то не очень понял, что вы тут делаете. Я бы как-то так делал (для 1 строки, т.е. это надо немного переделать для каждой строки СтрингЛиста):
upd: не заметил вначале, что надо окончание искать, поэтому не очень красиво получилось, но должно работать)
Код:
var f:boolean;
razd: set of char;
...
razd := [',', '.', '!', '?', ' ', ':'];
okonchanie:='abcdef'; f:=false;
for i:=1 to length(str) do
begin
   if str[i] not in razd then 
     bufstr:=bufstr+str[i];
   else
     if length(buf) => length(okonchanie) then
     begin
        f:=true;
        for j:=length(okonchanie) downto 1 do
           if bufstr[j] <> okonchanie[j] then begin f:=false; break; end;
        if (f) then //вывод bufstr
        bufstr:='';
     end;
     else bufstr:='';
   if(f) then break;
end;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 09.07.2011 в 11:57.
Alex11223 вне форума Ответить с цитированием
Старый 08.07.2011, 22:31   #5
Balloonatic
 
Регистрация: 08.07.2011
Сообщений: 4
По умолчанию

должно, а не работает...ну все равно спасибо, буду думать дальше
Balloonatic вне форума Ответить с цитированием
Старый 09.07.2011, 10:34   #6
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Balloonatic, смотрите сюда
Код:
Var
  st,sl:String;
  okonch:String[5];
  i,j,dl,dl1:Byte;
  Found:Boolean;
begin
  Write('Stroka ');
  Readln(St);
  Write('Okonchnie ');
  Readln(Okonch);
  For i:=1 to Length(St) do
  Begin
    If (St[i] <> ' ') and (i <= Length(St)) then sl:=Sl+St[i];
    If (St[i] = ' ') or (i = Length(St)) then
    Begin
      If Sl <> '' then
      Begin
        dl:=Length(Sl);
        dl1:=Length(Okonch);
        Found:=False;
        For j:=dl1 downto 1 do
        If sl[dl] = Okonch[j] then
        Begin
          Found:=True;
          dec(dl)
        End
        Else
        Begin
          Found:=False;
          sl:='';
          Break
        End;
      End;
    End;
    If Found then Break;
  End;
  If sl <> '' then Writeln(Sl)
              else Writeln('Not Found');
  Readln
End.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 09.07.2011, 11:58   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
должно, а не работает
Видимо из-за того, что у меня был to в последнем цикле вместо downto.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками, delphi <Maria> Помощь студентам 1 19.10.2010 00:14
работа со строками delphi fize Помощь студентам 22 07.01.2010 03:59
Delphi работа со строками tanek Помощь студентам 7 13.10.2009 15:05
Работа со строками.(Delphi) SfSpawN Помощь студентам 1 09.06.2009 18:13
Работа с строками в Delphi. Lassard Помощь студентам 8 21.11.2008 18:27