Eli tarkoitus olisi tehdä 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.
Ohjelman tulisi tulostaa seuraavasti:
Esimerkkitulostus
Ohjelma laskee syötettyjen arvosanojen keskiarvon.
Lopetus negatiivisella kokonaisluvulla.
Anna arvosana (4-10):4
Anna arvosana (4-10):5
Anna arvosana (4-10):6
Anna arvosana (4-10):9
Anna arvosana (4-10):7
Anna arvosana (4-10):-1
Ohjelmaan syötetty 5 arvosanaa.
Arvosanojen keskiarvo: 6.20
En saa tekemääni koodia toimimaan enkä oikein ymmärrä mikä siinä on vialla.
Voi myös olla että olen ihan pihalla tässä hommassa. Epätoivosesti yrittänyt maalaisjärjellä ratkoa tätä.
Koodi:
###########
#include
int main()
{
int i = 0;
int luku, ka, summa, maara;
printf("Ohjelma laskee syötettyjen arvosanojen keskiarvon.\nLopetus negatiivisella kokonaisluvulla.\n");
while(luku >= 0) {
printf("Anna arvosana (4-10):");
scanf("%d",&luku);
summa = luku;
i ;
}
maara = i - 1;
ka = summa / maara;
printf("Ohjelmaan syötetty %d arvosanaa.\n", maara);
printf("Arvosanojen keskiarvo: %.2d", ka);
return 0;
}
###########
C alkeet ongelma while lauseen kanssa
11
454
Vastaukset
- eternal_loop
Tuossa on aika monta virhettä:
ka pitäisi olla float.
Summaa ei alustettu nollaksi.
Muunnos jotain näin: ka = (float) summa / maara;
Ja silloin %.2d olisi tietysti %.2f
Lisäksi summaa lasketaan vaikka luku on muuta kuin 4-10 esim -1 tai 3.
Turha i-muuttuja mielellään pois ja mitä tapahtuu jos kirjoittaa vaikka pari kirjainta... ei kai jää ikuiseen silmukkaan.- eternal_loop
No joo, tuo ikuinen luuppi ongelma on liian vaikea noin alkuvaiheessa.
Syy on scanf, joḱa ei tyhjennä stdin-virtaa:
http://c-faq.com/stdio/scanfjam.html
Itse asiassa scanf:ää ei pitäisi koskaan käyttää syötteen lukuun:
http://c-faq.com/stdio/scanfprobs.html
Ja fgets-ratkaisukin on huono:
http://www.delorie.com/gnu/docs/glibc/libc_185.html
- keijokoodari12
Kiitos paljon avusta. Sain sen nyt toimimaan niin kuin piti.
- eternal_loop
Jos saat mallivastauksen, niin laitapa tänne.
- sdfsfsfsdfsfsfds
Tosiaan C:n standardikirjastoa ei todellakana ole suunniteltu konsolikäyttöliittymien luomiseen joten tämän kaltaiset koulutehtävät ovat hieman idioottimaisia.
Datan syöttäminen pitäisi toteuttaa enemminkin argumentteina.
Ncurses ja muut curses kirjastot ovat sitten varsinaisten käyttöliittymien tekoon.- eternal_loop
"Datan syöttäminen pitäisi toteuttaa enemminkin argumentteina."
Nimenomaan ja jos tehtävä vielä olisi: "Tee ohjelma joka laskee argumenttiensa keskiarvon".
Ratkaisu:
#include
int main( int argc, char *argv[] )
{
int i, count = 0;
float num, sum = 0.0;
for ( i = 1; i < argc; i ) {
if ( sscanf(argv[i], "%f", &num) == 1 ) {
sum = num;
count ;
}
}
printf( "Lukuja löytyi %d kpl\n", count );
printf( "Keskiarvo: %.2f\n", sum / count );
return 0;
}
Ohjelma on näin selkeämpi, näppärämpi käyttää, monipuolisempi ja yleisempi ratkaisu. Ja tietysti bugiton (luultavasti).
Toimii oikein mm. näillä syötteillä:
./keskiarvo 4 5 6
./keskiarvo 4.9999 5 jdja 6
./keskiarvo `cat keskiarvo.c` #tiedoston syöttö
Ohoh, tuohan muistuttaa jo oikeaa komentoriviohjelmaa. Ja siihen kun vielä myöhemmin lisää optioina alarajan ja ylärajan niin nuubi-koodari tuntisi että tulipa opittua jotain järkevää. - Jepajee...
eternal_loop kirjoitti:
"Datan syöttäminen pitäisi toteuttaa enemminkin argumentteina."
Nimenomaan ja jos tehtävä vielä olisi: "Tee ohjelma joka laskee argumenttiensa keskiarvon".
Ratkaisu:
#include
int main( int argc, char *argv[] )
{
int i, count = 0;
float num, sum = 0.0;
for ( i = 1; i < argc; i ) {
if ( sscanf(argv[i], "%f", &num) == 1 ) {
sum = num;
count ;
}
}
printf( "Lukuja löytyi %d kpl\n", count );
printf( "Keskiarvo: %.2f\n", sum / count );
return 0;
}
Ohjelma on näin selkeämpi, näppärämpi käyttää, monipuolisempi ja yleisempi ratkaisu. Ja tietysti bugiton (luultavasti).
Toimii oikein mm. näillä syötteillä:
./keskiarvo 4 5 6
./keskiarvo 4.9999 5 jdja 6
./keskiarvo `cat keskiarvo.c` #tiedoston syöttö
Ohoh, tuohan muistuttaa jo oikeaa komentoriviohjelmaa. Ja siihen kun vielä myöhemmin lisää optioina alarajan ja ylärajan niin nuubi-koodari tuntisi että tulipa opittua jotain järkevää.Todellakin juuri näin. Tämä on oikea ratkaisutapa standardikirjastolla.
- 23423423
Tosiaan tämän tehtävän on laatinut joko henkilö joka ei tiedä mitää C-ohjelmoinnista tai sitten henkilö joka on vittuillakseen pistänyt kurssilaiselle moisen sudenkuopan ratkaistavaksi.
Paras ratkaisu olisi muuttaa koko datan haku systeemi tai sitten käyttää curses kirjastoa.- eternal_loop
"Tosiaan tämän tehtävän on laatinut joko henkilö joka ei tiedä mitää C-ohjelmoinnista tai sitten henkilö joka on vittuillakseen pistänyt kurssilaiselle moisen sudenkuopan ratkaistavaksi."
Toivokaamme hartaasti jälkimmäistä...
- 22 22 22 22 22
tuohan on ihan normaali ohjelmoinnin peruskurssin tehtäviä, joka todennäköisesti tehdään siinä vaiheessa kun opiskellaan while-lausetta.
- dsfsfsdfs
Onko oikein vaatia aloittelijalta kiertämään inhottavia ongelmia jotka syntyvät siitä kun käsketään käyttää peruskirjastoa sellaiseen tarkoitukseen mihin sitä ei ole lainkaan suunniteltu.
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Ja taas ammuttu kokkolassa
Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.303481Kukka ampu taas Kokkolassa?
T. olisi hetkeä aiemmin lähtenyt johonkin. Naapuri kai tekijä J.K., ei paljasjalkainen Kokkolalainen, vaan n. 100km pääs91538Kuinka kauan
Olet ollut kaivattuusi ihastunut/rakastunut? Tajusitko tunteesi heti, vai syventyivätkö ne hitaasti?1131473Milli-helenalla ongelmia
Suomen virkavallan kanssa. Eipä ole ihme kun on etsintäkuullutettu jenkkilässäkin. Vähiin käy oleskelupaikat virottarell2241255Kun näen sinut
tulen iloiseksi. Tuskin uskallan katsoa sinua, herätät minussa niin paljon tunteita. En tunne sinua hyvin, mutta jotain34893Purra saksii taas. Hän on mielipuuhassaan.
Nyt hän leikkaa hyvinvointialueiltamme kymmeniä miljoonia. Sotea romutetaan tylysti. Terveydenhoitoamme kurjistetaan. ht242883- 60869
Helena Koivu on äiti
Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.130858Ja taas kerran hallinto-oikeus että pieleen meni
Hallinto-oikeus kumosi kunnanhallituksen päätöksen vuokratalojen pääomituksesta. https://sysmad10.oncloudos.com/cgi/DREQ66844Löydänköhän koskaan
Sunlaista herkkää tunteellista joka jumaloi mua. Tuskin. Siksi harmittaa että asiat meni näin 🥲97808