Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   поменять значение переменных... (https://forum.antichat.xyz/showthread.php?t=62139)

gold-goblin 19.02.2008 00:50

поменять значение переменных...
 
есть задание на паскале суть его проста.
Дано:
x:=y;
y:=x;

надо без использования лишней переменной сделать так чтобы получилось
X:=x;
y:=y;

Предложите выриант решения

Kaimi 19.02.2008 00:53

Код:

X=X XOR Y;
Y=X XOR Y;
X=X XOR Y;


gold-goblin 19.02.2008 01:03

Kaimi
это пракатит вроде только если значения числовые.... а надо именно с буквиными...
(паскаля под рукой нет чтоб проверить)

diehard 19.02.2008 01:03

x:=x+y;
y:=x-y;
x:=x-y;

gold-goblin 19.02.2008 01:05

diehard
а если значения буквенные?

KoMPLiMenT 19.02.2008 01:22

void swap(int& i, int& j)
{
i ^= j;
j ^= i;
i ^= j;
}

сорри паскаль благополучно забыл

gold-goblin 19.02.2008 01:28

а по проще? :)
просто так я сам сделать могу но мы только начали проходить паскаль и я боюсь училка меня не правельно поймет....

diehard 19.02.2008 01:28

gold-goblin

Все буквы (char) имеют численный charcode (в паскале функции ord() и обратная chr())

gold-goblin 19.02.2008 01:30

diehard
а ну в принцыпе можно и так.
(сам не додумался)
есть еще вырианты?

zl0y 19.02.2008 01:31

Длинна строк постоянна?

gold-goblin 19.02.2008 01:34

да

zl0y 19.02.2008 02:05

var s1,s2 : string;
i : byte;
begin
s1:='01234';
s2:='56789';
for i:=1 to 5 do begin
s1[i]:=chr(ord(s1[i]) xor ord(s2[i]));
s2[i]:=chr(ord(s1[i]) xor ord(s2[i]));
s1[i]:=chr(ord(s1[i]) xor ord(s2[i]));
end;

На асме сложнее если надо могу подумать ;)

zl0y 19.02.2008 02:18

На асме помему без привлечения 3 переменной не реально если переменные - строки,для байтов еще возможно
mov eax,byte ptr [s1+ecx]
mov ebx,byte ptr [s2+ecx]
xchg eax,ebx
mov byte ptr[s1+ecx],ebx
mov byte ptr [s2+ecx],eax

Если смотреть как мы видим этот текст то тут нету третьей переменной,но если смотреть с уровня процессора и математической логики то она есть т.к все равно число для обмена засовываеться в стек или в переменную,даже если предположить что xchg это что то тройного XOR'a то все равно должна быть переменная где храниться промежуточный результат,поправьте если я не прав,мне почему то так кажеться :(

Все таки все верно :)

Тоесть если у нас два числа 1234,5678
и мы запишем в первый разряд второго числа первый разряд первого числа,то первый разряд второго числа мы потеряем.

gold-goblin 19.02.2008 15:19

zlOy
спсибо я в асме дуб дубом ну вроде врублся вто что ты написал =)

Jes 23.02.2008 00:28

мне сегодня препод из универа сказал что в питоне есть гениальная логическая конструкция :)
Код:

a , b = b , a

nc.STRIEM 23.02.2008 01:30

незнаю правильно ли я понял
x+=y;
y=x-y;
x-=y;

gold-goblin 23.02.2008 01:43

Jes
былоб это в паскале =)

nc.STRIEM

не совсем =)
здесь у тебя не получится что
x:=x;
y:=y;

nc.STRIEM 23.02.2008 01:44

x=a y=b
после действий что я написал будет x=b y=a

Jes 23.02.2008 02:06

хы , для строк:
Код:

a:= 'one';
b:= 'two';

      a:= a + b;
      b:= Copy(a, 1, length(a)-length(b));
      a:= Copy(a, length(a)-length(b)+1, length(a)-length(b));

хотя фактичеки памяти это убьет гораздо больше чем новая переменная , имхо


Время: 18:52