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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2012, 23:40   #1
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию

Если в строке имеются последовательности, состоящие из более чем трех одинаковых символов, то заменить каждую такую последовательность подстрокой , где - признак повторения, - двухзначное число, определяющее количество повторений, - по-вторяющийся символ. В качестве признака повторений взять неиспользуемый в тексте сим-вол #14. Составить две процедуры, выполняющие соответственно сжатие и восстановление текста.

Спасибо.

Мне только процедуры нужны.

Последний раз редактировалось Stilet; 27.02.2012 в 17:16.
Prin53 вне форума Ответить с цитированием
Старый 27.02.2012, 14:11   #2
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от Prin53 Посмотреть сообщение
Мне только процедуры нужны.
примерно так

Код:
var
    s:string;
    TextValue:array [1..100] of string[3];
    TextCount:integer=1;
    vs:char;

Function GetSimbel(Vstart:integer=64):integer;
var sv,x,l:integer;
begin
   l:=length(s);
   for sv:=Vstart to 255 do begin
     if ord(s[x])=sv then
     else begin result:=sv; exit; end;
   end;
end;
function CreateText(Text:string):integer;
var x:integer;
begin
result:=-1;
   for X:=1 to TextCount do if TextValue[x]=text then result:=x;

   if result=-1 then begin
      TextCount:=TextCount+1;
      TextValue[TextCount-1]:=text;
      result:=TextCount-1;
   end;

end;
Function Zip:integer;
var l,x,i:integer;

begin
  vs:=char(GetSimbel);
  l:=length(s);
  x:=3;
  while x<l do begin
    if (s[x-2]=s[x-1]) and (s[x-1]=s[x]) then begin
      i:=CreateText(s[x-2]+s[x-1]+s[x]);
      delete(s,x-2,3);
      insert(vs+inttohex(i,2),s,x-2);
    end;
    x:=x+1;
  end;end;


Function unZip(c:char):integer;
var l,x,i:integer;
    s1,s2:string;
begin
  l:=length(s);
  x:=1;s2:='';
  while x<l do begin
    if s[x]=c then begin
      s1:='$'+copy(s,x+1,2);
      s2:=TextValue[strtoint(s1)];
      delete(s,x,3);
      insert(s2,s,x);
    end;
    x:=x+1;
  end;

end;
procedure TForm1.Button1Click(Sender: TObject);
begin
s:=form1.Memo1.Lines.Text;
Zip;
form1.Memo2.Lines.Text:=s;
unZip(vs);
form1.Memo3.Lines.Text:=s;

end;
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 04.03.2012, 09:29   #3
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию

Цитата:
Сообщение от denisbrain Посмотреть сообщение
примерно так

Код:
var
    s:string;
    TextValue:array [1..100] of string[3];
    TextCount:integer=1;
    vs:char;

Function GetSimbel(Vstart:integer=64):integer;
var sv,x,l:integer;
begin
   l:=length(s);
   for sv:=Vstart to 255 do begin
     if ord(s[x])=sv then
     else begin result:=sv; exit; end;
   end;
end;
function CreateText(Text:string):integer;
var x:integer;
begin
result:=-1;
   for X:=1 to TextCount do if TextValue[x]=text then result:=x;

   if result=-1 then begin
      TextCount:=TextCount+1;
      TextValue[TextCount-1]:=text;
      result:=TextCount-1;
   end;

end;
Function Zip:integer;
var l,x,i:integer;

begin
  vs:=char(GetSimbel);
  l:=length(s);
  x:=3;
  while x<l do begin
    if (s[x-2]=s[x-1]) and (s[x-1]=s[x]) then begin
      i:=CreateText(s[x-2]+s[x-1]+s[x]);
      delete(s,x-2,3);
      insert(vs+inttohex(i,2),s,x-2);
    end;
    x:=x+1;
  end;end;


Function unZip(c:char):integer;
var l,x,i:integer;
    s1,s2:string;
begin
  l:=length(s);
  x:=1;s2:='';
  while x<l do begin
    if s[x]=c then begin
      s1:='$'+copy(s,x+1,2);
      s2:=TextValue[strtoint(s1)];
      delete(s,x,3);
      insert(s2,s,x);
    end;
    x:=x+1;
  end;

end;
procedure TForm1.Button1Click(Sender: TObject);
begin
s:=form1.Memo1.Lines.Text;
Zip;
form1.Memo2.Lines.Text:=s;
unZip(vs);
form1.Memo3.Lines.Text:=s;

end;
Не понятно, особенно последняя процедура.
Prin53 вне форума Ответить с цитированием
Старый 06.03.2012, 23:20   #4
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию

Вот сделал:
Код:
var s,buf,sym,ost:string;
	i,schet:integer;
begin
	writeln('enter string');
	readln(s);
	i:=1;
	schet:=1;
	while i <= length(s)-1 do
		begin
			if s[i]=s[i+1] then
			    begin
			        inc(schet);
			        inc(i);
			    end
			else 
			    begin
			          if (schet >= 3) then 
			                  begin
			                      ost:=copy(s,length(s)-i,i+1);
			                      sym:=copy(s,i,1);
			                      Str(schet, buf);
			                      sym:='#'+buf+sym+'#';
			                      insert(sym,s,i-2);
			                      i:=i+4;
			                      schet:=1;
			                  end
			          else
			              begin
			                  schet:=1;
			                  inc(i);
			              end;
			    end;
		end;
	writeln(s);
	readln;
end.
Только нужно вставить удаление повторяющихся символов.
Результат
Код HTML:
Исходная строка
ettty

Результат
e#3t#ttty
ttt нужно удалить. Помогите, срочно.
Prin53 вне форума Ответить с цитированием
Старый 07.03.2012, 08:22   #5
Prin53
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 59
По умолчанию

Спасибо большое.
Prin53 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача на строки Игорь Милосердов Паскаль, Turbo Pascal, PascalABC.NET 4 08.02.2012 14:03
Задача на строки 3141519 Паскаль, Turbo Pascal, PascalABC.NET 1 19.05.2011 15:50
Задача на строки С++ Many man Помощь студентам 10 06.05.2009 21:17
[C++] Задача на строки Roomper Помощь студентам 4 07.04.2009 18:25
задача на строки Hostlman Помощь студентам 2 26.12.2007 03:17