Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление одинаковых символов в строке. 
:(
    Опции темы
PsiMagistr
Дата 30.6.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Доброго Времени Суток,  все начинающие и зубры.

По причине небывалой жары проектирование моей игрушки было отложено до наступления прохлады.

Однако же энергия требовала выхода и я почитав инетфорумы  набрел на следующую популярную проблему:

 Необходимо удалить из строки все одинаковые символы. Чтобы не один символ в строке не повторялся. Была скажем строка: "рододендрон", стала "роден". Поскольку "Рассказы о Шерлоке" Холмсе разбудили во мне призраки дедуктивного мышления, потратил я на решение этой задачи одну ночь.  Ночью лучше всего думается, к тому же никто не мешает. 
Код отличается несовершенством, но вполне работоспособен может пригодиться и вам. Комментировать пока не буду:

Код

function DelPovtor(txt:string): string; //Функция 
var dlina:integer;
begin
Result := '';
if txt <> '' then
 begin
 Result := Result+txt[1];
 Delete(txt,1,1);
 end;

  while Length(txt) > 0 do
begin

  dlina:= Length(Result);
  while Pos(Result[dlina],txt) <> 0 do
  begin
  Delete(txt,Pos(Result[dlina],txt),1);
  end;

  if Length(txt)> 0 then
  begin
  Result:= Result+txt[1];
  Delete(txt,1,1);
  end;

end;

end;


Пример использования. Т - объект типа TEdit. Button1 - TButton.

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
T.Text := DelPovtor(T.text);
end;






Это сообщение отредактировал(а) PsiMagistr - 30.6.2010, 16:58


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
DarkProg
Дата 30.6.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Я бы рекомендовал вам не использовать много функций типа Delete и Pos, т.к. они требуют определенных вычслительных затрат, а взять и сделать копирование одной строки в другую с проверкой наличия копируемого символа в строку где копируем, на мой взгляд такой код будет более эффективным как по времени выполнения так и по памяти.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
PsiMagistr
Дата 30.6.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



DarkProg, Большое спасибо за совет. Теперь мне кажется, что можно обойтись даже без Copy.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
DarkProg
Дата 30.6.2010, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Всегда пожалуйста, обращайтесь smile
Я просто как-то задумался насчет того что у меня тормозит прогу(конкретно у меня прога была с очень большой работой по парсингу строк), и начал прикидывать, логически подумал на эту тему и пришел к выводу что тормозит большой вызов процедур типа copy, delete, pos и т.п., потом подумал как обойтись без них и как результат программа увеличила свое быстродейсвие(если память не изменяет) в 5 раз(вот это был для меня шок, я надеялся что будет хотя бы выйгрыш в пару минут, а тут с 5 минут до 1, хотя засекал по часам, но все же результат был феноменальным smile )

Добавлено через 20 секунд
Теперь вот делюсь опытом  smile 


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Proxin
Дата 30.6.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



ололо. а stringreplace(s,'c','',[]) ни о чём не говорит?
PM MAIL   Вверх
DarkProg
Дата 30.6.2010, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(Proxin @  30.6.2010,  19:12 Найти цитируемый пост)
а stringreplace(s,'c','',[]) ни о чём не говорит? 

Ни о чем, поясняйте что это и зачем.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Proxin
Дата 30.6.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



извиняйте, от жары с мозгами совсем плохо. хотя, на основе stringreplace можно построить функцию просчёта количества одинаковых символов и все их чистить.
PM MAIL   Вверх
PsiMagistr
Дата 1.7.2010, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Сварганил с утречка новый вариант. Вообще простой как правда. Никаких тебе двойных while. 


Код

function DelPovtor(txt:string):string; //Функция возвращает строку, не содержащую повторяющихся символов. 
var i:integer;
begin
Result:= '';
 for i := 1 to  Length(txt) do
  if Pos(txt[i],Result)= 0 then Result := Result+txt[i];

end;




Код

procedure TForm1.Button1Click(Sender: TObject);
begin
   T.Text := DelPovtor(T.Text);
end;


Proxin, прав это все жара виновата. )))

Это сообщение отредактировал(а) PsiMagistr - 1.7.2010, 09:12


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.