Ir ao conteúdo

Posts recomendados

Postado

Eu estou tentando resolver algumas questões do fórum.

Me deparei com uma sobre média e quero usar fmod para calcular o % de acordo com a condição do while que está comentado.

Código:

#include <iostream>
#include <cmath>
int main(){

double n[5];//claro que aqui se eu usar int então no while o % funcionará
double media, soma = 0;
std::cout << "Numeradores: " << std::endl;
for(int i = 0; i < 5; ++i){
        std::cin >> n[i];
    soma+=n[i];
}
std::cout << "Soma dos numeradores: " << soma << std::endl;
media = soma/2.0;
std::cout << "Media: " << fmod(???,2.0) << std::endl; //se eu coloco soma o resultado n é o esperado
std::cout << "Media: " << media << std::endl;
/*
do{
    media = soma/2;
    std::cout << "Resultado da media e: " << media << std::endl;
}while((n1[5] != 0) && (n1[5]%2 == 0));
*/
return 0;
}

Como eu corrijo essas falhas?

Tentei o que consta aqui:

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

Postado

Esse while comentado só tá dizendo o seguinte:
Enquanto o número na posição de n[5] for diferente de 0 e este mesmo número for par, então, repita o bloco de código.

É algo bem esquisito visto que não sei se é esse mesmo o objetivo do programa, já que não vi nem um enunciado.

Mas se quiser fazer igual, basta colocar fmod(n[5], 2.0) que vai retornar um número maior ou igual a zero e menor que 2.0.

Basicamente éo resto da divisão de n[5] por 2.0. E logo em seguida, você escolhe um meio de verificar se o número é par.

 

Como você está trabalhando com double, vai precisar pensar num modo diferente de avaliar se o número é par.

Postado

Talvez eu não me expressei corretamente.

Vou dividir em duas partes.

Parte I: fazer uma média de valores inseridos(era antes uma questão somente de média mas eu resolvi implementar). Adiante, criei um array.

#include <iostream>

int main(){

int n[5];
double media, soma = 0;
std::cout << "Numeradores: " << std::endl;
for(int i = 0; i < 5; ++i){
        std::cin >> n[i];
    soma+=n[i];
}

std::cout << "Soma dos numeradores: " << soma << std::endl;
do{
    media = soma/2;
    std::cout << "Resultado da media e: " << media << std::endl;
}while((n[5] != 0) && (n[5]%2 == 0));

return 0;
}

Exemplo de entrada: 2,5,8,4,1. Resultado da media: 10.

Exemplo de entrada: 7,5,6,4,3. Resultado da media: 12.5.

 

Número com ponto flutuante não dá porque o array foi declarado como int.

Se eu faço double não dá porque o % não pode ser calculado.


error.jpg.b540eac4f5fff36ecd827599146476ad.jpg

 

Alguém falou no stackoverflow que "The % operator is for integers. You're looking for the fmod() function."

Tudo bem.

Parte II

Eu tentei fazer com fmod() e no cplusplus.com diz:

 

fmod.jpg.a20ec030c163b43db81dd76f5247b7fe.jpg

 

Quando eu declaro fmod(double x, double y);

Da maneira como você @cpusam falou, fica o seguinte resultado:

 

sua_maneirafmod.jpg.39ed5effbb13587489ebef8edd4d4b60.jpg

 

Da maneira como tenho tentado, usando 'soma' obtenho outro resultado:

 

minha_maneira_fmod.jpg.40d9992e29ebc4a4c0142b39f663afbc.jpg

 

Essa é minha dúvida. Qual a maneira correta de usar o fmod?

A intenção desde o início é de colocar os valores inseridos no array(for) e usá-los para a média e para o %.

porque os mod estão diferentes se soma e n[5] são a mesma coisa?

Postado

Certo, agora ficou mais claro.

Então, me permita explicar o que eu imagino:

Oegando os exemplos:

1-Exemplo de entrada: 2,5,8,4,1. Resultado da media: 10.

2-Exemplo de entrada: 7,5,6,4,3. Resultado da media: 12.5.

A média do exemplo 1 seria a soma das entradas divida por 5 (quantidade de números somados).

Dividir a soma por 2, na verdade você está pegando a mediana, o valor do meio, da soma, e não exatamente a média. Eu digo isso pra porque é importante não confundir a média com mediana. E observe que estou falando média aqui como média aritmética simples.

A média do exemplo 1 seria (2+5+8+4+1) / 5 = 20 / 5 = 4

A mediana do exemplo 1 seria: (2+5+8+4+1) / 2 = 20 / 2 = 10

 

O mesmo procedimento vale pro exemplo 2.

 

Agora, quanto a fmod, ele tá fazendo o trabalho dele corretamente, o que está acontecendo é apenas que ele pega o número quebrado (float) e então retornar o resto da divisão desse número pelo 2.0.

Por exemplo:

pegue o çodigo: fmod(soma, 2.0), com soma = 25.1

internamente, o fmod faz uma divisão do valor de soma com o 2.0 e retorna somente o que sobrar.

E como 25.1 (a soma) é um número quebrado, então o resto pode ser um número quebrado também.

Agora, no primeiro teste que você fez. o n[5] foi colocado assim fmod(n[5], 2.0), e o n[5] era justamente 3.

Se você pegar o 3 e dividir por 2 vai sobrar 1, porém, você declarou o n como tendo 5 posições.

 

Nas linguagens de programação, em maior creio, é comum contar começando do 0 e indo até um número específico.

Observe que no for, o i começa em 0 e vai até 4 (i < 5)

no fmod(n[5], 2.0) você está divindo um valor qualquer *(algum pedaço de memória fora do array n) e então está retornando o módulo dele.

 

Experiemnat fazer o seguinte:

-ali onde tem o fmod, coloca n[0]

-compila e roda o programa

O resultado vai ser o resto do primeiro número por 2.0

Agora faz o seguinte:

-coloca o n[5] de novo no fmod

-compila o programa

-roda o programa várias vezes com quaisquer valores.

 

Você vai ver que mesmo que você repita os valores, ainda assim vai dar diferente.

Por quê?

Pelo simples fato que o valor de n[5] está uma posição a frente do tamanho do array n.

Tipo,

o n começa em n[0] //OK

o n tem n[1]//OK

o n tem n[2]//OK

o n tem n[3]//OK

o n tem n[4]//OK

o n tem n[5]//oh shi?! aqui já mela tudo!

 

Terceiro teste:

Ali onde tem fmod, experimenta colocar o n[11]

compile e rode o programa

Por que deu diferente de novo?

Pelo mesmo caso do n[5], esse n[11] está além do tamanho do array, o tamanho do array n começa sempre no 0 e vai até o 4 (por isso o for com i < 5, pois i seria válido até somente 4)

 

 

Postado
3 horas atrás, cpusam disse:

Agora, no primeiro teste que você fez. o n[5] foi colocado assim fmod(n[5], 2.0), e o n[5] era justamente 3.

Se você pegar o 3 e dividir por 2 vai sobrar 1, porém, você declarou o n como tendo 5 posições.

Ah saquei! Não me recordei disso que o n[5] tem as posições 0,1,2,3,4. Eu coloquei direto no programa achando que ele pegaria todos os valores do array. Mas não faz. Só com a soma mesmo.

  • Membro VIP
Postado

@Cordas, vejamos:

 

Em 22/04/2020 às 21:54, Cordas disse:

Eu estou tentando resolver algumas questões do fórum.

Me deparei com uma [questão] sobre média [...]

 

Uma questão qual? ou seja: primeiro é preciso saber do que se trata... o que você quer fazer.

 

Primeiro entendem-se o problema, depois buscam-se uma solução. No caso, você está propondo uma solução (uso de fmod()) antes de definir exatamente qual é o problema. Afinal, que tipo de média quer calcular? Qual a relação do uso de "restos de uma divisão" para o cálculo de médias?

 

 

 

Sobre:

11 horas atrás, cpusam disse:

A média do exemplo 1 seria a soma das entradas divida por 5 (quantidade de números somados).

Dividir a soma por 2, na verdade você está pegando a mediana, o valor do meio, da soma, e não exatamente a média. Eu digo isso pra porque é importante não confundir a média com mediana. E observe que estou falando média aqui como média aritmética simples.

A média do exemplo 1 seria (2+5+8+4+1) / 5 = 20 / 5 = 4

A mediana do exemplo 1 seria: (2+5+8+4+1) / 2 = 20 / 2 = 10

 

@cpusam, creio que mediana seja "o valor que separa a metade maior e a metade menor de uma amostra", ou seja: a mediana de 2, 5, 8, 4 e 1 seria o 4 (pois é o número que, literalmente, separa as metades). Se tivesse uma quantidade par de números, a mediana seria a semi-soma dos dois elementos médios. Ex.: a mediana de 2, 5, 8, 4, 6 e 1 seria 4,5 (a metade de 4+5).

 

 

 

@Cordas, por favor, poste o enunciado completo da questão que está tentando resolver. 

 

Postado

@Simon Viegas quanto a mediana, é exatamente isso mesmo, eu errei ali na definição. Obrigado pela correção.

 

Postado
1 hora atrás, Simon Viegas disse:

@Cordas, vejamos:

 

 

Uma questão qual? ou seja: primeiro é preciso saber do que se trata... o que você quer fazer.

 

Primeiro entendem-se o problema, depois buscam-se uma solução. No caso, você está propondo uma solução (uso de fmod()) antes de definir exatamente qual é o problema. Afinal, que tipo de média quer calcular? Qual a relação do uso de "restos de uma divisão" para o cálculo de médias?

 

 

 

Sobre:

 

@cpusam, creio que mediana seja "o valor que separa a metade maior e a metade menor de uma amostra", ou seja: a mediana de 2, 5, 8, 4 e 1 seria o 4 (pois é o número que, literalmente, separa as metades). Se tivesse uma quantidade par de números, a mediana seria a semi-soma dos dois elementos médios. Ex.: a mediana de 2, 5, 8, 4, 6 e 1 seria 4,5 (a metade de 4+5).

 

 

 

@Cordas, por favor, poste o enunciado completo da questão que está tentando resolver. 

 

Como eu falei, eu tenho de verificar novamente. Era uma questão do ano de 2012. Era sobre média e eu resolvi modificar alguma coisa por questão de curiosidade. Mas está claro o que eu queria saber. Vcs já ajudaram.

  • Curtir 1
Postado
6 horas atrás, LuisOPsum disse:

Olá!

Você pode olhar e entender através desse portal.

https://www.programiz.com/cpp-programming/library-function/cmath/fmod

 

Espero ter ajudado.

Opa, estou usando esse site tb. Organizo minhas pastas agora com questões por assunto. Se vcs tiverem algum site ou listas com questões por assunto, tipo, functions (tantas questões), while loop, classes etc eu iria adorar isso rpz

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