PDA

Просмотр полной версии : поменять значение переменных...


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));
хотя фактичеки памяти это убьет гораздо больше чем новая переменная , имхо