[Pascal]Обработка строк

Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):for i:= length(s) downto 1 do if s=s[i+1] then delete(s,i,1);

Колядин Максим, ты так ничего не понял. s[i+1] уйдет за пределы стринга.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Somewhere писал(а):Колядин Максим, ты так ничего не понял. s[i+1] уйдет за пределы стринга.
Почему это не понял. Всё я понимаю, [s+1] уйдёт за пределы, но в данном случае это никак не отразится на работоспособности программы. Не веришь - проверь.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Somewhere+ смотрит "[Pascal]Обработка строк"
Вот оно, дежавю! Ответь что-нибудь!!
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Почему это не понял. Всё я понимаю, [s+1] уйдёт за пределы, но в данном случае это никак не отразится на работоспособности программы. Не веришь - проверь.
Не верю - задача программиста не вычислять вероятность работоспособности программы, а стремить ее к 100%

Код: Выделить всё

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.
Смотрим результат, зато забавно - He we are - hells be :-)
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

somewhere писал(а):Не верю - задача программиста не вычислять вероятность работоспособности программы, а стремить ее к 100%
Я вероятность не вычисляю, я на 100% знаю, что программа будет работать корректно. Веришь ты, или нет - это уже другой вопрос, совершенно меня не интересующий. Работоспособность программы не будет теряться, если length(s) лежит в интервале -1..1
(length(s)-1]). Если ты ди сих пор не понял, почему так получается, тогда объясняю:

Код: Выделить всё

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'
Твоя программа только подтверждает мною сказанное. У меня результат такой, каким он должен быть (bel). И ещё, somewhere, мы, всё-таки, русские люди, давай же будем уважать наш язык и употреблять его во всех возможных нам случаях. Для заметки: в Америке русские буквы занимают примерно 0,01% всех букв(если не меньше), в россии же эта цифра достигает 25%. Помотри на экран монитора, оглянись вокруг, приглядись к какой-нибудь надписи - безспорно, ты увидел американские слова... Я всегда думаю, почему русские, например, не назвали автомобиль Lada - Ладой, почему группа Hi-Fi не назвала себя группой "Хай-Фай". Многие со мной согласятся, что мы не можем себе представить, чтобы на заднем бампере американского автомобиля была надпись "Форд"...
somewhere писал(а):

Код: Выделить всё

Writeln('What a f..., where is last letter?')][/quote]
И ещё, если я не ошибаюсь ты хотел сказать "Что за х... была в последнем письме?" , а не "Что за х... где последнее письмо?". (where is - were in)
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Код: Выделить всё

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.
Попробуй так..
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Твоя программа только подтверждает мною сказанное
Ты хоть ее запускал? В том виде, который я написал. Там не с проста стоит присваивание одному и тому же стрингу двух значений. После второго присваивания длина стринга уменьшилась на 1-цу. Соответственно s[i+1] в первом проходе = 'l', s - тоже равно 'l'. Программа поэтому работает неверно. Хотя она и выходит за границы стринга, но память на этом не заканчивается, и за пределами стринга стоит буква 'l', т.к. раньше она была именно в этом месте. Не стоит думать, что там пробел.
И это не единственный случай, когда она будет работать неверно.
Если ты ее запускал в оригинальном виде, то результат - 'He we are - hells be' - последняя буква потеряна. Если не сильно знаешь английский, то не надо умничать. Перевод слова Letter - буква, письмо.
Да и вообще выходы за пределы выделенной памяти недопустимы в любых языках. В операционных системах работающих в защищенном режиме при попытках обращения за пределы выделенной памяти карается Exception.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

somewhere писал(а):Ты хоть ее запускал? В том виде, который я написал. Там не с проста стоит присваивание одному и тому же стрингу двух значений. После второго присваивания длина стринга уменьшилась на 1-цу. Соответственно s[i+1] в первом проходе = 'l', s - тоже равно 'l'. Программа поэтому работает неверно. Хотя она и выходит за границы стринга, но память на этом не заканчивается, и за пределами стринга стоит буква 'l', т.к. раньше она была именно в этом месте. Не стоит думать, что там пробел.
И это не единственный случай, когда она будет работать неверно.

Дело в том, somewhere, что ты совершенно отклонился от изначальной темы. Согласно ей, нужно удалить рядом стоящие символы. И, врядли, одной и той же переменной, как у тебя в программе, два раза будет присвоено значение. Так что,
for i:= length(s) downto 1 do if s=s[i+1] then delete(s,i,1)] - условие правильное.

Код: Выделить всё

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 писал(а):Если не сильно знаешь английский, то не надо умничать.
Наоборот, умничаю я потому, что знаю его достаточно сильно. Просто подумал что там слово "письмо", исправил. К тому же предложение "Что за х... была в последнем письме?" имеет смысл в нашем с тобой случае...
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Колядин Максим писал(а):И, вряд ли, одной и той же переменной, как у тебя в программе, два раза будет присвоено значение.
Хм. Весьма занятное утверждение. То есть, по твоему, в программах (за все время их работы) значение переменным присваиивается ЛИШЬ ОДНАЖДЫ????

Видишь ли, кажущееся нелепым присвоение два раза подряд значения одной и той же переменной в программе somewhere сделано потому, что это ПРОГРАММА-ПРИМЕР, иллюстрирующая данную ситуацию. В реальной программе второе (и дажее - третье, четвертое) присвоения могут быть выполнены, конечно же, через какое-то время, "через" несколько операторов и т.п.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Собственно, даже такая программа МОЖЕТ обработаться неправильно:

Код: Выделить всё

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;
Никто не поручится, что строка s1 не встанет в памяти непосредственно за строкой s, и буква b не будет удалена из строки
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить