Re: [Pascal]Обработка строк
Добавлено: 06 мар 2007, 17:21
" писал(а):for i:= length(s) downto 1 do if s=s[i+1] then delete(s,i,1);
Колядин Максим, ты так ничего не понял. s[i+1] уйдет за пределы стринга.
" писал(а):for i:= length(s) downto 1 do if s=s[i+1] then delete(s,i,1);
Почему это не понял. Всё я понимаю, [s+1] уйдёт за пределы, но в данном случае это никак не отразится на работоспособности программы. Не веришь - проверь.Somewhere писал(а):Колядин Максим, ты так ничего не понял. s[i+1] уйдет за пределы стринга.
Не верю - задача программиста не вычислять вероятность работоспособности программы, а стремить ее к 100%" писал(а):Почему это не понял. Всё я понимаю, [s+1] уйдёт за пределы, но в данном случае это никак не отразится на работоспособности программы. Не веришь - проверь.
Код: Выделить всё
var i:Integer;
s:String;
begin
s := 'I am on the hiway to hell';
s := 'Here we are - hells bell';
for i := length(s) downto 1 do
if s[i]=s[i+1] then
delete(s,i,1);
Writeln(s);
Writeln('What a f..., where is last letter?');
end.
Я вероятность не вычисляю, я на 100% знаю, что программа будет работать корректно. Веришь ты, или нет - это уже другой вопрос, совершенно меня не интересующий. Работоспособность программы не будет теряться, если length(s) лежит в интервале -1..1somewhere писал(а):Не верю - задача программиста не вычислять вероятность работоспособности программы, а стремить ее к 100%
Код: Выделить всё
s:='AAAABBBB';
for i:= length(s) downto 1 do //от 'AAAABBBB' вниз до 1 делать
if s[i]=s[i+1] then delete(s,i,1); //да, здесь S[i+1] выходит за пределы, но работоспособность не теряется, так как
[B]s[i]<>s[i+1][/B] ('B'<>''), и в это условие программа даже заглядывать не будет.
write(s); // итог - S='AB'
somewhere писал(а):Код: Выделить всё
Writeln('What a f..., where is last letter?')][/quote] И ещё, если я не ошибаюсь ты хотел сказать "Что за х... была в последнем письме?" , а не "Что за х... где последнее письмо?". (where is - were in)
Код: Выделить всё
var i:Integer;
s:String;
begin
s := 'Here we are - hells bell';
for i := length(s) downto 1 do
if s[i]=s[i+1] then
delete(s,i,1);
Writeln(s);
Writeln('What a f..., did you say?');
end.
Ты хоть ее запускал? В том виде, который я написал. Там не с проста стоит присваивание одному и тому же стрингу двух значений. После второго присваивания длина стринга уменьшилась на 1-цу. Соответственно s[i+1] в первом проходе = 'l', s - тоже равно 'l'. Программа поэтому работает неверно. Хотя она и выходит за границы стринга, но память на этом не заканчивается, и за пределами стринга стоит буква 'l', т.к. раньше она была именно в этом месте. Не стоит думать, что там пробел." писал(а):Твоя программа только подтверждает мною сказанное
somewhere писал(а):Ты хоть ее запускал? В том виде, который я написал. Там не с проста стоит присваивание одному и тому же стрингу двух значений. После второго присваивания длина стринга уменьшилась на 1-цу. Соответственно s[i+1] в первом проходе = 'l', s - тоже равно 'l'. Программа поэтому работает неверно. Хотя она и выходит за границы стринга, но память на этом не заканчивается, и за пределами стринга стоит буква 'l', т.к. раньше она была именно в этом месте. Не стоит думать, что там пробел.
И это не единственный случай, когда она будет работать неверно.
Код: Выделить всё
uses crt;
var s: string;
i: integer;
begin
clrscr;
readln(s);
writeln('Текст до изменений :',s);
for i:= length(s) downto 1 do if s[i]=s[i+1] then delete(s,i,1);
writeln('текст после изменений',s);
readkey;
end.
Приведи-ка ещё пример.somewhere писал(а):И это не единственный случай, когда она будет работать неверно.
Наоборот, умничаю я потому, что знаю его достаточно сильно. Просто подумал что там слово "письмо", исправил. К тому же предложение "Что за х... была в последнем письме?" имеет смысл в нашем с тобой случае...somewhere писал(а):Если не сильно знаешь английский, то не надо умничать.
Хм. Весьма занятное утверждение. То есть, по твоему, в программах (за все время их работы) значение переменным присваиивается ЛИШЬ ОДНАЖДЫ????Колядин Максим писал(а):И, вряд ли, одной и той же переменной, как у тебя в программе, два раза будет присвоено значение.
Код: Выделить всё
var s,s1:string
begin
s:='123b';
s1='bba';
for i:= length(s) downto 1 do if s[i]=s[i+1] then delete(s,i,1);
end;