Ir ao conteúdo
  • Cadastre-se
Giovane Sornoqui

Função par e impar separadas.

Recommended Posts

Fala galera beleza?

 

Eu estou realizando alguns exercícios de programação da faculdade e me deparei com um problema:

 

O intuito do problema é trabalhar com funções, onde eu já implementei a soma dos n primeiros números inteiros, a soma dos números pares, a quantidade de números, porém quando eu vou fazer a função da soma dos números impares na hora da compilação o programa exibe o seguinte erro:

 

"invalid operands of types 'float' and 'double' to binary 'operator%'.

 

No caso eu utilizei a seguinte função:

float  IMPAR(float x)
{
if(x%2 != 0)
{
impar = impar + x;
return x;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas você está correto, a sintaxe lembra código C, e portanto o operador %(módulo/resto) opera exclusivamente com números não flutuantes, bem dito inteiros.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

O operador % é usado pra encontrar o resto de uma divisão de inteiros. Se você usar floats, o operador não faz sentido, porque a divisão sempre vai ter resto 0 (todo numero inteiro pode ser dividido em partes reais sem sobrar resto).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

Um adendo:

@PredatorX9,

Em 19/11/2016 às 20:05, PredatorX9 disse:

todo numero inteiro pode ser dividido em partes reais sem sobrar resto

O contexto estaria mais para o contrário... "uma divisão de um real por um inteiro".

Veja que a divisão seria por 2 (inteiro), logo, podendo resultar em resto. Ex.: 4,5 % 2, daria 2 com resto 0,5. Ou seja, creio que seria algo mais voltado a "limitação da linguagem" ou algo como "limitação da arquitetura computacional".

 

Enfim, creio que o problema pede "números inteiros":

Em 08/11/2016 às 14:34, Giovane Sornoqui disse:

O intuito do problema é trabalhar com funções, onde eu já implementei a soma dos n primeiros números inteiros, a soma dos números pares, a quantidade de números, porém quando eu vou fazer a função da soma dos números impares na hora da compilação o programa exibe o seguinte erro:

 

No caso bastando ajustar o tipo lá na função (e caso necessário: outros ajustes no código em si, como na declaração da variável no programa principal).


 

Abraços

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, Simon Viegas disse:

Olá.

Um adendo:

@PredatorX9,

O contexto estaria mais para o contrário... "uma divisão de um real por um inteiro".

Veja que a divisão seria por 2 (inteiro), logo, podendo resultar em resto. Ex.: 4,5 % 2, daria 2 com resto 0,5. Ou seja, creio que seria algo mais voltado a "limitação da linguagem" ou algo como "limitação da arquitetura computacional".

 

Enfim, creio que o problema pede "números inteiros":


 

Abraços

 

 

Fala aí Simon Viegas!

 

Até onde eu sei, A % B é o mesmo que A-(B*(A/B)), se você tentasse usar o operador % com um float (independente dele estar no numerador ou denominador), ele faria o casting automático na operação, transformando tudo em float pra depois calcular o resultado. Então 4.5 % 2 seria primeiro transformado em 4.5 % 2.0 pra depois ser calculado, e retornaria sempre 0...

 

De qualquer forma, uma alternativa pra calcular módulo com doubles ou floats é usar a função fmod:

http://www.cplusplus.com/reference/cmath/fmod/

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @PredatorX9.

 

4 horas atrás, PredatorX9 disse:

Então 4.5 % 2 seria primeiro transformado em 4.5 % 2.0 pra depois ser calculado, e retornaria sempre 0...

Se "%" significa resto, daria 0,5, não?

 

Então:

4 horas atrás, PredatorX9 disse:

Até onde eu sei, A % B é o mesmo que A-(B*(A/B))..

 

Testando:

A=4.5 e B=2.0

A-(B*(A/B))
4.5-(2*(4.2/2)
4.5-(2*(2.25)
4.5-(4.5)

0

 

OK, a conta bateu...mas fazendo a conta com números inteiros, também dará zero..

Tem algo errado ai... , veja: A-(B*(A/B)) --> A-(AB/B) --> A-A  --> 0 (não faz sentido, a expressão em si dá 0).  :D

 

A fórmula deve ser outra...

 

Se souber explicar melhor o conceito ficaria grato!

 

***

 

@Giovane Sornoqui, já conseguiu resolver?

 

 

adicionado 10 minutos depois

PS: não consegui vislumbrar como funcionara o operador % (ou MOD), mas consegui meio que simular um:

program simualdorMOD;
uses
  CRT;  
function MOD_tabajara(X,Y:real):real;
  begin
  repeat
    X:=X-Y;
  until X<Y;
  MOD_tabajara:=X;
  end;
BEGIN
ClrScr;
writeln('4.5 mod 2 = ',mod_tabajara(4.5,2):0:10); //"0.5" = "impar"
writeln('10  mod 2 = ',mod_tabajara(10 ,2):0:10); //"0" = "par"
ReadKey;
END.

 

PS2: pela definição de paridade, necessariamente os números terão que ser inteiro (Z) mesmo... 4.5 não é par, nem é ímpar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Simon Viegas disse:

Olá @PredatorX9.

 

Se "%" significa resto, daria 0,5, não?

 

A palavra "resto" só faz sentido no universo dos inteiros.

4.5 / 2.0 = 2.25, com resto zero.

8.0 / 3.0 = 2.666... com resto zero.

10.0 / 3.0 = 3.333... com resto zero.

etc...

Se a intenção é calcular a parte decimal, esta pode ser calculada com a função fmod, ou atribuindo um float a um inteiro, ex: int i = 3.14, que é a mesma coisa que int i = 3

adicionado 13 minutos depois
1 hora atrás, Simon Viegas disse:

Então:

 

Testando:

A=4.5 e B=2.0

A-(B*(A/B))
4.5-(2*(4.2/2)
4.5-(2*(2.25)
4.5-(4.5)

0

 

OK, a conta bateu...mas fazendo a conta com números inteiros, também dará zero..

Tem algo errado ai... , veja: A-(B*(A/B)) --> A-(AB/B) --> A-A  --> 0 (não faz sentido, a expressão em si dá 0).  :D

 

A fórmula deve ser outra...

 

Se souber explicar melhor o conceito ficaria grato!

 

***

 

 

A razão de não estar funcionando é porque essa é uma operação de resto, e é exclusiva para inteiros.

Veja só:

 

int A = 4;

int B = 3;

A-(B*(A/B)) == 4-(3*(4/3)) == 4-(3*(1)) == 4-3 == 1

 

Como A e B são inteiros, o computador enxerga que a divisão 4/3 também é um inteiro, 1, e não 1.3333...  (por isso não funciona com números reais, C.C o resultado final seria sempre 0)

 

Ps: desculpa pelo post duplo, eu sou novo aqui e não estou acostumado com esse sistema :(

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que agora eu entendi seu raciocínio... mas acho que esse "universo dos inteiros" seria somente no quociente, e não no dividendo e divisor.

 

Ex. de inteiro/inteiro.

8 / 3 = 2.666... vai ter resto 0 da mesma forma. Outro ponto interessante é que o operador "/" aceita inteiros para dividi-los, mas "exige" um real (ou conjunto maior) como resposta.

 

Outro exemplo:

10/2 = 5. 10 e 2 pode ser considerado inteiro, mas os "compiladores" não aceita o 5 inteiro tb. A "/" transforma a conta em real!

 

C=A/B; A e B inteiros ou real, e C necessariamente real (mesmo se A e B foram inteiros) pra cima

 

 

MEU CHUTE

Então, o % e o MOD seriam operadores, e estes possuem alguma limitação. Já o fmod é uma função, que por sua vez é mais flexível (como o exemplo que fiz acima em Pascal).

 

 

  • Curtir 2

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

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

×