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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2010, 14:16   #1
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию Удаление повторяющихся значений в строке

Имеется строка типа string, например 001015235015, здесь данные надо рассматривать по 3 символа, т.е. 001,015,235,015. Необходимо удалить повторяющиеся значения, т.е. для написанной выше строки должно получится 001015235.
Задаваемая строка может быть разных размеров, но она всегда кратна 3-ем.
Помогите разобраться, буду очень признателен!

Последний раз редактировалось aimk0; 11.10.2010 в 14:25.
aimk0 вне форума Ответить с цитированием
Старый 11.10.2010, 14:23   #2
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

ну а мысли какие-нибудь свои есть?
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 11.10.2010, 14:48   #3
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

Don Karleone, Ну думаю надо вначале разбить строку по 3 символа и записать все то в массив,
как-то так
Цитата:
var str,ceh, str2:string;
i:integer;
mas:array of string; // как задать?
begin
str2:='';
for i:=0 to round(length(str)/3)-1 do begin
ceh:='';
ceh:=copy(str,i*3+1,3);
mas[i+1]:=ceh;
end;
for i:=1 to round(length(str)/3)-1 do begin
if mas[i]=mas[i+1] then begin удаляем mas[i+1] // как удалить?
end;
for i:=1 to (до длины массива mas) do begin
str2:=str2+mas[i];
end;

где str исходная строка, mas - массив строк. Но как тогда описать массив, если размер строки может быть разным

Последний раз редактировалось aimk0; 11.10.2010 в 14:51.
aimk0 вне форума Ответить с цитированием
Старый 11.10.2010, 15:29   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) язык программирования (точнее среда) какая? Pascal или Delphi ?

2) если Pascal то массив можно смело задавать
type Str3 = string[3];
var
Mas[0..85] of Str3; {строка 256 символов не может содержать более 86 элементов}

3) перед добавлением очередной тройки чисел просто проверяйте, если такая уже в массиве есть - то проверяемую подстроку просто НЕ ДОБАВЛЯТЬ! (и не надо никаких удалений)

4) если Delphi то можно через методы TSTringList всё быстро и красиво сделать..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.10.2010, 15:33   #5
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

предположу, что лучше будет, если пробежаться в цикле по строке - каждый раз брав 3 символа и попытаться их найти в оставшейся части строки. Если первых 3-х символа (1,2,3) не найдено, передвигаемся на на один символ (2,3,4) и пытаемся найти данную троицу в оставшейся части, если найдено - то удаляем эти 3 символа и так продолжаем до предпоследней троицы.

p.s. пригодятся функции pos, copy, delete.
VadEr вне форума Ответить с цитированием
Старый 11.10.2010, 15:54   #6
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

Serge_Bliznykov

1) Среда Delphi 7

2) С TSTrungList не работал... Может покажете как через эти методы сделать?

Цитата:
SetLength(mas, round(length(str)/3));
for i:=0 to round(length(str)/3)-1 do begin
ceh:='';
ceh:=copy(str,i*3+1,3);
в этом цикле я так понимаю надо проверять подстроку на ее наличие в массиве, только вот не пойму как
aimk0 вне форума Ответить с цитированием
Старый 11.10.2010, 16:02   #7
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

как вариант без использования массива:
Код:
var
  s1, a, str: string;

begin
  readln(str);
  s1:=str;
  str:='';
  while Length(s1) > 0 do
      begin
          a:=copy(s1,1,3);
          str:=str + a;
          while pos(a,s1)<>0 do
              Delete(s1,pos(a,s1),3);
      end;
  writeln(str);
  readln;
end.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 11.10.2010, 16:58   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Don Karleone, алгоритм ОШИБОЧЕН! Будет рубить и неповторяющиеся данные!

проверьте, например, на строчке: str := '111112211113';
(строка состоит из 4-х неповторяющихся триад- 111 112 211 113
и посмотрите, что вернёт Ваша программа...


Цитата:
TSTrungList не работал... Может покажете как через эти методы сделать?
да не вопрос.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var str, s1 : string;
   TS : TStringList;
   i, k : integer;
begin
 str := Edit1.Text;
 TS := TStringList.Create;
 i:=1;
 while i<= (Length(str) div 3)*3 do begin
    s1 := Copy(str, i, 3);
    inc(i,3);
    if TS.IndexOf(s1)<0 then
         TS.Append (s1);
 end;

 str := '';
 for i:=0 to TS.Count-1 do str := str + ts.Strings[i];

 FreeAndNil(TS);

 Edit2.Text := str;
end;
p.s. остаток строки, некратный 3-м просто отбрасывается... Но при желании можно его переносить в выходную строку...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление повторяющихся записей в БД Dinamik БД в Delphi 8 22.03.2012 22:05
Удаление повторяющихся слов C vivo89 Помощь студентам 2 24.12.2009 09:18
определение количества повторяющихся элементов в строке Alex Cones Общие вопросы Delphi 15 09.08.2009 18:55
Подсчет повторяющихся значений поля JSilver БД в Delphi 9 04.03.2009 10:34
Поиск повторяющихся значений Flangini Microsoft Office Excel 23 22.02.2008 15:57