Troca de Valores Entre Variáveis

Delphi

22/02/2004

Olá pessoal, preciso desenvolver um algoritmo de troca de valores entre duas variaveis, ex.:
A = 1
B = 2
mudar para
A = 2
B = 1
.............
Seria simples se eu pudesse usar uma terceira variavel ou entao um operador XOR, mas eu nao posso.
Então preciso trocar os valores sem auxilio dos itens acima. Diz meu professor que resolve-se matematicamente. Alguem ai poderia me ajudar?
Abraços


Lucianobarreto

Lucianobarreto

Curtidas 0

Respostas

Jasig Aurumalfa

Jasig Aurumalfa

22/02/2004

Faça o seguinte esquema:
A:=A+1
e
B:=B-1
Espero ter ajudado...


GOSTEI 0
Ildefonso

Ildefonso

22/02/2004

Olá, Luciano...

Logicamente, a resposta do Jasig não vai servir se os números forem:[list:088a855f56]A = 5
B = 3[/list:u:088a855f56]
Mas o problema é: você já tentou resolver quanto?
Pareço até o cara das Casas Bahia (pena que não ganho o que ele ganha).

Eu já desenvolvi o ´pobrema´ e uma ´soluçation´. Gostaria de ver o que você já imaginou, para saber se, como professor, também, devo lhe ajudar em uma tarefa tão básica ou devo deixá-lo suar mais um tempo.

Está valendo nota? Quanto?

:wink:


GOSTEI 0
Marco Salles

Marco Salles

22/02/2004

Olá pessoal, preciso desenvolver um algoritmo de troca de valores entre duas variaveis, ex.: A = 1 B = 2 mudar para A = 2 B = 1 ............. Seria simples se eu pudesse usar uma terceira variavel ou entao um operador XOR, mas eu nao posso. Então preciso trocar os valores sem auxilio dos itens acima. Diz meu professor que resolve-se matematicamente. Alguem ai poderia me ajudar? Abraços


Faça Um Alguritimo Com as Quatro Instruções Abaixo Seguidas
1) A=A+B====Novo Valor De A=3
2) B=B+A====Novo Valor De B=5
3) A=B- A====Novo Valor De A=2
4) B=B-2*A===Novo Valor De B=1 



GOSTEI 0
Ildefonso

Ildefonso

22/02/2004

Ôôôô, Marco...
Não era para entregar tão fácil a tarefa do Luciano.

Gostei da sua solução. Eu havia imaginado uma com três operações e não quatro. Mas usando operadores de multiplicação e divisão. Acho que a sua deve ser mais rápida para o processador, em casos de muitas repetições.

Muito bom. 8)


GOSTEI 0
Marco Salles

Marco Salles

22/02/2004

Faça Um Alguritimo Com as Tres Instruções Abaixo Seguidas 
1) A=A*B====Novo Valor De A=2 
2) B=B/A====Novo Valor De B=1 
3) A=A/B====Novo Valor De A=2


Obs:Algoritimo Vale Somente Se A E B <> ZERO


GOSTEI 0
Marco Salles

Marco Salles

22/02/2004

Correção : Algoritmo Vale Do Jeito Que Foi Postado , Somente Se A OU B
Forem <> Zero


GOSTEI 0
Beppe

Beppe

22/02/2004

[quote:296661acea=´Marco Salles´]Correção : Algoritmo Vale Do Jeito Que Foi Postado , Somente Se A OU B
Forem <> Zero[/quote:296661acea]
E Addr(A) <> Addr(B).

Com uma instrução a menos:
X := X + Y;
Y := X - Y;
X := X - Y;


Parecem haver várias soluções para o problema, mas a única correta é introduzindo uma variável auxiliar. Devido ao [i:296661acea]aliasing[/i:296661acea], outras soluções não funcionam. Explico melhor:

A := A xor B;
B := A xor B;
A := A xor B;


O código acima não funciona quando A e B referem ao mesmo local na memória. Isto se chama aliasing, introduzido através da diretiva [b:296661acea]absolute[/b:296661acea], ponteiros, e call-by-reference em parâmetros de funcões.

Se quisermos uma função pra uso geral, poderiamos ter isso:

procedure TrocaInt(var X, Y: Integer);
begin
  X := X xor Y;
  Y := X xor Y;
  X := X xor Y;
end;


Que não funciona quando chamamos assim TrocaInt(A, A);, o que lea faz é zerar as variáveis.

A única alternativa que funciona sob todas as circustâncias seria:

procedure TrocaInt(var X, Y: Tipo);
var
  T: Tipo;
begin
  T := X;
  X := Y;
  Y := T;
end;


Só mais um detalhe: acredito que a semântica da passagem de parâmetro [b:296661acea]var[/b:296661acea] tenha mudado no Delphi 8, devido à natureza do CIL. Se estiver certo, as soluções usando aritmética funcionarão.


GOSTEI 0
Marco Salles

Marco Salles

22/02/2004

Beep, Acertei Seu Nome :P ...O Nosso Amigo LucianoBarreto Nos Postou O Seguinte:
Seria simples se eu pudesse usar uma terceira variavel ou entao um operador XOR, mas eu nao posso.


Voce Não Deve Ter Observado Este Detalhe :P

No Mais Tudo Acaba Em Samba....


GOSTEI 0
Beppe

Beppe

22/02/2004

Estava atento a isso sim, o que quiz era esclarecer o problema em usar aritmética.

PS: Você só acertou meu nome 80¬ :mrgreen:


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

22/02/2004

[quote:6a7a532e16=´Marco Salles´]
Faça Um Alguritimo Com as Tres Instruções Abaixo Seguidas 
1) A=A*B====Novo Valor De A=2 
2) B=B/A====Novo Valor De B=1 
3) A=A/B====Novo Valor De A=2


Obs:Algoritimo Vale Somente Se A E B <> ZERO[/quote:6a7a532e16]

Este aqui não funciona, independente de ter valor zero (já que não podemos dividir por zero).


GOSTEI 0
Marco Salles

Marco Salles

22/02/2004

Eu Sei Que Este Último Algoritimo Tem Limitaçõe e Não Deve Ser Apresentado Pelo Luciano Ao Seu Professor ..Só Quis Responder a Uma Citação Do Nosso Amigo Ildefonso:
Ôôôô, Marco... Não era para entregar tão fácil a tarefa do Luciano. Gostei da sua solução. Eu havia imaginado uma com três operações e não quatro. Mas [color=red:811cfbf4cf]usando operadores de multiplicação e divisão[/color:811cfbf4cf]. Acho que a sua deve ser mais rápida para o processador, em casos de muitas repetições.


O Algoritimo Que o LucianoBarreto Deve Apresentar Para o Seu Professor é O Código Anteriormente Apresentado, Segue Abaixo:
Faça Um Alguritimo Com as Quatro Instruções Abaixo Seguidas 
1) A=A+B====Novo Valor De A=3 
2) B=B+A====Novo Valor De B=5 
3) A=B- A====Novo Valor De A=2 
4) B=B-2*A===Novo Valor De B=1 


Isto é , Se Amanhã Ao Acordar e Ver Tantas Respostas No Seu Tópico e Tiver Desanimo De Le-las...
O Que Nós Devemos Entender é Que Muitas Das Vezez Quando Somos Solicitados Para Resolver Um Problema De Lógica, O Solicitante Quer a Resposta Lógica Do Problema e Não Se o Delphi Tem Ou Não Um Componente Ou Uma Classe, Ou Um Objeto Que Resolva a Questão Com Uma Só Instrução...Isto Serve Para Programação ,Mas Para Dever De Lógica Serve Não....Mas o Papo Tá Virando Carnaval :P


GOSTEI 0
Lucianobarreto

Lucianobarreto

22/02/2004

Olá Pessoal. Primeiramente agradeço a todos pela resposta tão rápida. Agora vou a alguma citações. Eu ainda nao testei mas agradeço desde já...
Ildefonso ==> Eu tinha testado tudo isso que voce me passou, lógico, faltou a última parte entao nao deu certo...
Marco Salles ==> Obrigado pela resposta, mas poderá entrar sim o numero zero e tambem os negativos.. mesmo assim agradeço.. E como você disse, nao estou englobando qualquer linguagem, preciso mesmo do algoritmo...
Obrigado pessoal, mas se tiverem outras formas gostarei de recebelas.. abraços


GOSTEI 0
Lucianobarreto

Lucianobarreto

22/02/2004

Olá Pessoal. Primeiramente agradeço a todos pela resposta tão rápida. Agora vou a alguma citações. Eu ainda nao testei mas agradeço desde já... Ildefonso ==> Eu tinha testado tudo isso que voce me passou, lógico, faltou a última parte entao nao deu certo... Marco Salles ==> Obrigado pela resposta, mas poderá entrar sim o numero zero e tambem os negativos.. mesmo assim agradeço.. E como você disse, nao estou englobando qualquer linguagem, preciso mesmo do algoritmo... Obrigado pessoal, mas se tiverem outras formas gostarei de recebelas.. abraços

Falha Técnica ==> Eu fiz confusão com os nomes ae.. foi mal...


GOSTEI 0
Marco Salles

Marco Salles

22/02/2004

Xiiii, Nun To Ententendo eh Nade :?:
No Algoritimo Abaixo Tem Algum Erro :?: Ele Não Vale Para o Zero :?:
Não Vale Para Os Numeros Negativo :?:

Exempo: A=1;B=-3
Faça Um Alguritimo Com as Quatro Instruções Abaixo Seguidas 
1) A=A+B====Novo Valor De A=-2 
2) B=B+A====Novo Valor De B=-5 
3) A=B- A====Novo Valor De A=-3 
4) B=B-2*A===Novo Valor De B=1


Marco Salles ==> Obrigado pela resposta, mas poderá entrar sim o numero zero e tambem os negativos..


Luciano, Eu Não Disse Em Momento Nenhum Que o Numero Zero Não Poderia Entrar....Eu Disse Simplesmente, Que No Algoritimo Onde Se Faz Com Multiplicação e Divisão o Zero Deveria Ser Excluido, Sendo O Algoritmo Portanto Limitado...Qualquer Comentário , Esteja á Vontade Para Colocar o Bloco Na Rua
:P


GOSTEI 0
Lucianobarreto

Lucianobarreto

22/02/2004

[quote:27a08f6abe=´Marco Salles´]Xiiii, Nun To Ententendo eh Nade :?:
No Algoritimo Abaixo Tem Algum Erro :?: Ele Não Vale Para o Zero :?:
Não Vale Para Os Numeros Negativo :?:

Exempo: A=1;B=-3
Faça Um Alguritimo Com as Quatro Instruções Abaixo Seguidas 
1) A=A+B====Novo Valor De A=-2 
2) B=B+A====Novo Valor De B=-5 
3) A=B- A====Novo Valor De A=-3 
4) B=B-2*A===Novo Valor De B=1


Marco Salles ==> Obrigado pela resposta, mas poderá entrar sim o numero zero e tambem os negativos..


Luciano, Eu Não Disse Em Momento Nenhum Que o Numero Zero Não Poderia Entrar....Eu Disse Simplesmente, Que No Algoritimo Onde Se Faz Com Multiplicação e Divisão o Zero Deveria Ser Excluido, Sendo O Algoritmo Portanto Limitado...Qualquer Comentário , Esteja á Vontade Para Colocar o Bloco Na Rua
:P[/quote:27a08f6abe]
Não Marcos, o seu está correto, fui eu quem trocou os nome na citação... Desculpe a falha... E funciona corretamente com qualquer numero sim.. obrigado


GOSTEI 0
Lucianobarreto

Lucianobarreto

22/02/2004

Vou me intrometer na ´conversa´... creio q a primeira forma dada pelo Beepe seja a mais simples: B = B + A; A = B - A; B = B - A; serve tb para números negativos. por exemplo: A = 1; B = -3: B = -3 + 1; = -2 A = -2 - 1; = -3 B = -2 - (-3); = 1 observando-se tudo aquilo q foi dito pelo Beepe.

Realmente essa forma é mais simples... obrigado, mas se tiverem outra formas eu agradeço tambem...


GOSTEI 0
Marco Salles

Marco Salles

22/02/2004

O Algoritimo Que o LucianoBarreto Deve Apresentar Para o Seu Professor é O Código Anteriormente Apresentado, Segue Abaixo: Código: Faça Um Alguritimo Com as Quatro Instruções Abaixo Seguidas 1) A=A+B====Novo Valor De A=3 2) B=B+A====Novo Valor De B=5 3) A=B- A====Novo Valor De A=2 4) B=B-2*A===Novo Valor De B=1


NÃO ...O Código Que o LucianoBarreto Deve Apresentar ao Seu Professor
e o Do Beep(Pois Tem Uma Instrução a Menos ....Eu Não Tinha Notado o Código, Pois Ele o Fez Com, X e Y E Eu Não Vi e Desviou o Assunto Para a Parte Estrutural Da Linguagem( O Que é Importante Diga-se De Passagem, Mas Para O Algoritmo DO Luciano Não Teria Importãncia, Por Se Tratar De APenas Um Problema De Lógica).....Qaunto a Citação Do Luciano :

obrigado, mas se tiverem outra formas eu agradeço tambem...


Eu Vou Fazer Algo Que Não Se Deve [color=red:0e638e1f0a]NUNCA [/color:0e638e1f0a]Fazer, é Duvidar Da Engenhosidade Humana....Mas Eu Não Acredito Em Outras Soluções, Para Este Problema,Devido Ao Fato Das Limitações Impostas(Não Vale Substituições, Não Vale Instrução Xor, Não Vale Multiplicação/Divisão)..A Não Ser Que Sejam Soluções Que Derivam Da Solução Enxuta Apresentada Pelo Beep....A Solução Apresentada Por Mim Por Exemplo,
Por Ela Conter a Primeira Instrução a Mais 1) A=A+B Ela Necessita De Uma Correção Devido Ao Fator 2 Na Instrução 4) B=B-2*A...Vou Chamar Esta Redudancia De Br(Br=Redutancia) Note Então a Analogia Da Minha Resposta Com a Do Bepp

1)A=A+B >>> A=A+Br ...Termo Redutante
2)B=A+B >>> B=(A+Br)+B >>> B=(A+B)+Br....
Note a Analogia com a Primeira Instrução Do Beep
3)A=B-A >>>A=(A+B)+Br-(A+Br) >>> A=A-A+B+Br-Br >>> A=B=Br
Aqui a Parcela Br(Redutante) Desaparece e A=B=Br
4)B=B-2*A >>>B=(B-A)-A >>>B=((A+B+Br)-B)-Br >>> B=A
Lembre-se Que Br=B 


É Como se a Gente Fosse Brincar De Pensa Um Número, Multiplica Por X , Divide Pelo Numero Que Voce Pensou , a Resposta é X....Então Meu Amigo, [color=red:0e638e1f0a]Espero Que Eu Esteja Errado[/color:0e638e1f0a], Mas Qualquer Outra Solução Que Possa Parecer Diferente, Mas Na Verdade Será Uma Cópia Irrustida Da Solução Do Bepp..

Ainda Bem Que Ninguem Pode Falar Que Eu Copie a Solução Do Bepp, A Minha Veio Na Frente :P


GOSTEI 0
Beppe

Beppe

22/02/2004

Minha última alternativa:
procedure TrocaInt(var X, Y: Integer);
var
  I: Integer;
begin
  for I := 0 to 31 do
  begin
    if X and (1 shl I) <> 0 then
      if Y and (1 shl I) <> 0 then
      else
      begin
        X := X and not (1 shl I);
        Y := Y or (1 shl I);
      end
    else
      if Y and (1 shl I) <> 0 then
      begin
        X := X or (1 shl I);
        Y := Y and not (1 shl I);
      end;
  end;
end;


Uma outra nota sobre usando adições: precisa compilar com overflow off.

Não ficou muito claro se o uso de XOR era um exemplo do que não se devia usar, ou era uma restrição. Pois para mim, adições, XOR, multiplicações, etc, é usar a matemática, embora para uma subrotina como esta usar uma temporária seria o ideal.


GOSTEI 0
Saas

Saas

22/02/2004

Olá pessoal, preciso desenvolver um algoritmo de troca de valores entre duas variaveis, ex.:
A = 1
B = 2
mudar para
A = 2
B = 1
.............
Seria simples se eu pudesse usar uma terceira variavel ou entao um operador XOR, mas eu nao posso.
Então preciso trocar os valores sem auxilio dos itens acima. Diz meu professor que resolve-se matematicamente. Alguem ai poderia me ajudar?
Abraços


provavelmente, seu professor busca algo diferente da ideia que eu vou dar aqui, mas uma forma simples de resolver isso e colocando o x+y-x, basicamente x se tornaria y de tal modo, mas creio que ele busca outra solucao
GOSTEI 0
Saas

Saas

22/02/2004

Olá pessoal, preciso desenvolver um algoritmo de troca de valores entre duas variaveis, ex.:
A = 1
B = 2
mudar para
A = 2
B = 1
.............
Seria simples se eu pudesse usar uma terceira variavel ou entao um operador XOR, mas eu nao posso.
Então preciso trocar os valores sem auxilio dos itens acima. Diz meu professor que resolve-se matematicamente. Alguem ai poderia me ajudar?
Abraços


fiz alguns testes, talvez uma forma seja adicionar uma terceira variavel a equacao, assim sendo

var
x: real
y:real
xy: real

inicio

escreva ("digite o x: " )
leia (x)
xy <- x
escreva ("digite o y: ")
leia (y)
x <- y
y <- xy

fimalgoritimo
GOSTEI 0
POSTAR