Ir ao conteúdo
  • Cadastre-se

Erro ao calcular média harmônica em C


Jvsierra

Posts recomendados

Olá a todos.

 

Eu fiz um exercício em C que pede para calcular alguns tipos de média, entre elas a média harmônica. Só que, ao executar o programa e selecionar a opção da média harmônica, o programa se fecha automaticamente.

 

Usei o Code::Blocks e o GNU GCC para compilar o código.

 

#include <stdio.h>
#include <math.h>

int main() {

  int numA, numB, numC = 0;

  printf("Digite o primeiro numero inteiro positivo: \n");
  scanf("%d", &numA);
  printf("Digite o segundo numero inteiro positivo: \n");
  scanf("%d", &numB);
  printf("Digite o terceiro numero inteiro positivo: \n");
  scanf("%d", &numC);

  if (numA < 0 || numB < 0 || numC < 0) {
    printf("voce digitou algum numero invalido. \n");
  }else{
    int escolha, media = 0;

    printf("Digite o tipo de media que voce quer calcular: \n");
    printf("1 - Geometrica\n");
    printf("2 - Ponderada\n");
    printf("3 - Harmonica\n");
    printf("4 - Aritmetica\n");
    scanf("%d", &escolha);

    switch (escolha) {
    case 1:
      media = cbrt(numA * numB * numC);
      printf("A media geometrica desses numeros e: %d\n", media);
        break;
    case 2:
      media = (numA + (numB * 2) + (numC * 3)) / 6;
      printf("A media ponderada desses numeros e: %d\n", media);
        break;
    case 3:
      media = 1 / ((1 / numA) + (1 / numB) + (1 / numC));
      printf("A media harmonica desses numeros e: %d\n", media);
        break;
    case 4:
      media = (numA + numB + numC) / 3;
      printf("A media aritmetica desses numeros e: %d\n", media);
        break;
    default:
      printf("Opção invalida.\n");
  }
  }

  return 0;
}

Alguém sabe por que o programa fecha ao selecionar a terceira opção?

 

Desde já, obrigado.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, zopek disse:

@Jvsierra Erro ou simplesmente fecha? Pelo que eu to olhando, você quer armazenar um Float em um Int, acho que só é possível pelo cast.

 

 

Eu mudei o código para:
 

case 3:
      media = (float) 1 / ((1 / numA) + (1 / numB) + (1 / numC));
      printf("A media harmonica desses numeros e: %f\n", media);
        break;

Daí, ele não dá mais o erro. Só que ele retorna um valor estranho:

 

bug2.png

Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <math.h>

float media_h(int a, int b, int c);

int main() {

  int numA,numB,numC;
  
  printf("Digite o primeiro numero inteiro positivo: \n");
  scanf("%d", &numA);
  printf("Digite o segundo numero inteiro positivo: \n");
  scanf("%d", &numB);
  printf("Digite o terceiro numero inteiro positivo: \n");
  scanf("%d", &numC);

  if (numA < 0 || numB < 0 || numC < 0) {
    printf("voce digitou algum numero invalido. \n");
  }else{
    int escolha;
    float media = 0;

    printf("Digite o tipo de media que voce quer calcular: \n");
    printf("1 - Geometrica\n");
    printf("2 - Ponderada\n");
    printf("3 - Harmonica\n");
    printf("4 - Aritmetica\n");
    scanf("%d", &escolha);

    switch (escolha) {
    case 1:
      media = cbrt(numA * numB * numC);
      printf("A media geometrica desses numeros e: %d\n", media);
        break;
    case 2:
      media = (numA + (numB * 2) + (numC * 3)) / 6;
      printf("A media ponderada desses numeros e: %d\n", media);
        break;
    case 3:
      printf("A media harmonica desses numeros e: %f\n", media_h(numA, numB, numC));
        break;
    case 4:
      media = (numA + numB + numC) / 3;
      printf("A media aritmetica desses numeros e: %d\n", media);
        break;
    default:
      printf("Opção invalida.\n");
  }
  }

  return 0;
}
//Todo processo do calculo precisa ser feito com float ou double
//caso contrario o resultado é nulo ou incorreto.             
//Fiz via função para separar entre o cálculo e o resto do código.
float media_h(int a, int b, int c){
	float N1 = a,
          N2 = b,
 	  	  N3 = c;
    float c1,c2,c3;
    
    c1 = 1/N1;
    c2 = 1/N2;
    c3 = 1/N3;
    
    return (3/ (c1+c2+c3));
}

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!