XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
MPI3
Хм...
offline
Опыт: 24,597
Активность:
Обмен значиниями двух переменных
Вот у мну есть(например) 2 переммные: инт1 и инт2.
Как обменять их значенияЮ без вмешательства третей???
Старый 08.02.2007, 19:06
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
a:=a+b
b:=a-b
a:=a-b
Старый 08.02.2007, 19:13
DioD

offline
Опыт: 45,134
Активность:
никак, без третьей переменной ты нарушает пару законов логики...
Старый 08.02.2007, 19:13
Maximus
Blue Leader :D
offline
Опыт: 14,397
Активность:
да только с третьеё переменной.
Garret а что ты написал?
Старый 08.02.2007, 19:15
DioD

offline
Опыт: 45,134
Активность:
он написал с третьей переменной которую хранит в конструкции, опять же переменная есть.
Старый 08.02.2007, 19:17
Maximus
Blue Leader :D
offline
Опыт: 14,397
Активность:
DioD а, понятно.
Старый 08.02.2007, 19:20
DioD

offline
Опыт: 45,134
Активность:
a:=a+b
b:=a-b
a:=a-b
легко и просто превращается в аналог с явной перменной переменной
set A1 = A
set A = B
set B = A1
Старый 08.02.2007, 19:22
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Код:
local integer a=***
local integer b=***
set a=a+b
set b=a-b
set a=a-b

Garret вроде это хотел написать :) вроде должно работать!

DioD - только "a" и "b" !
Старый 08.02.2007, 19:24
Coffin666
Universal dominator
offline
Опыт: 3,242
Активность:
Цитата:
a:=a+b
b:=a-b
a:=a-b


Вроде праильна и 2 перемнные только
Старый 08.02.2007, 19:24
GadenbIsh
Просто Гад
offline
Опыт: 70,430
Активность:
Garret
все правильно говорит. Это способ без введения новой переменной.
Старый 08.02.2007, 19:27
Maximus
Blue Leader :D
offline
Опыт: 14,397
Активность:
Ога, Garret прав.
Старый 08.02.2007, 19:29
DioD

offline
Опыт: 45,134
Активность:
Цитата:
Сообщение от MrSmiLe
DioD - только "a" и "b" !


как вам объяснить что переменная всё равно есть но она сохранена непосредственно в конструкции?
Старый 08.02.2007, 19:31
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
DioD но мы же не создаём новую локальную переменную, а это хорошо :)
Старый 08.02.2007, 19:33
DioD

offline
Опыт: 45,134
Активность:
дело в том что так нельзя обменивать большие числа...
да и с отрицательными будут глюки
Старый 08.02.2007, 19:36
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
DioD - не спорю, всё зависит от манипулируемых чисел. Так что MPI3 если у тебя дело с маленькими "плюсовыми" числами то это делается так как написали выше, а если нет, тогда нужна третья переменная!
Старый 08.02.2007, 19:46
DioD

offline
Опыт: 45,134
Активность:
объявить третью переменную проще чем ловить глюки...
Старый 08.02.2007, 19:48
vuzya

offline
Опыт: 464
Активность:
2DioD 3 операции != 3 переменных.
и еще: по-моему (и по законам логики/математики) отрицательные числа работают. Можеш доказать(матеметически или методом подбора) обратное?

set a=a+b
set b=a-b
set a=a-b

set a=a*b
set b=a/b
set a=a/b

Должны работать для всех чисел, если при первом действии число не выходит за границу охватываемую переменной.(поидее так еще с N-ным степенем и логарифмом можно, но это уже бред)

а вообще в програмировании для обмена переменных местами исползуют операцио "xor"(тока в джассе ее броде-как надо описывать самостоятельно). Виглядит так:
set a=a xor b
set b=a xor b
set a=a xor b

Принцып действия на булевый тип я думаю известен всем, а на цэлые х.з.
Если кому-то интересно могу обьяснить поподробнее.
Старый 08.02.2007, 21:21
DioD

offline
Опыт: 45,134
Активность:
Дело в том что все нормальные модмейкеры вводят выделеные глобальные переменные для подобных случаев.
Во первых глобалка всё равно нужна для отлова смерти потоков, во вторых
присвоение 3х значений БЫСТРЕЕ чем высчитывание их 3 раза, тем более умножением.
еще бы степень засунули
лимит числа (2^31) - 1
я не где не написал что отрицательные числа не работают, глюки != не работает.
Старый 09.02.2007, 03:39
nic666

offline
Опыт: 5,612
Активность:
DioD
Метод
set a=a+b
set b=a-b
set a=a-b

не так уж и плох в самом деле.

1) Никаких глюков с отрицательными числами нет. Они обрабатываются совершенно одинаково как и положительные.
Вот если будете настаивать - давайте контрпример в студию. Именно простой логикой доказывается что таких глюков быть не может. Могут только см.2

2) С большими числами может быть глюк но это если a+b > 2 000 000 000, а это очччень редкое явление. На практике редко используются значения больше 10000

3) ЕДИНСТВЕННЫЙ ВАЖНЫЙ недостаток:
указанная конструкция в ПЯТЬ РАЗ медленее чем при использовании третей переменной... все это съедают сложения и вычитания, а также 6 обращений к памяти вместо 3х....

nic666 добавил:
P,S,
я бы лично с этим не возился...
обмен таким образом выгоден при жестко ограниченных ресурсах...как например регистры процессора....
а экономить одну переменную в памяти ИМХО : глупость!

Отредактировано nic666, 09.02.2007 в 09:50.
Старый 09.02.2007, 09:52
dk

offline
Опыт: 60,293
Активность:
Как я полагаю просто мпи3 на уроке информатики задали эту задачку, вот он нас и спросил) Это такая распространенная проверочная задачка...
Старый 09.02.2007, 10:27
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 06:15.