Olen juuri aloittanut ohjelmoinnin ja jäin jumiin ongelmaan, joka ei minun taidoillani ratkea.
Aiheena ovat ohjelmointikurssin tehtävät, ja viimeisen vastauksen aiheeseen löysin vuodelta 2006, kirjoittaja Metabolix. Koodini on lähes samanlainen kuin se, jonka hän kirjoitti malliksi, mutta kun sen ajaa, keskiarvoksi tulee väärä arvo sekä minulla että hänen ohjelmamallillaan.
Edellinen topic: https://www.ohjelmointiputka.net/keskustelu/
Tehtävä:
Tee ohjelma, joka kysyy oppilaiden koearvosanoja (kokonaisluvut 4-10 käytössä) ja laskee syötettyjen arvosanojen keskiarvon. Ohjelman tulee ottaa vastaan arvosanoja, kunnes arvosanojen syöttö lopetetaan negatiivisella kokonaisluvulla. Lopuksi ohjelma tulostaa arvosanojen lukumäärän sekä lasketun keskiarvon, joka tulostetaan kahden desimaalin tarkkuudella.
#include <stdio.h> int main(void) { int summa=0, arvosana, lkm=0; float keskiarvo; printf("Ohjelma laskee syötettyjen arvosanojen keskiarvon.\n"); printf("Lopetus negatiivisella kokonaisluvulla.\n"); do{ printf("Anna arvosana (4-10):"); scanf("%d", &arvosana); if(arvosana > 3 && arvosana < 11){ summa = summa + arvosana; lkm = lkm + 1; } }while(arvosana > 0); keskiarvo = summa / lkm; printf("Ohjelmaan syötetty %d arvosanaa.\n", lkm); printf("Arvosanojen keskiarvo: %.2f\n", keskiarvo); return 0; }
Mikä menee pieleen?
Kysymyksestäsi puuttuu tärkeä tieto: Millä tavalla ohjelma toimii väärin? Mitä se tulostaa, ja mitä sen pitäisi tulostaa?
Mutta arvaan: haluaisit tuloksen desimaalilukuna mutta saatkin kokonaisluvun. Luitkohan tuossa edellisessä keskustelussa viestini kokonaan? Sen lopussa kerrotaan, miten vastauksen saa desimaalilukuna. (Toisaalta tämän pitäisi selvitä myös oppimateriaaleista, joten suosittelen, että luet ne vielä uudestaan läpi.)
Vastaus tulostetaan kaksidesimaalisena desimaalilukuna, jonka arvoksi se antaa esimerkkiluvuilla 6.00, kun keskiarvon pitäisi olla 6.20...
int / int != float
fiilistelija kirjoitti:
keskiarvo = summa / lkm;
Niin hassulta kun se tuntuukin (koska keskiarvo on float), kahden kokonaisluvun jakolaskun tulos on kokonaisluku. keskiarvo = (float) summa / (float) lkm;
toimii kuten odottaisi.
Kiitos, enpä ollut tuota huomioinut vaikka useita viikkoja koodia muokkailinkin!
Aihe on jo aika vanha, joten et voi enää vastata siihen.