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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2012, 09:15   #1
rokss
 
Регистрация: 04.03.2012
Сообщений: 3
По умолчанию

Задан текст в котором нет вхождений символов '('и')'. Заменить всякую максимальную подпоследовательность, составленную более чем из 3 вхождений одного и того же символа, на (k)s, где s- повторяемый символ, а k>3- количество его повторений.

Программа есть, но выводит только повторяемые символы
Код:
program UL;
uses crt;
var s:string;
n,i,g,r:integer;
begin
readln(s);
n:=length(s);
for i:=1 to n-1 do
if s[i]=s[i+1] then begin
 g:=i;
 r:=1;
 while s[g]=s[g+1] do begin
 g:=g+1;
 r:=r+1;
 end;
 if r>3 then write(r,'(',s[i],')','  ');
 i:=i+r-1;
 end;
 end.
Код:
program UL;
uses crt;
var s:string;
n,i,g,r:integer;
begin
readln(s);
n:=length(s);
for i:=1 to n-1 do
if s[i]=s[i+1] then begin
g:=i;
r:=1;
while s[g]=s[g+1] do begin
g:=g+1;
r:=r+1;
end;
if r>3 then write(r,'(',s[i],')',' ');
i:=i+r-1;
end;
end.

Последний раз редактировалось Stilet; 21.04.2012 в 12:11.
rokss вне форума Ответить с цитированием
Старый 21.04.2012, 11:06   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Ты делаешь ОЧЕНЬ УЖАСНУЮ ошибку - ты изменяешь параметр цикла в теле цикла. Видимо, ты используешь TP, так как никакой современный компилятор ее бы не пропустил. Так делать нельзя. Если тебе нужно манипулировать параметром цикла - используй while или repeat.
Вот, я навскидку сделал как-то так..
Код:
var
  s,t,q: string;
  i: integer;
begin
  //readln(s);
  s:= 'aaaaasdffff     gggggggAAhhhhh';
  i:= 2;
  t:= '';
  while i<=Length(s) do begin
    if s[i-1]=s[i] then t:= t+s[i];
    if (s[i-1]<>s[i]) or (i=Length(s)) then begin
      if Length(t)>2 then begin
        Str(Length(t)+1,q);
        Insert('('+q+')',s,Pos(t,s));
        Delete(s,Pos(t,s),Length(t));
        i:= i-Length(t)
      end;
      t:= ''
    end;
    inc(i)
  end;
  writeln(s);
  readln
end.
Наверняка можно сделать эффективнее..
(исправил замеченную ошибку)
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 21.04.2012 в 11:17. Причина: исправил замеченную ошибку
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10