Ir ao conteúdo
  • Cadastre-se

Função par e impar separadas.


Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
  • Membro VIP

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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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