Помощь - Поиск - Пользователи - Календарь
Полная версия: Поменять местом с помощью цикла.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dranik7
Текст задачи:

Поменяйте содержимое трех ячeек a,b,c.
(обмен выполняeтся циклически a->b, b->c, c->a).
дополнительных переменных не использовать

Помогите решить
volvo
Сам-то пробовал? Задача на 3 минуты, если подумать smile.gif и решается в 4 шага. В чем затруднения у тебя, расскажи?

P.S. Для разминки - сначала попробуй решить задачу для ДВУХ переменных, не пользуясь дополнительной.
TarasBer
А какого типа переменные?

> Задача на 3 минуты, если подумать

Я в своё время не осилил.
Unconnected
Такая, только с двумя переменными, была года два назад на какой-то олимпиаде... осилил, методом научного тыка.) Ну для 3х не сильно отличаться будет.
Lapp
Цитата(volvo @ 8.10.2010 21:34) *
Задача на 3 минуты, если подумать
Думанье включается в 3 мин? ))
У меня не было случая ее порешать ((, я прочитал сразу в какой-то книге (о вреде чтения, кстати)). Я сильно сомневаюсь, что я бы ее асилел..
Unconnected
Я чего-то недопонял, или все дело правда тут?)

var a,b,c:integer;

Procedure swap(var v1,v2:integer);
begin
inc(v1,v2);
v2:=v1-v2;
v1:=v1-v2;
end;

begin
read(a,b,c);
swap(a,b);
swap(b,c);
swap(c,a);
write(a,' ',b,' ',c);
end.


Кстати, кажется, такой обмен (a->b, b->c, c->a) эквивалентен b->c..
TarasBer
> Кстати, кажется, такой обмен (a->b, b->c, c->a) эквивалентен b->c..

swap(c,a) тут лишний.
Lapp
Цитата(TarasBer @ 9.10.2010 1:13) *
> Кстати, кажется, такой обмен (a->b, b->c, c->a) эквивалентен b->c..

swap(c,a) тут лишний.
yes2.gif
Un, ты слишком буквально трактовал условие )). Если бы условие было a->b, b->a (что означает: значение из a должно перейти в b, а значение из b перейти в a) - ты бы тоже два раза свопил? ))
Unconnected
Ну как бы для наглядности) Да я вообще то и написал это, в том посте))
Lapp
Цитата(Unconnected @ 9.10.2010 1:41) *
то и написал это
Так ты то написал или это? ))

Но!.. Un, ты забыл кое-что важное. В таком виде процедура swap не пройдет теста..
volvo
Цитата
В таком виде процедура swap не пройдет теста..
А кроме всего прочего - она и не нужна тут ни разу, все делается гораздо проще. yes2.gif
Unconnected

var a,b,c:integer;

begin
read(a,b,c);
c:=a+b+c;
b:=c-b-a;
a:=c-b-a;
a:=c-b-a;
c:=c-b-a;
write(a,' ',b,' ',c);
end.




Ну мне вообще проще было бы по первому способу...)
volvo
Цитата
Ну мне вообще проще было бы по первому способу...)
Ну, вообще-то твой последний способ неправильный, тебя все время тянет сделать что-нибудь лишнее:

Running "f:\programs\pascal\test.exe "
3 9 2
3 2 9


- это неправильное поведение программы...
Unconnected
Цитата
- это неправильное поведение программы...


Чего это вдруг оно неправильное? smile.gif
volvo
А что, правильное? Значение A у тебя вообще не меняется, скажем. Это так надо? Вообще написано, что старое значение A должно было перейти в B, а потом ей должно присвоиться новое значение - бывшее раньше в C...
Unconnected
Но, в итоге содержание ячеек таким же и должно получиться ведь (эквивалентное b<->c)? Да, и правда, тут, наверное, важен сам процесс (наряду с неиспользованием доп.переменных).. Но и "чистого" обмена, по-моему, тут тоже не получится, будут левые действия, как сейчас.

Сбили с панталыку в начале темы, оптимизаторы ))
Dranik7
Unconnected, в обоих вариантах нет циклов, а надо с помощью цикла
TarasBer
> a:=c-b-a;
> a:=c-b-a;

Зачем 2 раза? Один раз тут лишний, если его убрать, всё будет нормально.

> Unconnected, в обоих вариантах нет циклов, а надо с помощью цикла

В условии сказано, что нужен циклический обмен, этот код и делает цилический обмен.
А если нужно, чтобы был цикл for i := ..., то надо, чтобы числа были не в переменных a, b, c, а в массиве, и требование, чтобы первый элемент перешёл в последний, а остальные сдвинулись на единичку назад.
Unconnected
Цитата

Зачем 2 раза? Один раз тут лишний, если его убрать, всё будет нормально.


Он там не лишний.. "нормально" и сейчас, если иметь в виду конечный результат.
TarasBer
> если иметь в виду конечный результат

Конечный результат - это не то, что получается в результате 3 парных перестановок. Понимаешь?
Unconnected
Цитата

Конечный результат - это не то, что получается в результате 3 парных перестановок. Понимаешь?


Я имею в виду содержание ячеек после перестановок. Другой разговор, что я меняю не по инструкции, не в том порядке..
TarasBer
У тебя в итоге (a,b,c) перешло в (a,c,b)
А надо (a,b,c)->(b,c,a)

Цитата(Lapp)
Un, ты слишком буквально трактовал условие )). Если бы условие было a->b, b->a (что означает: значение из a должно перейти в b, а значение из b перейти в a) - ты бы тоже два раза свопил? ))
Unconnected
Ёёмаё.. wacko.gif Целую страницу морочил я людям голову..( Сейчас ещё раз все перечитал - открылся новый, тайный смысл всех постов lol.gif Вот что значит внимательно читать задание. Ну хорошо если правда все решается убиранием одной строки, по словам TarasBer'a. smile.gif
Lapp
Цитата(Unconnected @ 9.10.2010 20:40) *
Ёёмаё..
.. и бутылка рому? )) йатарчйу ))

Цитата
открылся новый, тайный смысл всех моих постов
"вознесшись прямо в рай, я в ад сойти готов.."

- извини, Un, я не удержался - уж очень хорошо ложилось..

Цитата
Ну хорошо если правда все решается убиранием одной строки, по словам TarasBer'a. smile.gif
Нет, не все.. no1.gif
Unconnected
Цитата
А надо (a,b,c)->(b,c,a)


Опять торможу, что ли.. А разве (a,b,c) не в (с,a,b) должно перейти за один циклический сдвиг?

Цитата
"вознесшись прямо в рай, я в ад сойти готов.."


lol.gif "метаясь меж begin и end, во имя трёх основ..." ))

Да, убиранием не решается. Ну, тогда я бы возвратился к замене, то есть, к swap (немного не так использовав, конечно, в основном блоке). А что с ней не так? Типа, открытые переменные в параметрах, побочные эффекты и т.п.?
TarasBer
> А разве (a,b,c) не в (с,a,b) должно перейти за один циклический сдвиг?

А там надо вправо двигать, или влево? Ну или наоборот, короче сдвинуть на единицу.

> Ну, тогда я бы возвратился к замене, то есть, к swap (немного не так использовав, конечно, в основном блоке). А что с ней не так? Типа, открытые переменные в параметрах, побочные эффекты и т.п.?

В данном случае ты же не передаёшь туда одинаковые адреса, значит нормально всё будет.
Lapp
Цитата(Unconnected @ 11.10.2010 0:30) *
"метаясь меж begin и end, во имя трёх основ..."
Потерян размер и промежуточная рифма.. беру на себя смелость исправить:
"метаясь между try - except во имя снов..."

и добавляю свою лепту
"о, друг мой, самурай, не надо лишних слов"

Цитата(Unconnected @ 11.10.2010 0:30) *
А что с ней не так? Типа, открытые переменные в параметрах, побочные эффекты и т.п.?
Типа того.. ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.