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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2012, 22:54   #1
Ромиk
Пользователь
 
Регистрация: 11.09.2011
Сообщений: 42
По умолчанию строки

Дана строка содержащая только заглавные латинские буквы. Написать программу, которая «сжимает» строку используя следующий принцип: каждая последовательность состоящая из более чем двух одинаковых символов заменяется комбинацией <число повторений><буква>. Например:

Дана строка: ABCCCCBBAAAAAAABBB
Результат: AB4CBB7A3B

Напишите программу, которая делает и обратное преобразование. Т.е., если к какой-то строке сначала применить первый алгоритм, а затем полученный результат подать на вход второй программы, то должна получиться исходная строка.

Можно протестировать эту задачу на сайте acmp.ru, номер задачи 231 (Внимание: есть небольшие различия в условиях)

Примечание: нельзя использовать дополнительные строки. Все преобразования должны применяться к исходной строке.

Прошу помощи
и как говорил Фрейд : нам надо фрейд
Ромиk вне форума Ответить с цитированием
Старый 14.01.2012, 08:54   #2
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Цитата:
каждая последовательность состоящая из более чем двух одинаковых символов заменяется комбинацией <число повторений><буква>
Код:
  uses crt;
  var s,st: string;
     i,n,k: integer;
BEGIN
  clrscr;
  s:='ABCCCCBBAAAAAAABBB';
  writeln ('Input - ',s);
  writeln ('------------------------');
  repeat
    inc (i);
    k:= i;
    n:= 1;
    while (s[k] = s[k+1]) do
      begin
        if k = length (s) then break;
	inc (n);
        inc (k);
      end;
    if n > 2 then begin delete (s, i+1, n-1);
                        str (n, st);
			insert (st, s, i);
		  end;
  until i = length (s);

  writeln ('Output - ',s);
  readln;
END.
P.S. узнал для себя новое, оказывается при удалении символов из строки, они конечно удаляются, но вот крайние справа, остаются, т.е. они копируются, а не сдвигаются, Например
Код:
s:='1234560';
delete (s, 2, 1);
writeln (s);           
// результат - 134567
writeln (s [7]);     
// результат - 0, хотя сейчас у нас в строке всего шесть символов, и седьмой символ по хорошему бы должен был удалиться в результате работы delete
Вот так(
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.
Niro вне форума Ответить с цитированием
Старый 14.01.2012, 09:38   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
.S. узнал для себя новое, оказывается при удалении символов из строки, они конечно удаляются, но вот крайние справа, остаются, т.е. они копируются,
Niro, это Вы заблуждаетесь!
Цитата:
Код:
s:='1234560';
delete (s, 2, 1);
writeln (s);           
// результат - 134567
writeln (s [7]);
Выведите длину строки после удаления.
WriteLn(Length(s));
Ничего не смущает? То, что строка имеет длину МЕНЬШЕ, чем тот символ, который Вы пытаетесь получить, не удивляет?

тогда рекомендую ознакомится с этим примером кода (тут вообще нет никакого удаления!):
Код:
var s : string;
begin
  s := 'My string';
  WriteLn(s);
  s := '12';
  WriteLn(s);
  WriteLn(s[4],s[5],s[6],s[7],s[8],s[9]);
  readln
end.
hint. строка в Паскале - по сути это массив из символов, длиной 256 байт (если не указано иное). первый (нулевой байт) - хранит ДЛИНУ строки. В остальных байтах находятся собственно символы, составляющие строку. Естественно, что при удалении символов, сдвигаются только те, которые входят в строку с новой длиной. Остальные символы не затираются, не изменяются - с точки зрения программы (и программиста), всё, что находится за пределами длины строки - это мусор. Используйте функцию Copy(s,x,1) вместо s[x] и таких казусов у Вас не будет. ну или контролируйте в собственном код, чтобы индекс не выходил за длину строки
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.01.2012, 09:48   #4
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Цитата:
Ничего не смущает? То, что строка имеет длину МЕНЬШЕ, чем тот символ, который Вы пытаетесь получить, не удивляет?
неа, не смущает, не удивляет) я серьезно
это
Цитата:
hint. строка в Паскале - по сути это массив из символов, длиной 256 байт (если не указано иное). первый (нулевой байт) - хранит ДЛИНУ строки. В остальных байтах находятся собственно символы, составляющие строку.
я знаю
а вот этого
Цитата:
Остальные символы не затираются, не изменяются
я не знал, я как раз наоборот думал, что они должны удаляться, заменяться символом с кодом #0, а оно вот как оказывается
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.
Niro вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, Шпунюся Помощь студентам 1 16.12.2010 21:02
Создание пустой строки и копирование в неё содержимое предыдущей строки 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