Другие языки программирования и технологии

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

var s:string;
i:integer;
begin
readln(s);
s:=s+' ';
for i:=1 to length(s)-1 do
if ((s[i]=' ') and (s[i+1]=' ')) then delete (s,i,1);
write(s);
end.
Совсем не обязательно использовать while. Достаточно двигаться от конца строки к началу:

for i := length(s) downto 2 do if (s[i] = ' ') and (s[i - 1] = ' ') then delete(s, i, 1);
Александр С...
Александр С...
93 445
Лучший ответ
length(s) считается один раз перед началом цикла, а ты в цикле длину меняешь
Дмитрий Шуткин
Дмитрий Шуткин
25 516
length(s) выдает кол-во элементов
индексы с 0 начинаются поэтому последний элемент имеет индекс length(s)-1
при i = length(s)-1 проверка s[i+1] выведет ошибку, т. к такого элемента не существует.
Надо length(s)-1 заменить length(s)-2
Сергей Машошин
Сергей Машошин
17 671
Это не C, поэтому не думаю, что индексация с нуля. Я думаю ошибка кроется в том, что при удалении у тебя уменьшается длина строки, а т. к. в цикле for нельзя менять "до какого значения ему надо идти" (с 10-ти до 3-х или до 20-ти), то он просто упирается в удаленые символы ( к примеру "Grand is the best" длина -17 ;delete(s,11,4) "Grand is test" длина 13), поэтому иди через while
MB
Magid Bader
17 459
Ответ Сергея не верный
Индексы у строк в Паскале считаются с 1, а не с 0, тут все правильно
Ошибка тут - delete (s,i,1);
При выполнении этой процедуры, длина строки уменьшается, но так как i будет все равно итерировать до старой длины минус один, то в конце обязательно случится выход за границы.
Чтобы этого избежать, необходимо использовать цикл while

i := 1;
while i < length(s) do begin
if ((s[i]=' ') and (s[i+1]=' ')) then delete (s,i,1)
else i := i + 1;
end;
write(s);
Александр С... У тебя в коде ошибка - такая же, как в исходном алгоритме: если в строке 3 пробела подряд, программа отработает неправильно. Надо:

while i < length(s) do if (s[i] = ' ') and (s[i + 1] = ' ') then delete (s,i,1) else inc(i);

При удалении символа i не должно меняться.