Função

Elabore uma função que apresente uma mensagem na tela, leia um inteiro do teclado e o retorne somente se este valor for positivo.

int mostrarResultado(int);

int mostrarResultado(int n){
	
	if(n>0){
		
		return n;
	
	}
}

main(){
	
	int n, n1;
	
	printf("Numero: ");
	scanf("%d", &n);
	
	n1 = mostrarResultado(n);
	
	printf("Numero: %d\n", n1);
}

Porque a função retorna o número mesmo quando negativo?

E ae. Não to entendendo nada do código kk, mas acho que é aqui:

n1 = mostrarResultado(n);

Como você só retorna valor se ‘n1’ for maior que zero, ele não vai retornar nada. Logo ‘n1’ vai continuar com o valor de antes.

Não seria algo assim?

if(n1 > 0) {
    printf("Número: %d\n", n1);
}

Qualquer coisa posta o código inteiro, que ae fica melhor. Boa sorte.

1 curtida

Porque por padrão o valor de n1 é zero então ele retorna um valor mesmo não satisfazendo a condição de ser maior do que 0.

Esse código está estranho, porque falta um return na função caso na satisfaça !!! e o contexto estranho, poderia explicar melhor?

1 curtida

A sua explicação não faz sentido … o problema são vários mas, nenhum relatado pela sua resposta

1 curtida

Se quer que a função apenas mostre o valor, declare a função como void (função sem retorno) e substitua o return n; por printf("%d", n);.

Se o número for negativo, ele retorna zero e não o negativo.
Porquê?
Porque como você definiu a função mostrarResultado() como inteiro, ele vai retornar um inteiro. Quando o valor que você passar (no caso, n) não satisfaz a condição ele assume isso como zero.
Eu não manjo muito de C, mas lendo sobre a tua questão encontrei o seguinte:

Se um objeto que tem duração de armazenamento automático não é inicializado explicitamente, seu valor é indeterminado. Se um objeto que tem duração de armazenamento estático não é inicializado explicitamente, então:

  • se ele tem tipo de ponteiro, ele é inicializado para um ponteiro nulo;
  • se tem tipo aritmético, é inicializado para (positivo ou não) zero;
  • se for um agregado, cada membro é inicializado (recursivamente) de acordo com estas regras;
  • se for uma união, o primeiro membro nomeado é inicializado (recursivamente) de acordo com estas regras.

“Ah! Mas o que são variáveis estáticas?”

Vai aqui um link legal pra você explicando um pouco sobre isso.
http://mtm.ufsc.br/~azeredo/cursoC/aulas/ca20.html#cA23

E o que foi citado acima sobre assumir um valor 0 está aqui:

Está em inglês, mas nada que um tradutor não possa ajudar.

2 curtidas

Cara, não entendi mt bem seu código, mas acredito que queria fazer isso:

int mostrarResultado(int x){

if(x>=0){
printf("Numero:%d \n", x);
}
else{
	printf("Esse numero nao eh valido");
}
}

main(){

int n1;

printf("Numero: \n");
scanf("%d", &n1);

return mostrarResultado(n1);

}
1 curtida

Sim, isso mesmo Marcio. Entretanto, acho que o objetivo dele não é nem a complexidade do código em si, e sim, brincar com a chamada de métodos.

O código que ele apresentou pode não ser a melhor das opções, mas está certo.

#include <stdio.h>

int mostrarResultado(int);

int mostrarResultado(int n){

    if(n>0){

    	return n;

	} 
}

main(){

    int n, n1;

    printf("Numero: ");
    scanf("%d", &n);

    n1 = mostrarResultado(n);

    printf("Numero: %d\n", n1);
}

O problema, provavelmente está aqui:

n1 = mostrarResultado(n);

Uma vez que ele define a variável “n1” como o retorno de “mostrarResultado(n)” independente do que ele retornar — positivo ou negativo. “n” e “n1” não são, como diria no Java, variáveis de instância, logo, os valores de inicialização delas são “aleatórios”, ae quando vai para “mostrarResultado(int n)”, no if a condição não é verdadeira e como não tem outro retorno, que não implica em erro fatal, o programa atribui a “n1” o valor do que foi passado como argumento. Algo do tipo — não tem nada aqui para eu fazer com isso, então toma ele de volta. Logo, o valor é atribuído a “n1” independente de ser positivo ou negativo. Você poderia definir o que você quer que retorne caso ele seja negativo. Tipo:

int mostrarResultado(int);

int mostrarResultado(int n){

    if(n>0){

    	return n;

	} else{

        return 0;

}

Nesse caso, quando o número informado fosse negativo, seria exibido 0. Se você quer que seja exibido somente se for positivo, o condicional tem que estar com o printf, porque como ele está fora, ele vai ser executado independente de nada, ae você só pode alterar o que vai ser exibido, e não se vai ou não exibir. Espero ter ajudado.

1 curtida

Complementando… O Fernando Mercês do mentebinária tá lançando um curso de C. Todo sábado ele lança uma aula nova Os vídeos tem duração de 20 - 35 minutos. A forma de ele explicar não é chata e pra mim a didática dele é boa.

2 curtidas

Obrigado a todos pelas respostas. Acho que o maior erro, foi do enunciado do exercício que tentei solucionar.O enunciado diz que eu tenho que retornar o valor, somente se ele for positivo, logo, fiquei em duvida, como não retornar nada, caso o valor seja negativo, mas, através das respostas aqui, entendi que a função devera obrigatoriamente retornar algum valor quando a função é do tipo int, mesmo que o valor não caia dentro do if.