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

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

Форум «Всё о Паскале» _ Задачи _ Поменять местом с помощью цикла.

Автор: Dranik7 9.10.2010 0:15

Текст задачи:

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

Помогите решить

Автор: volvo 9.10.2010 0:34

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

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

Автор: TarasBer 9.10.2010 1:02

А какого типа переменные?

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

Я в своё время не осилил.

Автор: Unconnected 9.10.2010 1:14

Такая, только с двумя переменными, была года два назад на какой-то олимпиаде... осилил, методом научного тыка.) Ну для 3х не сильно отличаться будет.

Автор: Lapp 9.10.2010 3:06

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

Автор: Unconnected 9.10.2010 3:58

Я чего-то недопонял, или все дело правда тут?)


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 9.10.2010 4:13

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

swap(c,a) тут лишний.

Автор: Lapp 9.10.2010 4:35

Цитата(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 9.10.2010 4:41

Ну как бы для наглядности) Да я вообще то и написал это, в том посте))

Автор: Lapp 9.10.2010 8:36

Цитата(Unconnected @ 9.10.2010 1:41) *
то и написал это
Так ты то написал или это? ))

Но!.. Un, ты забыл кое-что важное. В таком виде процедура swap не пройдет теста..

Автор: volvo 9.10.2010 14:41

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

Автор: Unconnected 9.10.2010 15:10


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 9.10.2010 15:17

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

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


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

Автор: Unconnected 9.10.2010 15:22

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


Чего это вдруг оно неправильное? smile.gif

Автор: volvo 9.10.2010 15:34

А что, правильное? Значение A у тебя вообще не меняется, скажем. Это так надо? Вообще написано, что старое значение A должно было перейти в B, а потом ей должно присвоиться новое значение - бывшее раньше в C...

Автор: Unconnected 9.10.2010 15:44

Но, в итоге содержание ячеек таким же и должно получиться ведь (эквивалентное b<->c)? Да, и правда, тут, наверное, важен сам процесс (наряду с неиспользованием доп.переменных).. Но и "чистого" обмена, по-моему, тут тоже не получится, будут левые действия, как сейчас.

Сбили с панталыку в начале темы, оптимизаторы ))

Автор: Dranik7 9.10.2010 21:21

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

Автор: TarasBer 9.10.2010 21:48

> a:=c-b-a;
> a:=c-b-a;

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

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

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

Автор: Unconnected 9.10.2010 22:13

Цитата

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


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

Автор: TarasBer 9.10.2010 22:26

> если иметь в виду конечный результат

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

Автор: Unconnected 9.10.2010 22:54

Цитата

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


Я имею в виду содержание ячеек после перестановок. Другой разговор, что я меняю не по инструкции, не в том порядке..

Автор: TarasBer 9.10.2010 23:22

У тебя в итоге (a,b,c) перешло в (a,c,b)
А надо (a,b,c)->(b,c,a)

Цитата(Lapp)
Un, ты слишком буквально трактовал условие )). Если бы условие было a->b, b->a (что означает: значение из a должно перейти в b, а значение из b перейти в a) - ты бы тоже два раза свопил? ))

Автор: Unconnected 9.10.2010 23:40

Ёёмаё.. wacko.gif Целую страницу морочил я людям голову..( Сейчас ещё раз все перечитал - открылся новый, тайный смысл всех постов lol.gif Вот что значит внимательно читать задание. Ну хорошо если правда все решается убиранием одной строки, по словам TarasBer'a. smile.gif

Автор: Lapp 10.10.2010 4:55

Цитата(Unconnected @ 9.10.2010 20:40) *
Ёёмаё..
.. и бутылка рому? )) йатарчйу ))

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

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

Цитата
Ну хорошо если правда все решается убиранием одной строки, по словам TarasBer'a. smile.gif
Нет, не все.. no1.gif

Автор: Unconnected 11.10.2010 3:30

Цитата
А надо (a,b,c)->(b,c,a)


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

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


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

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

Автор: TarasBer 11.10.2010 3:40

> А разве (a,b,c) не в (с,a,b) должно перейти за один циклический сдвиг?

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

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

В данном случае ты же не передаёшь туда одинаковые адреса, значит нормально всё будет.

Автор: Lapp 11.10.2010 6:40

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

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

Цитата(Unconnected @ 11.10.2010 0:30) *
А что с ней не так? Типа, открытые переменные в параметрах, побочные эффекты и т.п.?
Типа того.. ))