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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2013, 21:34   #1
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию Написать процедуру подобно insert, которая после каждого вхождения символа C в строку S1 вставляет строку S2

Доброго времени суток. Очень нужна помощь.
Нужно написать процедуру, которая после каждого вхождения символа С в строку S1 вставляет после него подстроку S2.
Что-то попыталась написать, но не работает.
Код:
Код:
var
  s1, s2: string;
  c: char;
  i, j, p, len: integer;

begin
  s1 := 'abcdbeob';
  s2 := 'yyy';  
  c := 'b';
  
  readln(s1);
  while not eoln do
  begin
    if s1[i] <> c then i := i + 1       //ищет символ в строке
    else
    begin
      len := length(s1);
      Len := Length(s1) + Length(s2);    //прибавляет к длине s1 длину s2
      for j := (s1.Length - s2.Length) downto (i + 1) do
        s1[j] := s1[j + s2.Length];     //передвигает буквы s1-й строки вправо на длину s2
      for p := 1 to s2.Length do        //на пустое место вставляет строку s2 
        s1[i + p] := s2[p];
    end;
  end;
  writeln(s1);
end.
azalia вне форума Ответить с цитированием
Старый 24.11.2013, 21:44   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Ошибка была range check error?
Начальное значение i не определено
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 24.11.2013, 21:49   #3
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

Нет, не range check error. i определила, ничего не изменилось. Даже на экран ничего не выводится.
azalia вне форума Ответить с цитированием
Старый 24.11.2013, 21:55   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Код:
Len := Length(s1) + Length(s2);
А вы уверены, что так будет увеличиваться длина строки?
Если я правильно помню, длина строки хранится в s[0], то есть в элементе строки с индексом 0.

Последний раз редактировалось ZX Spectrum-128; 24.11.2013 в 21:59.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 24.11.2013, 22:07   #5
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

Вы правы, строка так не увеличивается

А как по-другому, я не знаю.

Последний раз редактировалось Stilet; 26.11.2013 в 23:49.
azalia вне форума Ответить с цитированием
Старый 24.11.2013, 22:17   #6
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

SetLength
Но я не помню, была ли она в турбо паскале.

Вариант записи новой длины непосредственно в s[0] не прокатит? Попробуйте

Последний раз редактировалось ZX Spectrum-128; 24.11.2013 в 22:19.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 24.11.2013, 22:28   #7
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

SetLength есть в паскале, и у меня не турбо, а abc.net. А зачем устанавливать длину, если неизвестно сколько строк s2 войдут в строку s1?
azalia вне форума Ответить с цитированием
Старый 24.11.2013, 22:38   #8
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Цитата:
function Eoln [ (var F: text)]: boolean;
Действие: Если при обращении к функции Eoln параметр не указан, то функция проверяет, не является ли очередной символ, читаемый из буфера клавиатуры, символом "новая строка". Если является, то функция возвращает значение true, в противном случае — false. Если параметр указан, то функция аналогичным образом проверяет очередной символ текстового файла, связанного с файловой переменной, указанной при вызове функции.
У меня есть подозрение что eoln сразу падает в false
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 24.11.2013, 22:51   #9
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

а если так: while i<=s1.Length do ?
хотя лучше программа не заработала
azalia вне форума Ответить с цитированием
Старый 24.11.2013, 23:04   #10
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

У меня уффффффф
Только один вариант. Сначала Циклом пробежатьсяпо строке, узнав сколько раз встречается этот символ.
И цикл вставки пойдет уже по этому количеству повторений
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести строку и после каждого символа "q" ставить "**" karamzin Паскаль, Turbo Pascal, PascalABC.NET 2 25.11.2012 02:57
Как вывести строку, которая состоит из аргументов командной строки так, чтобы каждое слово выводилось без первого символа Mik2012 Общие вопросы C/C++ 1 31.10.2012 00:29
MinLines(f), которая вставляет строку минимальной длины в начало и конец файла ArtS Паскаль, Turbo Pascal, PascalABC.NET 0 24.05.2009 19:13
Записать текст лесенкой(по одному слову в строке),вставляя пустую строку после каждого четверостишья klindk Паскаль, Turbo Pascal, PascalABC.NET 2 27.11.2008 14:34