Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
jbiribi

C Trocar valores através de função

Recommended Posts

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;
}

 

Editado por Simon Viegas
Troca tag de citação para CODE
  • Curtir 1

Compartilhar este post


Link para o post
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;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Exemplo:

int a = 5, b = 3;
a = a^b;
b = b^a;
a = a^b;

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Editado por Simon Viegas
update
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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;
    }

     

    Editado por Simon Viegas
    Troca tag de citação para CODE
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×