Jump to content

Calculo de médias


JotaB
 Share

Recommended Posts

Boa tarde, e desculpem estar a colocar uma duvida tão simples. Basicamente quero criar um programa que calcule a media das notas. O problema é que o resultado nunca contem números decimais (na verdade contem, mas são zeros).


main(){
 int a,b,soma=0,nota[8];

 printf("Pretendes calcular a média de quantas notas? ");
 scanf("%d",&a);
 fflush(stdin);
 while(a<=0||a>=9){
   fflush(stdin);
   printf("Introduza um numero maior que 0 e menor que 9: ");
   scanf("%d", &a);
 }
 for(b=1; b<=a; b++){
   fflush(stdin);
   printf("Introduza uma nota e pressione enter: ");
   scanf("%d",&nota[b]);
   soma=soma+nota[b];
 }
 double media=soma/a;
 printf("A media é de: %.2f",media);
}

Desculpem não ter tabulado o código, mas não estou a conseguir fazer isso aqui no forum.

Link to comment
Share on other sites

Olá!

O teu programa não funciona bem porque estás a ler as notas como inteiros.

Se queres fazer uma divisão de X por Y para ser um real Z, então X || Y tem de ser real. É por isso que vias sempre os zeros.

Se colocares as variáveis assim:

int a,b;
float soma=0;
float nota[8];

e mudares o scanf para:

scanf("%f",&nota[b]);

já vai dar.

Já agora, fiz um programa mais simples baseado no teu que ocupa menos memória e faz o mesmo =)

Para este programa é escusado utilizares um vetor.

#include <stdio.h>
int main(void){
  int a,b;
  float aux;
  float soma=0;

  printf("Pretendes calcular a média de quantas notas? ");
  scanf("%d",&a);

  for(b=0; b<a; b++){
  printf("Introduza uma nota e pressione enter: ");
  scanf("%f",&aux);
  soma+=aux;
  }

  aux = soma/a;
  printf("A media é de: %.2f",aux);

  return 0;
}

PS : O teu main não tinha tipo de retorno nem o return something; no fim. É importante que tenha!!!!!!

Edited by cdgramos
Link to comment
Share on other sites

Muito obrigado, ajudaste-me imenso!!!

Quanto à falta do return, o livro que ando a seguir (Linguagem C, de Luís Damas) ainda não tinha falado sobre isso, nem o coloca nos seus exemplos. Ainda assim, obrigado, vou começar a fazer uso dessa dica!

Link to comment
Share on other sites

O teu programa não funciona bem porque estás a ler as notas como inteiros.

errado

o problema não está na leitura mas na operação de calculo da média.

pega no código original e faz esta simples alteração e vê se dá ou não dá correcto


/*double media=soma/a; */
printf("A media é de: %.2lf",(double)soma/a);
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sim, agora funcionou, mas porque é a minha tentativa não funcionou?

o problema está nos tipos de dados usados nas contas efectuadas

aux = soma/a;

o que estás a fazer é a divisão de "soma" por "a" e atribuir o resultado a "aux" (mas isso já sabias)

o problema está nos tipos de dados das variáveis involvidas

no teu código o que está a acontecer é:

- o compilador verifica o tipo de dados da variável "soma" => é um inteiro

- o compilador verifica o tipo de dados da variável "a" => é um inteiro

- como estás a dividir um inteiro por um inteiro, a operação a ser feita é a divisão inteira dos dois valores => soma/a

- o compilador verifica o tipo de dados da variável "aux" => é um double

- como "aux" é de um tipo de dados de representação superior ao valor a ser atribuído (resultado da divisão inteira : um inteiro) então converte esse valor para um double.

!!! o problema é que o resultado da divisão já foi calculado como inteiro, logo o valor atribuído, mesmo que seja convertido para double, continua a ser um resultado inteiro !!!

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

se olhares para a minha alteração, verás que eu explicitamente fiz a conversão de um dos operandos para double.

isto força que o compilador converta o o restante operando também para o mesmo tipo (a isto chamasse "elevação do tipo de dados" para que a operação seja feita sobre dois valores com o mesmo nível de representação. desta forma, forço que o resultado da divisão seja um valor de vírgula flutuante ainda antes de ser atribuído e/ou usado, sendo assim o valor pretendido à pertida

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.