Jump to content

Recommended Posts

Posted

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.

Posted (edited)

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
Posted

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!

Posted

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
Posted

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

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