JotaB Posted April 6, 2014 at 06:27 PM Report #551376 Posted April 6, 2014 at 06:27 PM 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.
cdgramos Posted April 6, 2014 at 06:51 PM Report #551379 Posted April 6, 2014 at 06:51 PM (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 at 06:52 PM by cdgramos www.cdgramos.com
JotaB Posted April 6, 2014 at 07:11 PM Author Report #551380 Posted April 6, 2014 at 07:11 PM 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!
HappyHippyHippo Posted April 6, 2014 at 08:06 PM Report #551381 Posted April 6, 2014 at 08:06 PM 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
JotaB Posted April 7, 2014 at 03:18 PM Author Report #551468 Posted April 7, 2014 at 03:18 PM Sim, agora funcionou, mas porque é a minha tentativa não funcionou?
HappyHippyHippo Posted April 7, 2014 at 03:38 PM Report #551476 Posted April 7, 2014 at 03:38 PM 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
JotaB Posted April 7, 2014 at 03:43 PM Author Report #551480 Posted April 7, 2014 at 03:43 PM Entendi! Muito obrigado!!!
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