КИТА unofficial

Ваши интересы => Викторины и конкурсы => Тема начата: vimmax от Февраль 12, 2007, 04:44:45



Название: "Искусство программирования" (задача 2)
Отправлено: vimmax от Февраль 12, 2007, 04:44:45
Задача №2: Необходимо поменять значения двух целочисленных переменных местами,
т.е. например: было А=68 и В=34, надо А=34 и В=68.

Условие: нельзя использовать третью переменную. Писать можно на любом языке программирования.


Название: "Искусство программирования" (задача 2)
Отправлено: BODROV от Февраль 12, 2007, 04:51:28
mov ax, 68
mov bx, 34
push ax
mov ax, bx
pop bx


Название: "Искусство программирования" (задача 2)
Отправлено: EvilMax от Февраль 12, 2007, 04:56:50
Plain C:

a = a ^ b;
b = b ^ a;
a = a ^ b;


Название: "Искусство программирования" (задача 2)
Отправлено: EvilMax от Февраль 12, 2007, 05:00:26
mov ax, 68
mov bx, 34
push ax
mov ax, bx
pop bx
Стек - это тоже дополнительная ячейка. Боюсь, не пойдет такое решение.


Название: "Искусство программирования" (задача 2)
Отправлено: grimgav от Февраль 12, 2007, 05:01:49
a = a + b;
b = a - b;
a = a - b;


Название: "Искусство программирования" (задача 2)
Отправлено: EvilMax от Февраль 12, 2007, 05:03:41
a = a + b;
b = a - b;
a = a - b;

Есть аналогичный вариант с умножением и делением. Но у этих вариантов есть одно "НО" - возможность переполнения. А, впрочем, подождем ответа автора.


Название: "Искусство программирования" (задача 2)
Отправлено: grimgav от Февраль 12, 2007, 05:05:21
Есть аналогичный вариант с умножением и делением. Но у этих вариантов есть одно "НО" - возможность переполнения. А, впрочем, подождем ответа автора.
Настолько глубоко не рыл =/ Может опять прикол в побитовых операциях ?)


Название: "Искусство программирования" (задача 2)
Отправлено: grimgav от Февраль 12, 2007, 05:07:52
Plain C:

a = a ^ b;
b = b ^ a;
a = a ^ b;

Да, так и есть =)


Название: "Искусство программирования" (задача 2)
Отправлено: vimmax от Февраль 12, 2007, 05:08:09
BODROV - Ответ #1  Респект программистам на ассемблере! Только чем отличается использование ячейки стека на ассемблере от использования третьей переменной?
В решении данной задачи не используются сторонние ячейки памяти, переменные или буферы обмена.

grimgav - Ответ #4 Правильно заметили по поводу переполнения.

EvilMax - Ответ #2 Вот это правильный ответ. EvilMax +1.

Если так дальше пойдет, то все мои задачи за месяц закончатся :)


Название: "Искусство программирования" (задача 2)
Отправлено: Sochin от Февраль 12, 2007, 05:29:16
Sochin - а что для тебя есть "проектов достаточно большого размера и сложности" ? Например проект из 231 исходника для гигабитного маршрутизатора MARVELL серии ExMxPm является достаточно большим и сложным? (кстати, он еще в продажу не поступил)

Как я могу что-то комментировать то чего не видел и если собственно непонятно о каком проекте речь? Предлагаю не начинать меряться письками. ))
Достаточно сложный проект - это проект, все нюансы реализации и устройства которого одновременно удержать в голове нельзя или очень затруднительно. Полагаю, 231 сколько-нибудь сложный модуль - это достаточно сложный проект.
Декомпозиция на модули, структурный подход, ООП - все это методы борьбы со сложностью. Если функции и методы классов предлагают контроль типов, то дефайн-макросы - это простая тупая подстановка текста без каких бы то ни было проверок.

ыыы. предлагаю такой дефайн для экспериментов:
Код:
#define int long

Хорошо если при ошибочном использовании программа не откомпилится и можно найти ошибку в коде. А если программа компилится с ошибочным использованием макроподстановки? Вот тебе уязвимости, вот тебе глюки. Если же проект содержит множество дефайнов, в том числе и нетривиальные макроподстановки, при этом проект развивается, обслуживается и обслуживается командой разработчиков, то вероятность ошибок от неправильного использования дефайнов будет возрастать.

Так что думайте и выбирайте сами. )

З.Ы. Если не ошибаюсь, то изначально дефайны были введены в С для работы с константами, а макроподстановки и эмуляция inline-функций уже потом притянули за уши. Вот для констант еще сгодятся дефайны, сложные макросы - фтопку! :)

Цитировать
Я думаю ты бы не обрадовался если бы маршрутизатор твоей сети работал на 5% медленнее, чем сейчас :)

Честно говоря, в данный момент я сомневаюсь что ощутил бы жти 5%. ))) Хотя, конечно же, это еще не показатель. )


Название: "Искусство программирования" (задача 2)
Отправлено: vimmax от Февраль 12, 2007, 05:32:12
Не будем меряться письками. Я твой ответ прочитал. Отвечать не буду. ))))


Название: "Искусство программирования" (задача 2)
Отправлено: BODROV от Февраль 12, 2007, 05:58:37
вобщем, vimmax, молодца! пиши исчо (http://kita.org.ua/index.php/topic,105.0.html)
В душе моей огонь горит прекрасный,
Его зажгли Вы - автор слов бесценных.
Перо в руке, чернила, шарф атласный...
Пишите дальше, радуйте нас бренных.
 :D


Название: Re: "Искусство программирования" (задача 2)
Отправлено: BODROV от Февраль 14, 2007, 03:37:46
а где продолжение?  :'(


Название: Re: "Искусство программирования" (задача 2)
Отправлено: vimmax от Февраль 14, 2007, 03:40:27
Я ж не могу новые вопросы задавать, пока есть еще неотвеченные топики ("Творческое и аналитическое мышление" (задача 1))...... Или можно? Кто как думает? Задачи у меня есть)))))


Название: Re: "Искусство программирования" (задача 2)
Отправлено: BODROV от Февраль 14, 2007, 03:49:27
я думаю можно! это ж разные темы...
тем более, что Sochin задал сложноватый и непонятный вопрос - никто не хочет отвечать.... а я знаю ответ;)


Название: Re: "Искусство программирования" (задача 2)
Отправлено: Sochin от Февраль 14, 2007, 04:28:12
я думаю можно! это ж разные темы...
тем более, что Sochin задал сложноватый и непонятный вопрос - никто не хочет отвечать.... а я знаю ответ;)
ха-ха. У меня тоже задач такого плана еще есть с дюжину. ))


Название: Re: "Искусство программирования" (задача 2)
Отправлено: LazarusLong от Февраль 17, 2007, 12:31:45
Как то мне однажды мне эту задачу загадали на проработке по компьютерным сетям. Минут за 15 решил в уме ;)


Название: Re: "Искусство программирования" (задача 2)
Отправлено: LazarusLong от Март 11, 2007, 10:52:26
Вот еще один вариант, кстати:

x ^= y ^= x ^=y;

Одной строкой!