Ir ao conteúdo
  • Cadastre-se

C Trocar valores através de função


jbiribi

Posts recomendados

Tenho um exercício de C que pede para trocar os valores inseridos em duas variáveis através de uma função, mas os valores mostrados no final estão saindo errados. O programa que escrevi ficou assim:

#include <stdio.h>
float troca (float a, float b){
    float aux;   
    aux = a;
    a = b;
    return b = aux;
}

int main() {    
    float x, y;
    printf("Insira um valor para X: ");
    scanf("%f", &x);
    printf("Insira um valor para Y: ");
    scanf("%f", &y);
    printf("X é igual a %f e Y é igual a %f", troca(x,y));
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@jbiribi    o return só pode retornar um resultado .   você pode usar uma variável global ( aquela que fica lá no início antes da main )  para retornar o outro número .  então seu código ficaria assim: :

#include <stdio.h>
#include <locale.h>
float c;
float troca (float a, float b){
    float aux;
    aux = a;
    a = b;
    b=aux;
    c = b;
    return a;
}

int main() {
    setlocale(LC_ALL,"");
    float x, y;
    printf("Insira um valor para X: ");
    scanf("%f", &x);
    printf("Insira um valor para Y: ");
    scanf("%f", &y);
    printf("\nX é igual a %.2f e Y é igual a %.2f\n\n", troca(x,y),c);
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá a todos.

 

17 horas atrás, devair1010 disse:

o return só pode retornar um resultado .   você pode usar uma variável global ( aquela que fica lá no início antes da main )  para retornar o outro número .  então seu código ficaria assim: :

@devair1010, creio que na verdade o que está errado é a lógica... a função deveria servir para "trocar os valores" e não "retornar algo", ou seja, essa função poderia ser void. A "confirmação" da troca pode ser feita ao mudar de "passagem de parâmetro por valor" para "passagem de parâmetro por referência"...

 

Citação

Na linguagem C a passagem por referência é implementada com o uso de ponteiros.

Fonte: http://linguagemc.com.br/funcao-com-passagem-por-referencia/

ou seja, seguindo a sugestão de @Chrissy Costanza.

 

 

Sobre o processo de troca:

3 horas atrás, Chrissy Costanza disse:

E para trocar valores de duas variáveis não precisa de variável auxiliar, use o operador BIT a BIT XOR.

Creio eu que, apesar de valer a experiência, seja um tema mais avançado e de entendimento pouco trivial... (algo como entrar em arquitetura de computadores ou estudo de números binários...) sugeriria utilizar um auxiliar mesmo! É um processo mais convencional.

 

obs.: a não ser que a troca não funcione com ponteiro....

 

 

No aguardo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

PS:

 

Aproveitando.. Testei aqui e funcionou com ponteiros:

 

A assinatura da função do procedimento pode ficar assim:

void troca(float *a, float *b) {

}

int main() {

}

Repare que essa "função" não precisa retornar nada... logo fica void.

 

@jbiribi, tente implementar essa função... Daí você tem que chamar o método troca() fora do printf() (já que não é mais uma função, ou seja, "não retorna um valor nele mesmo") e mandar imprimir o x e y, que após serem trocados, estarão com seus valores invertidos entre si.

 

OU

 

Poderia declarar a função para retornar uma string, contendo os valores invertidos... correto?

NÃO, não pode! O enunciado é claro:

19 horas atrás, jbiribi disse:

[...] trocar os valores inseridos em duas variáveis através de uma função[...]

ou seja, os valores em si que tem que ser trocados. Não é uma questão de apenas "exibir trocado"... se fosse assim, bastaria fazer algo assim:

 

printf("X é igual a %f e Y é igual a %f", y,x); //inverti a ordem das variávies :)

Entende? para o usuário o resultado seria correto (iria aparecer invertido), mas para a lógica do algoritmo não... não é só o resultado que importa, mas também como chegou a ele...

 

 


Uma outra forma, tomando como base a sugestão de @devair1010, poderia ser assim:

float x, y;
void troca() {

}

int main() {

}

Declarando as duas variáveis como globais... mas como já citado, é melhor passar por parâmetro... dessa forma também dá a sensação de "reutilização", ou seja, essa mesma função pode servir para qualquer outras variáveis do tipo float... não só para x e y. Se tive por exemplo no mesmo código um a e b, w e z, salarioA e salarioB etc, ou seja, qualquer pares de float, poderia utilizar a mesma função... já se usar sem parâmetro, só vai servir para o x e y (ou que você usou no procedimento).

 

 

No aguardo

 

 

Link para o comentário
Compartilhar em outros sites

Muito obrigado pela ajuda! Utilizando as dicas de vocês fiz assim:

 

#include <stdio.h>
void troca (float *a, float *b){   
    float aux;    
    aux = *a;
    *a = *b;
    *b = aux;
}

int main() {
    float x, y;
  
    printf("Insira um valor para X: ");
    scanf("%f", &x);
    printf("Insira um valor para Y: ");
    scanf("%f", &y);
    
    troca(&x,&y);
    
    printf("X é igual a %.2f e Y é igual a %.2f", x, y);
    
    return 0;
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...