Troca de Valores Entre Variáveis
22/02/2004
0
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
Posts
22/02/2004
Jasig Aurumalfa
A:=A+1
e
B:=B-1
Espero ter ajudado...
22/02/2004
Ildefonso
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:
22/02/2004
Marco Salles
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
22/02/2004
Ildefonso
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)
22/02/2004
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
22/02/2004
Marco Salles
Forem <> Zero
22/02/2004
Beppe
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.
22/02/2004
Marco Salles
Voce Não Deve Ter Observado Este Detalhe :P
No Mais Tudo Acaba Em Samba....
22/02/2004
Beppe
PS: Você só acertou meu nome 80¬ :mrgreen:
22/02/2004
Aroldo Zanela
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).
22/02/2004
Marco Salles
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
22/02/2004
Lucianobarreto
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
22/02/2004
Lucianobarreto
Falha Técnica ==> Eu fiz confusão com os nomes ae.. foi mal...
23/02/2004
Marco Salles
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
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
24/02/2004
Lucianobarreto
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
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
Clique aqui para fazer login e interagir na Comunidade :)