Jak zamienić miejscem dwie zmienne ??

0

Witam !!!
Jak można zamienić miejscem dwie zmienne tego samego typu (wartości) nie używając zmiennej pomocniczej, czyli wykonać operację:

type
Ttyp = jakiś typ;
var
x,zm1,zm2:Ttyp;

begin
zm1:=coś;
zm2:=coś innego;

x:=zm1;
zm1:=zm2;
zm2:=x;

Chodzi o to by nie używać zmiennej dodatkowej (x) i żeby działało to dla dowolnego typu, bo dla typów liczbowych można tak:

zm1:=zm1+zm2;
zm2:=zm1-zm2;
zm1:=zm1-zm2;

0

Po prostu nie da się zrobić czegoś takiego. Powody chyba znasz...

0

Chodzi o to by nie używać zmiennej dodatkowej (x) i żeby działało to dla dowolnego typu, bo dla typów liczbowych można tak:

zm1:=zm1+zm2;
zm2:=zm1-zm2;
zm1:=zm1-zm2;

no dla Stringow by sie dalo (pokombinowac z Pos() wystarczy), a co do innych typow to moze najpierw zamienic je na reprezentacje liczbową

0

Dla zmiennych liczbowych znalazłeś rozwiązanie.
Dla zmiennych znakowych można operować na wartościach w kodzie ASCII
[code]
var x,y : char;
begin
x:='Z';
y:='a';
writeln('x= ',x);
writeln('y= ',y);

x:=char(ord(x)+ord(y));
y:=char(ord(x)-ord(y));
x:=char(ord(x)-ord(y));

writeln('Po zamianie');

writeln('x= ',x);
writeln('y= ',y);
readkey;
end
[/code]
Zmienną String można potraktować jak kilka znaków. Jeżeli tylko ktoś
ma ochotę się bawić.

0

No tak - wszystko cacy, ale podobno da się to wykonać dla dowolnego typu, nawet zdefiniowanego przez użytkownika (a może raczej programiste :-) ), rownież dla dynamicznych struktur typu stos, kolejka, lista itp.
Pytaniem pozostaje w dalszym ciągu jak to zrealizować ??

Po prostu nie da się zrobić czegoś takiego. Powody chyba znasz...

Cóż - nie znam tych powodów, ale chyba domyślam się skąd masz ponad tysiąc postów... ;-)

0

Cóż - nie znam tych powodów, ale chyba domyślam się skąd masz ponad tysiąc postów... ;-)

Ależ tu nie trzeba być wielkim myślicielem, to chyba logiczne, że jak siedzę na forum ponad rok i codziennie tu zaglądam, to będę miał sporą ilośc postów. A co do problemu - sądzę, że gdybyś nie znał powodu, to byś się wcale nie zastanawiał, czy to możliwe, powód jest w końcu logiczny. Jeśli zapełnisz miejsce w pamięci zmiennej a zmienną b, to obie zmienne będą miały wartość b, tak więc nie będzie się dało załadować wartości zmiennej a do zmiennej b, bo tak naprawdę załadujemy znowu b. Dla zmiennych typu liczbowego rozwiązanie się znalazło. Jednak uważam, że lepiej zająć kolejne 4 bajty (w przypadku integer) pamięci, niż wykonywać 3 operacje arytmetyczne na tych liczbach. W obecnych czasach pamięci w komputerach jest bardzo dużo, a taki kod, szczególnie wykonywany w pętli mógłby spowolnić procesor (może się czepiam, ale to zawsze szybciej :-) ). Po drugie, nie będzie to przecież działało dla typów rekordowych, no chyba żebyś miejsce w pamięci, zajmowane przez te rekordy potraktował jako liczbę. Zadziała to jednak jedynie dla rekordów najwyżej ośmiobajtowych (o ile się nie mylę, to własnie najwiekszy typ całkowity w delphi ma 64 bity). Mówiąc ogólnie, z takimi kombinacjami jest dużo roboty, a nie dają one żadnego wzrostu wydajności, wręcz jej spadek. Tak więc zupełnie nie opłaca się spowalniac oraz komplikować programu kosztem kilku zaledwie bajtów.

0

thenkles ma rację, te kilka bajtów liczyło sie w czasach kiedy 640 kb wystarczy kazdemu... obecnie: 4GB wystarczy każdemu przez najbliższy rok ;-)

na serio: obecnie w dobie szybkich procesorów i pojemniości pamięci rzędu kilkuset MB najlepiej uzyć zmiennej dynamicznej (robionej przez new i dispose), troche zajmie w pamieci, ale przez ułamki sekund, a proca zajmie nie więcej niż 100 cykli

0

Smiglo: ja mysle, ze mgr R. polecial sobie z nami w kulki mowiac ze to sie da zrobic, bo tez nad tym myslem i nic hehe :P

Panowie: jesli te zmienne dowolnego typu... da sie zamienic to przekazemy wam co i jak - jako ciekawostke :)

0

procedure Zamien(var q, w: Typ);
procedure Pom(a, b: Pointer);
begin
PByte(a) := PByte(a) + PByte(b)^;
PByte(b) := PByte(a) - PByte(b)^;
PByte(a) := PByte(a) - PByte(b)^;
end;

var
i: Integer;
begin
for i := 0 to SizeOf(q)-1 do
Pom(Pointer(Integer(@Q)+i), Pointer(Integer(@w)+i));
end;

Działa na KAŻDY typ. Także dynamiczny (tam wystarczy zamienić wskaźniki).

0

WOW
Dryo - to faktycznie działa dla każdego rodzaju zmiennych.
Wielkie dzięki i pozdrowka dla tych co nie wierzyli... ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1