Logo Hardware.com.br
kikoabel
kikoabel Novo Membro Registrado
2 Mensagens 0 Curtidas

Dúvida em classes - C++

#1 Por kikoabel 11/04/2005 - 20:42
Por que a função media retorna um inteiro em vez de um float ???


--------------------------------------------------------------------------------


#include
#include
#include


class Numeros
{
protected:
int prim, seg;
public:
Numeros (int a, int b)
{ prim = a; seg = b; }
int maior()
{ return ( (prim > seg)? prim : seg);}
int mmc()
{
int x, y, z;
x = prim;
y = seg;
z = 0;
if (y > x)
{
z = x;
x = y;
y = z;
}
while (y != 0)
{
z = x % y;
x = y;
y = z;
}
z = prim * seg / x;
return z;
}
int menor()
{ return ( (prim < seg)? prim : seg);}
float media()
{ return (( prim + seg)/2);}
int dif()
{ return (prim - seg);}
int soma()
{return (prim + seg);}
};

void main()
{
int a,b;
system("CLS");
cout << "\n Informe o primeiro numero: ";
cin >> a;
cout << "\n Informe o segundo numero: ";
cin >> b;
Numeros N2 ( a , b );
cout << "\n O m.m.c. dos numeros vale " << N2.mmc();
cout << "\n O maior numero vale " << N2.maior();
cout << "\n O menor numero vale " << N2.menor();
cout << "\n A media dos numeros vale " << N2.media();
cout << "\n A diferenca entre os numeros vale " << N2.dif();
cout << "\n A soma entre os numeros vale " << N2.soma();
getche();
}
Wormer
Wormer General de Pijama Registrado
6.3K Mensagens 7 Curtidas
#2 Por Wormer
11/04/2005 - 20:53
Bom, dá pra fazer um typecast, aí funciona:

float media(){
return ((float)prim + (float)seg)/2;
}

Ou melhor ainda:

return (float)(prim + seg)/2;

Isso acontece porque vc está retornando uma divisão de inteiros, com o typecast vc força uma divisão de flutuante.
Por favor evitem fazer perguntas técnicas por MP, o fórum existe para isso.

EeePC 4G 701 + Windows Vista Ultimate
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#3 Por jqueiroz
12/04/2005 - 00:13
prim, seg e 2 são inteiros, então o cálculo é todo feito por inteiros. Não adianta nem fazer typecast, pq quando fizer, já vai ter truncado.

Na verdade o teu problema, especificamente, acontece quando vc tenta dividir (prim+seg) por 2, o truncamento ocorre aí.

A solução geral é vc forçar o tipo pra ponto flutuante logo no início:

return ( 1.0*prim + seg ) / 2.0;

Mas pra solução específica, basta usar "2.0" em vez de "2", pra já forçar a divisão de ponto flutuante ao invés da inteira.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
Wormer
Wormer General de Pijama Registrado
6.3K Mensagens 7 Curtidas
#4 Por Wormer
12/04/2005 - 22:39
No typecast que eu fiz, ele transforma antes de dividir, por isso funciona sim, pode compilar e testar. No segundo caso: ele soma prim e seg, transforma o resultado em float, e divide por 2. Sua solução também é válida, mas achei meio gambiarra. 8)

Ah, uma dica: eu notei um uso meio excessivo de parênteses nesse código. Nada contra, você pode achar o código mais legível assim, mas o problema é que tem gente que acaba achando que eles são necessários e vicia no uso. Eu particularmente não gosto de usar return (valor), dá a impressão de que valor é um parâmetro de uma função return. Mas na verdade return é um operador, não uma função.

Nessa linha também:

return ( (prim < seg)? prim : seg);

Poderia usar simplesmente return prim
Resumindo: use como preferir, mas saiba que os parênteses são opcionais.

E mais uma dica, pra deixar o código eficiente, nessa linha:

z = prim * seg / x;
return z;

Poderia usar simplesmente return prim * seg / x;, diminui o código e o processamento.

E por último, na hora de imprimir eu excluiria todos os cout, deixando só o primeiro.
Por favor evitem fazer perguntas técnicas por MP, o fórum existe para isso.

EeePC 4G 701 + Windows Vista Ultimate
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal