Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Katrinka
Задача такая: заменить каждую группу повторяющихся символов в строке одним символом (строка состоит из букв, отсортированных по алфавиту).
я написала так:
for i:=1 to ord(s[0]) do
if a[i]=a[i+1] then delete (s,i,1) , но почему-то не работает
volvo
Ты при Delete изменяешь длину строки, так? А цикл будет продолжаться до той длины строки, которая была ПЕРЕД циклом, так что даже если бы это и работало - доверять результату нельзя; я уж не говорю о том, что Ord(s[0]) вообще для меня не существует, потому что моим компилятором не признается...
Malice
Поменяй
if a[i]=a[i+1] then
на
while (s[i]=s[i+1]) and (I<length(s)) do
Должно работать.
Katrinka
Я так написала, но все равно работает неправильно...
Malice
Приведи полный код, что вводишь и что получается.
Katrinka
procedure delete_char(var s:string);
var i,j,n:integer;
s1:string;
begin


while (a[i]=a[i+1]) and (a[i]<length(s)) then delete(s,i,1)

end;

Выводится без изменения
Malice
А что такое a[i], если строка в s ?! Да и вообще, найди в этих строках отличия:
while (a[i]=a[i+1]) and (a[i]<length(s)) then
while (s[i]=s[i+1]) and (I<length(s)) do
еще вопросы есть ?
Katrinka
Это понятно, это я в текстовом редакторе опечаталась.В паскале написано правильно и не работает.
Malice
Проблемы с редактором- прикрепи файл.
Katrinka
Так выглядит код:
procedure delete_char(var s:string);
var i:integer;
s1:string;
begin
while (s[i]=s[i+1])and(s[i]<length(s)) do begin delete(s,i,1); i:=i+1 end;
end;
Michael_Rybak
Во-первых, переменная i ничему не равна в начале. Во-вторых, лучше делать не так; лучше пройтись циклом for, и генерить вторую строку, добавляя в нее символы, отличающиеся от предыдущих (if (i = 1) or (s[i - 1] <> s[i]) then s1 := s1 + s[i]). В-третьих, если уже хочешь так, то просто на бумажке выполни несколько шагов для строки AABBCC и увидишь, что не так.
Malice
Издеваешься ?
В своем первом посте я сказал что на что поменять, на всякий случай приведу как оно должно выглядеть:
procedure delete_char(var s:string);
var i:integer;
begin
for i:=1 to ord(s[0]) do
while (s[i]=s[i+1]) and (I<length(s)) do
delete (s,i,1);
end;

Если не получится переписать, я могу прикрепить файл, надо ?
Katrinka
Спасибо, заработало. Я изначально так и писала, только в тексте основной программы не запусила процедуру...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.