Ir ao conteúdo
  • Cadastre-se

C código de par/impar com função


CaioFagundes22
Ir à solução Resolvido por Felipecfk,

Posts recomendados

12 horas atrás, CaioFagundes22 disse:
int b;
scanf("%d",b);

 

scanf() não aloca memória. "%d" indica que vai ler um inteiro então precisa passar o endereço de uma área de memória que exista. Esse é o endereço que a função vai usar para gravar o resultado.

 

Você não passou um endereço. Passou o valor de um int.

 

Use o operador & --- address of --- para extrair o endereço nesse caso.

 

E teste SEMPRE o retorno de scanf(), em especial quando for ler números. Você tem um livro? Seu IDE mostra ao menos os protótipos?

 

12 horas atrás, CaioFagundes22 disse:
x=funcao(b);

 

Esse é o outro erro. funcao() foi declarada como void então não há valor de retorno. Está atribuindo o valor a um int então deveria ter declarado funcao() como retornand int.

 

EXEMPLO

 

Rode isso em sua máquina. É a maneira recomendada de escrever essas coisas. Note que ao final o exemplo usa o valor de retorno e o fato de que em C só o valor 0 é falso.

 

#include <stdio.h>

int n_par(int);

int main(void)
{
    int res = 0;
    int b;
    printf("Entre com um numero inteiro:  ");
    res = scanf("%d",&b);
    if ( res != 1) return -1; // não leu
    
    res=n_par(b);

    // usando o resultado da funcao
    if(res)
    {
        printf("%d: par\n", b);
        return 1;
    }
    printf("%d: impar\n", b);
    return 0;
}

int n_par(int numero)
{
    if(numero%2==0)
    {
        printf("%d: par\n", numero);
        return 1;
    }
    printf("%d: impar\n", numero);
    return 0;
}

 

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

  • Solução
2 horas atrás, CaioFagundes22 disse:

@Matheus Maldi  só que com o meu código. Quero identificar o erro 

 

1º erro: você se esqueceu de por o & do antes da variável b, por isso ele não está lendo:

scanf("%d",b);

o certo é: &b

 

2º erro: você criou uma variável x para armazenar a função e imprimir um valor, sendo que a própria função já imprime o que tem que imprimir, basta chamá-la

printf("%d", x);

deveria ser: funcao(b);

 

Já testei aqui com as correções, está funcionando normal. Mas dá pra aprimorar, porém sendo que é um exercício básico e você está aprendendo, acho que por enquanto não há necessidade.

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

Em 23/11/2021 às 10:13, Felipecfk disse:

2º erro: você criou uma variável x para armazenar a função e imprimir um valor, sendo que a própria função já imprime o que tem que imprimir, basta chamá-la

printf("%d", x);

deveria ser: funcao(b);

 

Não, esse não é o erro. Como eu expliquei, a função foi declarada como void funcao(int) 

 

Em 22/11/2021 às 20:48, CaioFagundes22 disse:
void funcao(int numero)

 

Então é mesmo um erro escrever

 

Em 22/11/2021 às 20:48, CaioFagundes22 disse:
x=funcao(b);

 

E o programa sequer vai compilar.

 

PS C:\src\C\dvr> gcc -o or or22.c
or22.c: In function 'main':
or22.c:17:2: error: void value not ignored as it ought to be
   17 | x=funcao(b);
      |  ^
PS C:\src\C\dvr> 

 

Em 23/11/2021 às 10:13, Felipecfk disse:

2º erro: você criou uma variável x para armazenar a função e imprimir um valor, sendo que a própria função já imprime o que tem que imprimir, basta chamá-la

 

Isso poderia até ser um erro de lógica, mas pode ser uma requisição do enunciado ou um teste do usuário.

E se fosse para "corrigir" o recomendado é tirar o printf() da função. 

 

Porque? Porque não se deve misturar a saída com a lógica. Uma função que retorna 0 se um número é par é muito mais útil se não imprimir toda vez algo na tela. Assim por  exemplo se tem um loop que precisa imprimir todos os pares múltiplos de 7 e salvar todos os pares múltiplos de 60 em um arquivo poderia continuar usando a MESMA função e para isso elas são escritas, para serem úteis ao máximo

 

5 horas atrás, CaioFagundes22 disse:

agora sim!! muito obrigado.

 

Nem tanto. Sugiro ler o que te expliquei uma hora antes dessa resposta. Lá tem a explicação dos erros e um programa exemplo completo.

 

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

5 horas atrás, arfneto disse:

 

Não, esse não é o erro. Como eu expliquei, a função foi declarada como void funcao(int) 

 

Entendi, colocando como int você pode retornar o valor do parâmetro que foi usado. Mas entendi que estava errada a forma que ele fez porque tentou retornar a variável que recebia a função em si nesse código abaixo:
 

x=funcao(b);
printf("%d", x);

Nesse caso, mesmo trocando o retorno da função pra int ele não funciona direito (teria que usar ponteiros talvez?). O seu funcionou porque estava retornando o valor em si e não a função toda:

 

printf("%d: par\n", b);

printf("%d: impar\n", b);

 

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, Felipecfk disse:

Nesse caso, mesmo trocando o retorno da função pra int ele não funciona direito (teria que usar ponteiros talvez?). O seu funcionou porque estava retornando o valor em si e não a função toda

 

Não sei se entendi o que quer dizer.

 

Não precisa usar ponteiros. A função retorna um valor então pode escrever mesmo

 

    printf( "retorno: %d\n", funcao(b) );

 

7 minutos atrás, Felipecfk disse:

Mas entendi que estava errada a forma que ele fez porque tentou retornar a variável que recebia a função em si nesse código abaixo

 

Sim, estava errado e sequer compilaria. Eu mostrei a saída do compilador

 

5 horas atrás, arfneto disse:
PS C:\src\C\dvr> gcc -o or or22.c
or22.c: In function 'main':
or22.c:17:2: error: void value not ignored as it ought to be
   17 | x=funcao(b);
      |  ^
PS C:\src\C\dvr> 

 

 

Link para o comentário
Compartilhar em outros sites

5 horas atrás, arfneto disse:

 

Isso poderia até ser um erro de lógica, mas pode ser uma requisição do enunciado ou um teste do usuário.

E se fosse para "corrigir" o recomendado é tirar o printf() da função. 

 

Eu tentei um programa um pouco diferente do dele pra testar se eu conseguia dar print no resultado da função. Mas por algum motivo dá errado, o que acontece é que talvez ele não esteja executando a função quando eu faço isso:
 

x = somar(num);


Código completo:

#include <stdio.h>

int somar(int n) {
    n += 4;
    return n;
}

int main()
{
    int num;
    int x;
    
    printf("Digite o numero: ");
    scanf("%d", &num);
    
    x = somar(num);
    
    printf("Resultado: %d", num);
    
    return 0;
}


Ele simplesmente imprime o resultado que eu digitei, sem entrar na função e retornar algo diferente porém não chega a dar nenhum erro ou aviso. Qual seria uma solução nesse caso para conseguir imprimir o resultado correto?

Reparei que você chegou a atribuir a função a uma variável 'res' mas ela só é usada para confirmar uma condição verdadeira no if:

res=n_par(b);

if(res)...

 

 

Citação

Nem tanto. Sugiro ler o que te expliquei uma hora antes dessa resposta. Lá tem a explicação dos erros e um programa exemplo completo.

Quanto a isso, eu tentei ajudar no exercício tirando o 'x'. Não sei exatamente o que pede o enunciado já que ele só postou o código e pediu pra verificar onde estava o erro. As respostas aqui muitas vezes são teóricas demais e afugentam alguns iniciantes por isso optei por ir direto ao ponto sem implicar muito com conceitos ou a forma adequada de resolver digamos "profissionalmente". 

 

 

Link para o comentário
Compartilhar em outros sites

4 horas atrás, Felipecfk disse:

Ele simplesmente imprime o resultado que eu digitei, sem entrar na função e retornar algo diferente porém não chega a dar nenhum erro ou aviso. Qual seria uma solução nesse caso para conseguir imprimir o resultado correto?

 

Então...

 

    printf("Digite o numero: ");
    scanf("%d", &num);
    
    x = somar(num);
    
    printf("Resultado: %d", num);

 

Você está somando em x, mas mostra num....🤔

 

4 horas atrás, Felipecfk disse:

As respostas aqui muitas vezes são teóricas demais e afugentam alguns iniciantes por isso optei por ir direto ao ponto sem implicar muito com conceitos ou a forma adequada de resolver digamos "profissionalmente"

 

 

Entenda: são dois erros importantes. Pular um erro não é "ir direto ao ponto". O que está errado em sua resposta é que você ignorou o fato de o programa sequer compilar porque o autor está tentando usar o valor de retorno de uma função que ele declarou como void.

 

E você citou o erro como corrigido mas não mostrou a solução:

 

Em 23/11/2021 às 10:13, Felipecfk disse:

á testei aqui com as correções, está funcionando normal. Mas dá pra aprimorar, porém sendo que é um exercício básico e você está aprendendo, acho que por enquanto não há necessidade

 

 

Link para o comentário
Compartilhar em outros sites

11 horas atrás, arfneto disse:

 

Então...

 

    printf("Digite o numero: ");
    scanf("%d", &num);
    
    x = somar(num);
    
    printf("Resultado: %d", num);

 

Você está somando em x, mas mostra num....🤔

 

 

Pois é, foi como eu disse que você fez no seu programa, você não mostrou o x(res), mostrou a o resultado da variável que a função recebia como parâmetro(b).

Mas de curiosidade, eu tentei fazer mostrando o x que antes estava dando erro no resultado e deu certo, não tinha conseguido da primeira vez porque na função eu havia feito: 'n =+ 4' ao invés de 'n += 4'. Porém no programa dele continuou dando erro.

 

E você citou o erro como corrigido mas não mostrou a solução

Pois então, minha solução foi tirar esse x e simplesmente chamar a função dentro do main. Eu não postei o código todo diretamente porque capaz que a moderação reclamasse que eu estou passando respostas, eu só apontei de leve as alterações a serem feitas. 

Vamos supor que eu mantenha o x e faça a alteração que está acusando abaixo e mude a função para int ao invés de void:

PS C:\src\C\dvr> gcc -o or or22.c
or22.c: In function 'main':
or22.c:17:2: error: void value not ignored as it ought to be
   17 | x=funcao(b);
      |  ^
PS C:\src\C\dvr> 


Aí depois o compilador vem com esse erro:

main.c:16:13: warning: format ‘%d expects argument of type int *’, but argument 2 has type int [-Wformat=]
   16 |     scanf("%d",b);

Ele está reclamando que o argumento deve ser int *. Por isso eu perguntei naquela hora se era algo relacionado a ponteiro. Enfim, em teoria deveria funcionar e não dar esse erro...

Edit/atualizando: ignora essa última parte, é óbvio que vai dar erro porque a função não está fazendo nada com o numero apenas imprimindo se é par ou impar, ela não tem o que retornar. Na verdade pra manter esse x aí teria que fazer um código mais longo como o exemplo que você deu mas daí.. parece desnecessário, eu prefiro tirar esse x e boa.

Link para o comentário
Compartilhar em outros sites

4 horas atrás, Felipecfk disse:

Ele está reclamando que o argumento deve ser int *. Por isso eu perguntei naquela hora se era algo relacionado a ponteiro. Enfim, em teoria deveria funcionar e não dar esse erro...

 

Em teoria não deveria funcionar e deveria dar exatamente esse erro. Leu o exemplo e tudo que eu expliquei?

 

Em 23/11/2021 às 09:12, arfneto disse:

scanf() não aloca memória. "%d" indica que vai ler um inteiro então precisa passar o endereço de uma área de memória que exista. Esse é o endereço que a função vai usar para gravar o resultado

 

É como eu disse. scanf() não aloca memória. Não precisa ser int*.  Basta ser um endereço em que scanf() possa gravar os resultados.

 

19 horas atrás, Felipecfk disse:
   int num;
    int x;
    
    printf("Digite o numero: ");
    scanf("%d", &num);
    
    x = somar(num);
    
    printf("Resultado: %d", num);
    

 

O que está errado em seu programa --- e eu te disse --- é que usou a variável errada no printf(). Veja acima de novo.

 

Claro, não testou o retorno de scanf() e isso é um outro erro, ou no mínimo uma ingenuidade, já que na linha de baixo vai mandar para uma função um valor que pode não ter sido não lido

 

4 horas atrás, Felipecfk disse:

Na verdade pra manter esse x aí teria que fazer um código mais longo como o exemplo que você deu mas daí.. parece desnecessário, eu prefiro tirar esse x e boa

 

Não, não precisa. Basta corrigir a declaração da  função.

 

 

Corrigindo seu programa @Felipecfk, podia usar assim

 

#include <stdio.h>

int somar(int n){ return n + 4; }

int main(void)
{
    int num;
    int x;
    
    printf("Digite o numero: ");
    if ( 1 != scanf("%d", &num)) return -1;
    
    x = somar(num);    
    //printf("Resultado: %d", num); // original do seu programa: esta errado
    printf("[1] Resultado (%d+4): %d\n", num,x);
    printf("[2] Resultado (%d+4): %d\n", num,somar(num));
    return 0;
}

 

E ver

 

PS C:\src\C\dvr> gcc -o cfk -Wall  x25.c
PS C:\src\C\dvr> ./cfk
Digite o numero: 42
[1] Resultado (42+4): 46
[2] Resultado (42+4): 46
PS C:\src\C\dvr>

 

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

Citação

Claro, não testou o retorno de scanf() e isso é um outro erro, ou no mínimo uma ingenuidade, já que na linha de baixo vai mandar para uma função um valor que pode não ter sido não lido

Não entendi de testar o retorno, dá pra testar colocando o programa para rodar não? A não ser que eu esteja tentando debugar alguma coisa... Ainda mais no caso de um exercício básico de par e ímpar.

Realmente esse return n+4; É um pouco mais prático.

Você não precisava deixar esse comentário "//printf("Resultado: %d", num); // original do seu programa: esta errado", porque como eu disse, eu já havia testado ele retornando somente o x (que como eu disse já havia funcionado no meu, no dele não). Em uma ocasião normal eu faria printf("%d", x); mesmo porque parece fazer mais sentido.

Mas como eu disse (e você ignorou), no caso do "print("%d", num);" Eu peguei a lógica de print desse trecho do seu código, o 'b' é equivalente ao num e não ao x:

if(res)
    {
        printf("%d: par\n", b);
        return 1;
    }
    printf("%d: impar\n", b);
    return 0;



Em relação a simplesmente troca de void para int

Citação

Não, não precisa. Basta corrigir a declaração da  função.

Não, e essa parte você não está entendendo: Se eu fizer isso aqui:

 

int funcao(int numero)
{
  if(numero%2==0)
      printf("par");
  else
      printf("impar");
}

 

Ele vai retornar o par ou impar e tal mas vai colocar um número a mais que não era pra estar lá. Isso, eu imagino que acontece porque a função não está retornando um int como deveria mas apenas imprimindo uma string, então o programa mostra a impressão mas mostra também o número que entrou como parâmetro e que não mudou. Então por exemplo se eu coloco 3, no terminal acaba saindo "impar3" ou se eu coloco 2, acaba saindo "par2". Entendeu?

 

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Felipecfk disse:
int funcao(int numero)
{
  if(numero%2==0)
      printf("par");
  else
      printf("impar");
}

 

4 minutos atrás, Felipecfk disse:

Ele vai retornar o par ou impar e tal mas vai colocar um número a mais que não era pra estar lá. Isso, eu imagino que acontece porque a função não está retornando um int como deveria mas apenas imprimindo uma string, então o programa mostra a impressão mas mostra também o número que entrou como parâmetro e que não mudou. Então por exemplo se eu coloco 3, no terminal acaba saindo "impar3" ou se eu coloco 2, acaba saindo "par2". Entendeu?

 

Não , não entendi.

 

Isso sequer compila. A função não vai retornar nada, pela falta de um return. Não consigo entender o que quer dizer. Sugiro ficar com os dois exemplos que te mostrei.

 

6 minutos atrás, Felipecfk disse:

Mas como eu disse (e você ignorou), no caso do "print("%d", num);" Eu peguei a lógica de print desse trecho do seu código, o 'b' é equivalente ao num e não ao x:

 

Como te mostrei, sua lógica estava certa até você mostrar o valor da variável errada. Não ignorei nada. Veja os exemplos que mostrei e vai entender.

 

16 horas atrás, arfneto disse:
x = somar(num);
    
    printf("Resultado: %d", num);

 

o resultado da função altera o valor de x não o de num. Você tem um livro? Uma apostila ao menos? Entende o conceito de função e endereços? 

 

1 hora atrás, arfneto disse:
   
    x = somar(num);    
    //printf("Resultado: %d", num); // original do seu programa: esta errado
    printf("[1] Resultado (%d+4): %d\n", num,x);
    printf("[2] Resultado (%d+4): %d\n", num,somar(num));
  

 

Talvez esse trecho te ajude a entender. o printf() [1] mostra x e num

 

Link para o comentário
Compartilhar em outros sites

Em 25/11/2021 às 13:51, arfneto disse:

 

Como te mostrei, sua lógica estava certa até você mostrar o valor da variável errada. Não ignorei nada. Veja os exemplos que mostrei e vai entender.

 

 

Ignorou sim, minha lógica não tem como estar errada porque foi uma cópia da sua para razões de demonstração mas deixa pra lá,  quando o santo não bate, não tem porque forçar.

 

Talvez esse trecho te ajude a entender. o printf() [1] mostra x e num

ah vá, é mesmo?

 

Citação

o resultado da função altera o valor de x não o de num. Você tem um livro? Uma apostila ao menos? Entende o conceito de função e endereços? 

Claro que não, o resultado da função altera o parâmetro que ela recebeu. O x é apenas uma variável (desnecessária por sinal) que estava recebendo como valor a função (ou o que ela retorna). Desnecessário porque como eu mostrei no primeiro comentário, bastava chamar a função e pronto.
 

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

Em 25/11/2021 às 17:15, Felipecfk disse:

Claro que não, o resultado da função altera o parâmetro que ela recebeu. O x é apenas uma variável (desnecessária por sinal) que estava recebendo como valor a função (ou o que ela retorna). Desnecessário porque como eu mostrei no primeiro comentário, bastava chamar a função e pronto.

 

Não há sentido no que escreveu. O resultado da função nada faz com o parâmetro que ela recebeu. Mesmo que seja um ponteiro. 

 

Por exemplo

 

	x = somar(x);

 

é perfeitamente legal. Mas entenda que a função não altera o valor de x.

 

#include <stdio.h>

int somar(int* n)
{ 
    int a = *n;
    *n = 32;
    return a + 4;
}

int main(void)
{
    int num = 42;
    int x   = 1;
    printf("[antes de chamar a funcao] x = %d, num = %d\n", x, num);
    x = somar(&num); 
    printf("[depois de chamar a funcao] x = %d, num = %d\n", x, num);
    x = somar(&x); 
    printf("[depois de chamar x=somar(&x)] x = %d, num = %d\n", x, num);
    return 0;
}

 

Mesmo que somar() aceitasse um ponteiro, como vê acima, a função NUNCA altera o valor de seu argumento. Os argumentos são passados na pilha. Há um trem chamado stack frame que talvez você desconheça, e outra coisa chamada convenção de chamada --- calling convention --- que talvez deva estudar.

 

Não sei se tem um bom livro, nas nem precisa para entender isso., Rode o programa acima em sua máquina e vai ver

 

PS C:\src\C\dvr> gcc -o cfk -Wall  x25.c
PS C:\src\C\dvr> ./cfk
[antes de chamar a funcao] x = 1, num = 42
[depois de chamar a funcao] x = 46, num = 32
[depois de chamar x=somar(&x)] x = 50, num = 32

 

 

 

  • Curtir 1
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...