Ir ao conteúdo

Posts recomendados

Postado

Oi gente! Você poderiam me ajudar em um exercício. 

 

Faça uma função que receba os endereços de memória de três números inteiros X, Y e Z e troque os seus valores de forma que, ao retornar, o valor em X seja o menor, o valor em Y seja o intermediário e o valor em Z seja o maior dos três. Faça também uma função main para testar a sua função.

 

A função não esta funcionando o que tem de errado? 

 

#include<stdio.h>

int troca (int *X, int *Y, int *Z){
    int *maior, *menor;

    if(*X > *Y){
    	*maior = *X;
    }else{
        *maior = *Y;
    }
    if(*Z > *maior){
        *maior = *Z;
    }

    if(*X < *Y){
    	*menor = *X;
    }
    else{
         *menor = *Y;
    }
    if(*Z < *menor){
        *menor = *Z;

    }
    printf("Resultado: x=%d y=%d z=%d", *X, *Y, *Z);
    return(0);

}


main ( )
{
    int X,Y,Z;
    printf("Entre com três números:");
    scanf("%d %d %d", &X, &Y, &Z);
    printf("Você entrou com os seguintes numeros: x=%d, y=%d, z=%d\n",X,Y,Z);
    troca(X,Y,Z);
}

 

  • Curtir 2
Postado

@Rayane Parreira Resende quando você coloca um ponteiro como parâmetro de uma função, você deve enviar o endereço na chamada de função o certo seria troca (&x, &y, &z), outra coisa errada é na sua função troca(), na declaração das variáveis *menor e *maior, elas não devem ser ponteiros, pois não estão recebendo ponteiros.

 

O certo seria ao chamar a função:

troca(&X, &Y, &Z);

ao declarar as variáveis:

int menor, maior;

 

Lembre-se, ponteiros sempre recebem apenas endereços de memória, eles simplesmente apontam para variáveis dentro da memória, não é possível atribuir um valor à um ponteiro, apenas endereços

adicionado 1 minuto depois

Outra coisa que esqueci de falar, você não está atribuindo valor algum a X, Y e Z na função troca, então eles terão o mesmo valor no final, você deve fazer a atribuição depois: a variável menor vai conter o menor valor das 3 variáveis, então você faz *X = menor, antes de imprimir e o mesmo para as outras

  • Curtir 1
Postado
#include<stdio.h>

int troca (int *x, int *y, int *z){

int a=*x,b=*y,c=*z;
if (a > b) 
    if (b > c)*z=a, *y=b, *x=c;
    else 
      if (a > c)*z=a,*y=c,*x=b;
      else *z=c, *y=a, *x=b;
  else 
    if (b > c)
      if (a > c)*z=b,  *y=a , *x=c;
      else  *z=b, *y=c, *x=a;
  else *z=c, *y=b, *x=a;
  return *x,*y,*z;
  

}


main ( )
{
	int x,y,z;
    printf("Entre com tres numeros:");
    scanf("%d %d %d", &x, &y, &z);
    troca(&x,&y,&z);
    
    printf("%d %d %d",x,y,z);
}

 

  • Curtir 2
Postado

@herbertbahia Não se pode retornar mais de um valor, isso não é válido

20 minutos atrás, herbertbahia disse:

return *x,*y,*z;

 

Como estamos trabalhando com ponteiros, a função está trabalhando com referência então ela está alterando diretamente no endereço de memória da variável, por essa razão nem precisamos retornar nenhum valor para a main, por isso dá certo, mas se você reparar vai ver que o que vai ser retornado desse seu return vai ser o valor que está em *Z, pois foi o último e ele só pode retornar um

adicionado 12 minutos depois

Caso não tenha ficado muito claro:

#include<stdio.h>

void troca (int *X, int *Y, int *Z){
    // ja atribui X como sendo o menor e Z como sendo o maior
    int maior = *Z, menor = *X, intermediario = *Y;

    // verifica o menor de todos
    if (*Z < *X && *Z < *Y) menor = *Z;
    if (*Y < *X && *Y < *Z) menor = *Y;
    
    // verifica o maior de todos
    if (*X > *Z && *X > *Y) maior = *X;
    if (*Y > *Z && *Y > *X) maior = *Y;
    
    // verifica o que está no meio
    if (*X > *Y && *X < *Z || *X < *Y && *X > *Z) intermediario = *X;
    if (*Z > *Y && *Z < *X || *Z < *Y && *Z > *X) intermediario = *Z;

    *X = menor; *Z = maior; *Y = intermediario;
}

main (){
    int X,Y,Z;
    
    printf("Entre com três números:");
    scanf("%d %d %d", &X, &Y, &Z);
    
    printf("Você entrou com os seguintes numeros: x=%d, y=%d, z=%d\n",X,Y,Z);
    troca(&X,&Y,&Z);
    
    printf("Resultado: x=%d y=%d z=%d", X, Y, Z);
    
    return 0;
}

 

  • Curtir 3
Postado

Desse jeito funciona, mas só se os três valores forem diferentes entre si:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

void troca(int *x, int *y, int *z);

int main() {
    int x = 9;
    int y = 0;
    int z = 8;

    printf("X = %i \t\t Y = %i \t\t Z = %i \n", x, y, z);
    troca(&x, &y, &z);
    printf("X = %i \t\t Y = %i \t\t Z = %i \n", x, y, z);

    return EXIT_SUCCESS;
}

void troca(int *x, int *y, int *z) {
    int maior = INT_MIN;
    int menor = INT_MAX;
    int meio = INT_MAX;

    if (*x > maior) maior = *x;
    if (*y > maior) maior = *y;
    if (*z > maior) maior = *z;

    if (*x < menor) menor = *x;
    if (*y < menor) menor = *y;
    if (*z < menor) menor = *z;

    if (*x != maior && *x != menor) meio = *x;
    else if (*y != maior && *y != menor) meio = *y;
    else meio = *z;

    *x = menor;
    *y = meio;
    *z = maior;
}

 

  • Curtir 2

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!