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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2012, 08:11   #1
ValentinBuruak
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 17
По умолчанию Удаление одинаковых слов из строки (Delphi)

У меня в строке написалось несколько слов, например,
Цитата:
Итог: новый, старый, старый новый
Помогите мне пожалуйста с кодом, чтобы получались у меня
Цитата:
Итог: новый, старый
ValentinBuruak вне форума Ответить с цитированием
Старый 16.04.2012, 15:01   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
var s1,s2:of TStringList;i:integer;
begin
 s1:=TstringList.Create; s2:=TstringList.Create;
 s1.DelimitedText:='новый, старый, старый новый ';
 for i:=0 to s1.count-1 do  if s2.indexof(s1[i])<0 then s2.add(s1[i]);
   
 Выводим s2.DelimitedText;

 s1.free;s2.free; 
end;
Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.04.2012, 15:26   #3
ValentinBuruak
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 17
По умолчанию

Можно в двух словах? что означают переменные s1, s2? объясните вот эту строку
Код:
for i:=0 to s1.count-1 do  if s2.indexof(s1[i])<0 then s2.add(s1[i]);
ValentinBuruak вне форума Ответить с цитированием
Старый 16.04.2012, 15:36   #4
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от ValentinBuruak Посмотреть сообщение
Можно в двух словах? что означают переменные s1, s2? объясните вот эту строку
Код:
for i:=0 to s1.count-1 do  if s2.indexof(s1[i])<0 then s2.add(s1[i]);
массивы строк


задача мое решение
Код:
type
 endWord  = set of  #0..#255;

var
  bkend:endWord;


function LowerCaseRus(const S: string): string;
var
  Ch: Char;
  L: Integer;
  Source, Dest: PChar;
begin
  L := Length(S);
  SetLength(Result, L);
  Source := Pointer(S);
  Dest := Pointer(Result);
  while L <> 0 do
  begin
    Ch := Source^;
    if (Ch >= 'A') and (Ch <= 'Z') then Inc(Ch, 32);
    if (Ch >= 'А') and (Ch <= 'Я') then Inc(Ch, 32); // Добавляем Рус буквы
    Dest^ := Ch;
    Inc(Source);
    Inc(Dest);
    Dec(L);
  end;
end;

  // возвращает позицию слова INDEX

Function GetPosIndex(s:string;index:integer;len:integer=0):Tpoint;
var y,x:integer;
    s2:string;
begin
  y:=0;
  s2:='';
  result.X:=1;
  result.y:=0;
  for X:=1 to length(s) do begin
if (ord(s[x])<33) or (s[x] in bkend) or (x=length(s)) then
                       begin
                       if (s2<>'') and ((len=0) or (length(s2)>=len))  then begin
                             y:=y+1;
                             if y=index then begin
                               result.y:=x-result.X;
                               exit;
                             end
                             end;
                             s2:='';
                          end
                          else begin
                          if s2='' then result.X:=x; // запоминаем позицию начала слова
                          s2:=s2+s[x]; // копируем слово

                          end;


  end;

end;

// получить слово номер
Function GetSlovoIndex(s:string;index:integer;len:integer=0):string;
var pr:Tpoint;
begin
    pr:=GetPosIndex(s,index,len);
    if pr.X>0 then
    if pr.y>0 then result:=copy(s,pr.x,pr.y);

end;



Function GetWordCount(s:string;len:integer=0):integer;
 var y,x:integer;
    s2:string;
begin
  y:=0;
  s2:='';
  result:=0;
  for X:=1 to length(s) do begin
    if (ord(s[x])<33) or (s[x] in bkend) or (x=length(s)) then
                       begin
                       if (s2<>'') and ((len=0) or (length(s2)>=len)) then begin
                             y:=y+1;
                             end;
                             s2:='';
                          end else s2:=s2+s[x];

  end;
  result:=y;
end;

Function GeTTextFromNotdoubleWord(TextValue:string):string;
var
    WordList:array of string; // список уникальных слов
    WordListCount:integer; // кол-во уникальных слов


    Function AddWord(s:string):boolean; // проверяет список слов // если слово не найдено Добавляет слово в список
    // вовзращает true если слово новое false если слово уже было в списке
    var x:Integer;
    begin
      result:=true;
      for x:=0 to WordListCount-1 do
        if WordList[x]=s then
         result:=false;

      if result then begin
      WordListCount:=WordListCount+1;
      Setlength(WordList,WordListCount);
      WordList[WordListCount-1]:=s;
      end;
    end;

    var lenText:integer; // кол-во слов
    x:Integer;// переменная
    Word:string; // слово
    WordPos:Tpoint; // позиция слова в тексте
    NewText:string;
begin
  WordListCount:=0;
  newText:=TextValue;
  lentext:=GetWordCount(newText); // получаем кол-во слов в тексте
  x:=1;
  while x<lentext do begin
  WordPos:=GetPosIndex(newText,x);
  Word:=copy(newText,WordPos.x,WordPos.y);
   if not AddWord(LowerCaseRus(Word)) then begin
      delete(newText,WordPos.x,WordPos.y);
      lentext:=lentext-1;
      x:=x-1;
   end;
  x:=x+1;
  end;
 result:=newText;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bkend:=[#146,#91,#93,#40,#41,#123,#125,#58,#44,#150,#151,#133,#33,
                      #46,#45,#145,#146,#147,#148,#171,#187,#39,#59,#47,#47,#32,
                      #183,#38,#64,#42,#92,#149,#94,#169,#164,#134,#135,#176,
                      #35,#185,#37,#137,#182,#174,#167,#126,#153,#95,#124,#166,'0','1','2','3','4','5','6','7','8','9'];




end;

procedure TForm1.Button1Click(Sender: TObject);
begin

memo2.lines.text:=GeTTextFromNotDoubleWord(memo1.lines.text)
end;
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 16.04.2012, 18:25   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

s1.count - кол-во строк (слов в исходной строке);
s2.indexof(s1[i])<0 - Если в массиве 2 найдено слово, то не добавлять его
s2.add(s1[i]); - Добавление нового слова.

Короче: s1,s2 объекты класса массива строк. Есть у него свойство DelimitedText, который делит текст на массив подстрок по некоему символу. В данном случае это пробел. Получается массив слов.
Далее пробегаемся по нему в цикле, и выясняем в выходном массиве есть ли очередное слово. Если нет - добавляем, если есть - нет. Таким образом в выходной массив слова попадают в одном экземпляре.
Яснышко?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] Удаление одинаковых символов со строки decantnik Помощь студентам 6 01.09.2013 00:37
Количество одинаковых слов в строке. Delphi topside Помощь студентам 10 30.10.2011 23:05
Удаление одинаковых слов в Memo. sxcine Общие вопросы Delphi 7 03.01.2011 12:56
удаление одинаковых слов (С/С++) jewel Помощь студентам 1 12.12.2008 15:14
Поиск одинаковых слов (Delphi 7) hooch Помощь студентам 4 27.11.2008 20:14