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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2013, 17:49   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Повторные вхождения слов

Найти и удалить повторные вхождения слов.

Пример:
Входная строка - " Я по два раза раза!!!не повторяю."
Выходная строка - " Я по два раза!!!не повторяю."

То есть все знаки должны сохраниться.

Пробовал разбить строку на слова поместив слова в строковый массив и попарно их сравнивать формирую новую, но при таком подходе знаки не сохраняются. Как я понимаю тогда нужно обрабатывать исключительно входную строку, но я не представляю как это должно выглядеть.
Praud вне форума Ответить с цитированием
Старый 21.12.2013, 18:16   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Я бы делал так :
Код:
строка = строка + ' ';
while не конец строки do
     если i-тый символ = разделитель, тогда
          если существует такое же слово в части строки, которую мы еще не использовали, уберем его.
          слово = пустая строка
     иначе если добавим i-ый символ к слову
Но тут проблемка..
Код:
привет привет физкульт-привет
// спасибо Аватару
Если нужно получить
Код:
привет физкульт-
то всё хорошо..
иначе..
Poma][a вне форума Ответить с цитированием
Старый 21.12.2013, 18:29   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попрбую перефразировать себя же поддержав Рому.
Код:
var s:string; a:array[1..100] of string;
  i,count:integer;
begin   
 s:='Hello my world';
 count:=1;
 i:=1; while (i<=length(s)) do begin
   if s[i] in [' ','!','?'] then begin 
     if pos(a[count],copy(s,i,Length(s))<>0 then begin
      a[count]:=''; 
     end else
      inc(count);
     inc(i);
   end;
   a[count]:=a[count]+s[i];
   inc(i);
 end;
 for i:=1 to count do write(a[i],' ');
Не проверял.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.12.2013, 01:49   #4
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

можете расшифровать что тут написано?
if s[i] in [' ','!','?'] then begin
if pos(a[count],copy(s,i,Length(s))<>0 then begin

просто на си нужно написать, а это не пойму что
Praud вне форума Ответить с цитированием
Старый 22.12.2013, 02:28   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

if s[i] in [' ','!','?'] then - если символ s[i] равен пробелу, восклицательному или вопросительному знаку, то...
if pos(a[count],copy(s,i,Length(s)))<>0 then - если позиция символа a[count] в строке copy(s,i,Length(s)) не равна нулю (то есть он в ней есть), то...
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.12.2013, 09:43   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если позиция символа a[count]
Не символа а слова.
Алгоритм почти полностью по посту Ромки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.12.2013, 10:14   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

BDA, тоже забухал? Не удивительно, от такой-то жизни...
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.12.2013, 10:47   #8
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Понял, только проблема
по его алгоритму при входной строке "привет привет физкульт-привет"
он получает "привет физкульт-" , а надо "привет физкульт-привет"
Praud вне форума Ответить с цитированием
Старый 22.12.2013, 10:54   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Тогда "здрасте, геммор"..
Тогда скажем, что программа будет работь с том, и только в том случае, когда корректно расставлены пробелы.
(Тоесть 'привет!привет') быть не может, а вот 'привет! привет' может..
Тогда будем искать ' привет'.. и всё..
Но есть контрпример..
Его не помню.. (Вроде его тоже Аватар придумал..)
Poma][a вне форума Ответить с цитированием
Старый 22.12.2013, 11:11   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да я тоже склонен в таком случае в четкой расстановке знаков между словами.
Или тогда добавь к исходной строке пробел и делай поиск по подстроке+пробел.
Но все равно я бы уделил внимание расстановке пробелов, если это не противоречит заданию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из строки повторные вхождения слов Tim Grey Общие вопросы C/C++ 8 15.12.2012 14:56
Pascal ABC.Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложения. powersej Паскаль, Turbo Pascal, PascalABC.NET 0 13.12.2012 21:07
Pascal ABC.Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложения powersej Помощь студентам 0 13.12.2012 20:41
Дана последовательность слов разделенных пробелами, удалить из нее повторные вхождения слов.С++ Bullrock Помощь студентам 4 01.03.2012 13:16
С++. Файлы. Исключить из первого повторные вхождения Анастасия18 Помощь студентам 0 21.05.2011 18:16