Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Строки

Автор: Katrinka 16.12.2006 23:57

Задача такая: заменить каждую группу повторяющихся символов в строке одним символом (строка состоит из букв, отсортированных по алфавиту).
я написала так:
for i:=1 to ord(s[0]) do
if a[i]=a[i+1] then delete (s,i,1) , но почему-то не работает

Автор: volvo 17.12.2006 0:04

Ты при Delete изменяешь длину строки, так? А цикл будет продолжаться до той длины строки, которая была ПЕРЕД циклом, так что даже если бы это и работало - доверять результату нельзя; я уж не говорю о том, что Ord(s[0]) вообще для меня не существует, потому что моим компилятором не признается...

Автор: Malice 17.12.2006 0:09

Поменяй
if a[i]=a[i+1] then
на
while (s[i]=s[i+1]) and (I<length(s)) do
Должно работать.

Автор: Katrinka 17.12.2006 1:05

Я так написала, но все равно работает неправильно...

Автор: Malice 17.12.2006 1:30

Приведи полный код, что вводишь и что получается.

Автор: Katrinka 17.12.2006 3:02

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 17.12.2006 3:17

А что такое 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 17.12.2006 3:20

Это понятно, это я в текстовом редакторе опечаталась.В паскале написано правильно и не работает.

Автор: Malice 17.12.2006 3:31

Проблемы с редактором- прикрепи файл.

Автор: Katrinka 17.12.2006 3:37

Так выглядит код:
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 17.12.2006 3:44

Во-первых, переменная i ничему не равна в начале. Во-вторых, лучше делать не так; лучше пройтись циклом for, и генерить вторую строку, добавляя в нее символы, отличающиеся от предыдущих (if (i = 1) or (s[i - 1] <> s[i]) then s1 := s1 + s[i]). В-третьих, если уже хочешь так, то просто на бумажке выполни несколько шагов для строки AABBCC и увидишь, что не так.

Автор: Malice 17.12.2006 3:46

Издеваешься ?
В своем первом посте я сказал что на что поменять, на всякий случай приведу как оно должно выглядеть:

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 17.12.2006 3:54

Спасибо, заработало. Я изначально так и писала, только в тексте основной программы не запусила процедуру...