Вопрос почему не работает данная программа? в некоторых случах выводит, что индекс массива вышел за его гра

Регистрация
17 Мар 2013
Сообщения
76
Репутация
0
Спасибо
0
Монет
0
var s:string;
i:integer;
begin
readln(s);
s:=s+;
for i:=1 to length(s)-1 do
if ((s=) and (s[i+1]=)) then delete (s,i,1);
write(s);
end.
 
Совсем не обязательно использовать while. Достаточно двигаться от конца строки к началу: for i := length(s) downto 2 do if (s = ) and (s[i - 1] = ) then delete(s, i, 1);
 
Ответ Сергея не верный Индексы у строк в Паскале считаются с 1, а не с 0, тут все правильно Ошибка тут - delete (s,i,1); При выполнении этой процедуры, длина строки уменьшается, но так как i будет все равно итерировать до старой длины минус один, то в конце обязательно случится выход за границы. Чтобы этого избежать, необходимо использовать цикл while i := 1; while i < length(s) do begin if ((s=) and (s[i+1]=)) then delete (s,i,1) else i := i + 1; end; write(s);
 
length(s) выдает кол-во элементов индексы с 0 начинаются поэтому последний элемент имеет индекс length(s)-1 при i = length(s)-1 проверка s[i+1] выведет ошибку, т. к такого элемента не существует. Надо length(s)-1 заменить length(s)-2
 
Это не C, поэтому не думаю, что индексация с нуля. Я думаю ошибка кроется в том, что при удалении у тебя уменьшается длина строки, а т. к. в цикле for нельзя менять "до какого значения ему надо идти" (с 10-ти до 3-х или до 20-ти), то он просто упирается в удаленые символы ( к примеру "Grand is the best" длина -17 ;delete(s,11,4) "Grand is test" длина 13), поэтому иди через while
 
Назад
Сверху