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);
for i := length(s) downto 2 do if (s[i] = ' ') and (s[i - 1] = ' ') then delete(s, i, 1);
length(s) считается один раз перед началом цикла, а ты в цикле длину меняешь
length(s) выдает кол-во элементов
индексы с 0 начинаются поэтому последний элемент имеет индекс length(s)-1
при i = length(s)-1 проверка s[i+1] выведет ошибку, т. к такого элемента не существует.
Надо length(s)-1 заменить length(s)-2
индексы с 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
Ответ Сергея не верный
Индексы у строк в Паскале считаются с 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);
Индексы у строк в Паскале считаются с 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);
Похожие вопросы
- Программа не работает как надо (С++). Задача: Вывести сумму всех элементов массива, кратных данному числу К.
- Подскажите есть ли в c# строковые имена индексов массива как в PHP (пример a["abc"])? если есть то как с ними работать
- c++.Неправильно выводятся индексы l и r,соответствующие индексам массива. Как это исправить?
- Написать программу в VBA арифметической прогрессии в динамическом массиве.
- нужно создать на паскале программу которая будет находить повторяющиеся слова в массиве
- Как прикрутить в данную программу вывод всех вычислительный действий программы?
- Подскажите как сделать данную программу?
- помогите записать данную программу на с++)
- Написал небольшую программу, не могу понять почему не работает цикл while и оператор else
- Как написать данную программу сам пытался ( C++ )
while i < length(s) do if (s[i] = ' ') and (s[i + 1] = ' ') then delete (s,i,1) else inc(i);
При удалении символа i не должно меняться.