JotaB Posted April 6, 2014 Report Share Posted April 6, 2014 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",¬a[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 More sharing options...
cdgramos Posted April 6, 2014 Report Share Posted April 6, 2014 (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",¬a[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 April 6, 2014 by cdgramos www.cdgramos.com Link to comment Share on other sites More sharing options...
JotaB Posted April 6, 2014 Author Report Share Posted April 6, 2014 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 More sharing options...
HappyHippyHippo Posted April 6, 2014 Report Share Posted April 6, 2014 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 Portugol Plus Link to comment Share on other sites More sharing options...
JotaB Posted April 7, 2014 Author Report Share Posted April 7, 2014 Sim, agora funcionou, mas porque é a minha tentativa não funcionou? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 7, 2014 Report Share Posted April 7, 2014 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 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
JotaB Posted April 7, 2014 Author Report Share Posted April 7, 2014 Entendi! Muito obrigado!!! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now