Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Keskiarvon laskeminen

Sivun loppuun

kermiitti [09.04.2009 14:06:06]

#

Mikä mättää? Koodi antaa ihan mitä sattuu tuloksia.

/*Keskiarvon laskeminen ja silmukkarakenne
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.*/

#include <iostream>
using namespace std;

int main()
{
	float arvosana = 0;
	float luku;
	float i;
	float keski;

	cout << "Ohjelma laskee koearvosanojen keskiarvon." << endl;
        cout << "Lukujen syöttämisen lopetus negatiivisella luvulla." << endl;

        while(arvosana > 0)
        		{
        		cout << "Anna arvosana (4-10)" << endl;
                        cin >> arvosana;
        		luku = luku + arvosana;
        		i++;
        		}
       keski = luku / i;
       cout << "Arvosanojen keskiarvo: " << keski;
}

Chiman [09.04.2009 14:23:41]

#

Mietipä mikä on luku-muuttujan alkuarvo.

petrinm [09.04.2009 14:25:11]

#

Näyttäisi olevan kotitehtävä, joten en anna ihan suoraa vastausta.
Eli tässä olisi muutama vinkki:
1. Ensinnäkin alusta i ja luku jollakin alkua arvolla(0) muuten keskiarvo on jotain ihan muuta, koska sen muuttujien saamissa muistikohdissa voi olla ihan mitä arvoja tahansa ilman alustusta.
2. Viimeinen negatiivinen luku huomioidaan keskiarvon laskennassa vaikka sitä ei pitäisi, koska whilen vertauli tapahtuu vasta lisäyksen jälkeen. Keksi tähän jokin ratkaisu.

kermiitti [09.04.2009 14:43:25]

#

Chiman kirjoitti:

Mietipä mikä on luku-muuttujan alkuarvo.

Kokeilin tulostaa luku muuttujan arvon joka kierroksella ja se itseasiassa kerää mielestäni ihan oikein arvosanojen summan itseenä. Muuttujien alustaminen ei juuri auttanut koodia.

Sitä en ymmärrä, että koodi lähtee periaatteessa toimimaan jos ehto on while(arvosana < 20) eli arvosana pienempi, kuin 20. 20 ei siis koskaan toteudu joten ohjelma on luupissa. Mutta miksi ohjelma lopettaa laskemisen heti jos laittaa ehdoksi (arvosana > 0) eikö tämän ehdon pitäisi olla tosi niin kauan, että syötetään negatiivinen luku tai vaikka laittaisi ehdoksi (arvosana == 0)

Sitä en vielä ole miettinyt miten saan koodin jättämään negatiivisen luvun huomiotta. " Saako while silmukan sisälle kirjoittaa if lausekkeita?

#include <iostream>
using namespace std;

int main()
{
	float arvosana = 0;
	float luku = 0;
	float i = 0;
	float keski = 0;

	cout << "Ohjelma laskee koearvosanojen keskiarvon." << endl;
        cout << "Lukujen syöttämisen lopetus negatiivisella luvulla." << endl;

        while(arvosana < 20)
        		{
        		cout << "Anna arvosana (4-10)";
                        cin >> arvosana;
        		luku = arvosana + luku;
        		cout << luku;
        		i++;
        		}
       keski = luku / i;
       cout << "Arvosanojen keskiarvo: " << keski;
}

Metabolix [09.04.2009 14:52:57]

#

Asetat alussa arvosanan nollaksi, joten while (arvosana < 0) ei toteudu alussakaan.

jlaire [09.04.2009 14:53:45]

#

kermiitti kirjoitti:

Saako while silmukan sisälle kirjoittaa if lausekkeita?

Saa, ja silmukan voi lopettaa kesken break:illä. Kannattaa vilkaista vaikka putkan C-opasta. Monet perusasiat ovat samat C:ssä ja C++:ssa.

FYI, keskiarvon voi laskea myös näin (pseudokoodia):

count = 0, average = 0;
loop {
    average += (next() - average) / ++count;
}

kermiitti [09.04.2009 15:01:39]

#

ROCK ROCK

#include <iostream>
using namespace std;

int main()
{
	float arvosana;
	float luku = 0;
	float i = 0;
	float keski = 0;

	cout << "Ohjelma laskee koearvosanojen keskiarvon." << endl;
        cout << "Lukujen syöttämisen lopetus negatiivisella luvulla." << endl;

        while(arvosana > 0)
        		{
        		cout << "Anna arvosana (4-10)";
                        cin >> arvosana;
                        if(arvosana > 0)
                        	{
        			luku = arvosana + luku;
        			i++;
        			}
        		}
       keski = luku / i;
       cout << "Ohjelmaan syötetty " << i << " arvosanaa." << endl;
       cout << "Arvosanojen keskiarvo: " << keski;
}

Metabolix [09.04.2009 15:09:45]

#

Et edelleenkään korjannut ongelmaa. Et alusta arvosana-muuttujaa mitenkään, joten se voi alussa olla nolla etkä vieläkään pääse silmukkaan. Käännä silmukka do-while-silmukaksi tai alusta arvosana joksikin nollaa suuremmaksi.

Myös viimeisen tulostusrivin loppuun on syytä tulostaa rivinvaihto.

Jos jatkossakin sisennät koodisi noin epäloogisesti, ohjelmoinnillasi ei ole kummoista tulevaisuutta. ;)

goala [09.04.2009 16:12:09]

#

Ja.. eikös tuon pitänyt hyväksyä arvosanat vain väliltä 4-10?

#include <iostream>

int main()
{
        std::cout << "Ohjelma laskee koearvosanojen keskiarvon." << std::endl <<
                     "Lukujen syöttämisen lopetus negatiivisella luvulla." << std::endl;

        float arvosana  = 0.0f,
              luku      = 0.0f;
        int   yhteensa  = 0;

        for (; arvosana > 0; ) {
                std::cout << "Anna arvosana (4-10): ";
                std::cin >> arvosana;

                if (arvosana >= 4 && arvosana <= 10) {
                        luku += arvosana;
                        ++yhteensa;
                }
        }

        if (yhteensa > 0) {
                float keskiarvo = luku / yhteensa;

                std::cout << "Ohjelmaan syötetty " << yhteensa << " arvosanaa." << std::endl
                          << "Arvosanojen keskiarvo: " << keskiarvo << std::endl;
        }
}

Metabolix [09.04.2009 16:47:17]

#

goala, sinunkin koodissasi on sama virhe: alustat arvosanan nollaksi, joten silmukkaan ei koskaan päästä. Lisäksi for-silmukka on semanttisesti väärä väline tuossa tilanteessa.

Miksei näin yksinkertaista ohjelmaa voi edes vaivautua testaamaan, ennen kuin lähettää "korjatun" versionsa?

#include <iostream>
#include <limits>

int main() {
	std::cout << "Keskiarvolaskuri laskee arvosanain keskiarvon." << std::endl;
	std::cout << "Negatiivinen arvo lopettaa ohjelman." << std::endl;
	int arvosana, summa = 0, lkm = 0;
	std::cout << "Syötä arvosana (4-10):  ";
	std::cin >> arvosana;
	while (!(arvosana < 0)) {
		if (std::cin.good() && 4 <= arvosana && arvosana <= 10) {
			summa += arvosana;
			lkm += 1;
			std::cout << "Arvosanoja annettu " << lkm << ", keskiarvo on nyt " << ((float)summa / lkm) << std::endl;
		} else {
			std::cout << "Virheellinen arvo!" << std::endl;
			if (!std::cin.good()) {
				std::cin.clear();
				std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
			}
		}
		std::cout << "Anna seuraava arvosana: ";
		std::cin >> arvosana;
	}
	if (lkm) {
		std::cout << "Arvosanoja annettiin yhteensä " << lkm << ", niiden keskiarvo on " << ((float)summa / lkm) << std::endl;
	} else {
		std::cout << "Yhtään arvosanaa ei syötetty." << std::endl;
	}
}

Ihme_kala [09.04.2009 17:08:50]

#

Ihan mielenkiinnosta täytyy kysyä, Metabolix (ja goala), että onko siihen joku erityinen syy, ettet laita koodin alkuun "using namespace std" vaan kirjoitat jokaisen erikseen? Vaikuttaako johonkin jne.?

Metabolix [09.04.2009 17:26:31]

#

Onko mielessäsi jokin erityinen syy, jonka vuoksi se pitäisi laittaa? Jos vastaat tähän, että "se helpottaa kirjoittamista", niin mikset saman tien nimeä kaikkia omiakin muuttujiasi yhden tai kahden kirjaimen nimillä? Helpottaahan sekin vastaavasti kirjoittamista.

Asian vaikutus on tietenkin se, että std-nimiavaruus sisältää paljon nimiä ja using namespace std koodin alussa tuo ne kaikki näkyville globaaliin nimiavaruuteen, jolloin törmäyksiä syntyy helpommin. Kun sitten vaikkapa satutaan tarvitsemaan matemaattista vektoria ja annetaan sen luokalle nimeksi vector, ollaankin jo mielenkiintoisessa tilanteessa koodin ymmärrettävyyden kannalta.

Ihme_kala [09.04.2009 17:35:01]

#

Metabolix kirjoitti:

Asian vaikutus on tietenkin se, että std-nimiavaruus sisältää paljon nimiä ja using namespace std koodin alussa tuo ne kaikki näkyville globaaliin nimiavaruuteen, jolloin törmäyksiä syntyy helpommin. Kun sitten satutaan tarvitsemaan matemaattista vektoria ja annetaan sen luokalle nimeksi vector, ollaankin jo mielenkiintoisessa tilanteessa koodin ymmärrettävyyden kannalta.

Okei, näin arvelinkin, että joku haittavaikutuskin voi olla :)

Metabolix kirjoitti:

Onko mielessäsi jokin erityinen syy, jonka vuoksi se pitäisi laittaa? Jos vastaat tähän, että "se helpottaa kirjoittamista", niin mikset saman tien nimeä kaikkia omiakin muuttujiasi yhden tai kahden kirjaimen nimillä? Helpottaahan sekin vastaavasti kirjoittamista.

Se ei paitsi helpota kirjoittamista, myös lukemista kun on huomattavasti vähemmän koodia, ja aloittelijan silmin tuo näyttää myös paljon sotkuisemmalta noin. Ja muuttujien nimeämistä yhdellä kirjaimella voi tuskin verrata tähän, nimittäin se, että muuttujat eivät kuvaa niiden sisältöä, haittaa koodin lukemista aika lailla varsinkin vieraan lukijan silmin. Vai..? Tietenkin aloittelija kun olen, kirjoitan aina vain omasta näkökulmasta, ja te kokeneemmat löydätte varmaan tästä jonkun eri kulman. Jonka takia täällä keskustellaankin.

Mutta joo, eiköhän nämä ole paljolti koodaustottumuksesta kiinni, varmaan minäkin tekisin erilailla jos olisin kokeneempi jne., mutta aloittelijan aspektista olisi parempi pyrkiä selkeyteen ja pistää se using namespace ja nimetä muuttujat ja funktiot varmuudeksi suomenkielellä jotta näitä törmäyksiä ei sitten tule. Mutta, halusin vaan tietää, siinä kaikki.

Metabolix [09.04.2009 17:52:24]

#

Ihme_kala kirjoitti:

Ja muuttujien nimeämistä yhdellä kirjaimella voi tuskin verrata tähän, nimittäin se, että muuttujat eivät kuvaa niiden sisältöä, haittaa koodin lukemista aika lailla varsinkin vieraan lukijan silmin.

Monet standardikirjaston asiat on lyhyesti nimetty (cin, cout, ws, ios, ...) eivätkä ne ole niminä sen kuvaavampia kuin itsekään keksityt vastaavan mittaiset nimet. Esimerkiksi std::ws kertoo minulle koodin lukijana olennaisesti enemmän kuin pelkkä ws, ja vaikka nimi olisikin whitespace, kaipaisin silti std::-etuliitteen, jotta tietäisin, mistä todella on kysymys.

Ymmärrän kyllä näkökantasi. Itsekin alkuun käytin tuota kätevää merkintää, eikä se toki pahaksi ole, kunhan tietää sen merkityksen ja vaikutukset. Isompien projektien ja pidemmän koodintuijotuskokemuksen myötä olen muuttanut tapojani. Siinä vaiheessa, kun std:: ei enää näytä silmissäsi sotkuiselta, saatat yllättäen ymmärtää, miksi. ;)

Grez [10.04.2009 14:29:15]

#

Tuosta lukemisesta vielä sanoisin...

Tietysti jos ainoa "using namespace" on std, niin silloin pystyy lukemalla päättelemään että esim. suomenkieliset on omia ja muut tuolta std:stä. Mutta sitten jos laittaisi monta using namespacea, niin olisi hankala päätellä mistä kirjastosta ne on, jos taas laittaa alkuun nimi:: niin näkee suoraan mistä kirjastosta mikäkin on peräisin.

Milo [12.04.2009 21:02:24]

#

Koodi kirjoitetaan englanniksi, ellei ole jotain erityistä syytä kirjoittaa sitä muulla kielellä.

Antti Laaksonen [12.04.2009 21:06:24]

#

Ja kelvollinen erityinen syy on, että haluaa kirjoittaa koodin suomeksi.

Teuro [12.04.2009 21:34:27]

#

Monasti tosiaan on mukavampi lukea suomeksi hyvin kirjoitettua koodia, kuin huonolla englannilla kirjoitettu. Itselläni on tapana kirjoitella suomeksi, koska se nyt sattuu olemaan äidinkieli. Omat englannin kielen taidot kirjoittamisessa ovat sen verran ruosteessa, että tuotettu ohjelmakoodi olisi todella hankalalukuista, koska ohjelman osien nimeäminen ei olisi loogista.

pipo [12.04.2009 21:47:41]

#

Oon ennenkin ihmetellyt tota kielivalintaa. Miksi suomalainen kirjoittaisi koodinsa englanniksi? Paitsi jos se on tarkoitettu ulkomaalaisen luettavaksi.

Milo [12.04.2009 22:20:15]

#

Itse kirjotan pääosin englanniksi koska tietoteknisesti suomenkieli on todella kankeaa ja kauheaa luettavaa. Englanninkielinen termistö on usein paljon kuvaavampi kuin suomenkielinen väkisin väännetty termistö.

jlaire [12.04.2009 22:24:11]

#

pipo kirjoitti:

Miksi suomalainen kirjoittaisi koodinsa englanniksi?

Koska ohjelmointikielen avainsanat, dokumentaatio ja kaikki kirjastot käyttävät englantia? Ja, kuten itsekin sanoit, joku muukin saattaa joskus vilkaista koodia. Suomea osaavat vain suomalaiset, mutta englantia käytetään melkein kaikkialla.

Lisäksi kaikille käsitteille ei ole (kunnollista) suomenkielistä vastinetta, joten joutuu joko vetämään hatusta käännöksiä joita muut eivät ymmärrä tai käyttämään paljon lainasanoja. Minusta englanti on yleensä paljon selkeämpää.

Ymmärrettävä syy suomen käyttöön on, ettei vielä osaa englantia riittävän hyvin.

Edit: Yksi artikkeli tähän liittyen, jossa on hyviä pointteja: http://www.codinghorror.com/blog/archives/001248.html.

Grez [12.04.2009 22:40:50]

#

Ei kai nyt kukaan "kieltä" kirjoita suomeksi, tulisi kohtuullinen läjä defineitä (tai mikä nyt kunkin kielen tapa on nimetä juttuja). Jos taas mietitään esimerkiksi muuttujien ja funktioiden nimiä, niin en oikein ymmärrä perusteluita että "tietotekniikan termejä ei löydy järkevästi suomeksi". Suuri osa ohjelmista tehdään muihin kuin puhtaasti tietoteknisiin tarpeisiin. Jos vaikka tekee funktion jonka on tarkoitus laskea keskiarvo, niin missä tuon nimeämisessä tietoteknisiä termejä tarvitsee?

Esimerkiksi jonkun yrityksen liiketoimintaa tukevia järjestelmiä tehdessä voi pikemminkin tulla päinvastainen tilanne, jossa käytetään termejä joiden englanninnokset aiheuttaisivat vain turhia mahdollisuuksia väärinkäsityksiin.

Chiman [12.04.2009 22:59:33]

#

Erityisesti yritysmaailmassa koodin kirjoittaminen englanniksi on yleinen käytäntö, vaikka kaikki sen hetkiset osapuolet olisivat suomalaisia. Lyhyesti sanottuna nykymaailmassa on vaikea olla varma siitä, ettei kenenkään suomea taitamattoman tarvitsisi missään vaiheessa ymmärtää koodia. Sama koskee avoimen lähdekoodin tuottamista: miksi rajoittaa koodin leviämistä vain suomen kieltä osaavien keskuuteen.

Toisaalta nuorille aloitteleville ohjelmoijille omankielisestä lähdekoodista on hyötyä, jottei oppiminen hidastu puutteellisen kielitaidon takia. Siten esimerkiksi Putkan sisällä koodien suomenkielisyys on mielestäni hyvin perusteltua.

jlaire [12.04.2009 23:24:33]

#

Grez kirjoitti:

Jos taas mietitään esimerkiksi muuttujien ja funktioiden nimiä, niin en oikein ymmärrä perusteluita että "tietotekniikan termejä ei löydy järkevästi suomeksi".

Itse ajattelin enemmän koodin kommentoimista. Usein joutuu viittaamaan esim. kielen ominaisuuksiin. Toki voi käyttää suomea pelkästään muuttujien nimissä ja englantia kommenteissa, jos haluaa.

Antti Laaksonen [12.04.2009 23:27:16]

#

Mistä ohjelmointisanat ovat tulleet englantiin? Nekin on joku ensin keksinyt, ja nekin ovat aluksi tuntuneet vierailta.

Miksi sana "computer" kuvaa jotenkin hyvin tietokonetta? Onko englannin kielen kehitystä ohjannut vuosisatojen ajan se, että se lopulta soveltuisi luontevasti ohjelmointiin?

Suomen kieleen on keksitty aika monta sanaa. Mikael Agricola keksi Raamattua kääntäessään mm. sanat esimerkki, väkivalta, hallitus, omatunto ja vihollinen. Eivätkö nämä sanat sovi suomeen? Miten näitä sanoja ymmärrettiin aluksi?

Milo [13.04.2009 01:04:14]

#

Terminal vai pääte?
Session vai istunto?
Cookie vai keksi/eväste?
Kernel vai (käyttöjärjestelmän) ydin?
Client vai asiakasohjelma?

Näitä voisin jatkaa loputtomiin, sillä nämä on vielä sieltä helpoimmasta päästä.

Itse vastaisin jokaiseen englanninkielisen vastineen.

pipo [13.04.2009 12:09:16]

#

Jos yritysmaailmassa tai projektityössä joutuu kirjoittamaan koodia, niin eiköhän se asiakas tai tehtävän asettaja kerro mitä kieltä tulee käyttää.

Kaikissa kielissä on sanoja jotka voi ymmärtää monella tavalla. Jos olisi vain yksiselitteisiä sanoja sisältävä kieli, niin se valittaisiin välittömästi koko maailman tekniikan kieleksi. Englanti on tekniikassa yleinen koska sitä osataan yleisesti, saksa vissiin muista syistä. Joissain tieteenaloissa taas käytetään latinaa, jota ei osata niin yleisesti.

Valittaessa englanti taikka suomi, kielitaito ei ole mielestäni kovin hyvä peruste valinnalle (pl. äidinkieli). Ei ole mahdollista osata kaikkia englannin kielisiä ilmaisuja, varsinkaan kun ei osaa kaikkia suomenkaan kielisiä. Sanakirjan käyttäminen ei välttämättä vaadi kielitaitoa vaan äidenkielen ja kyseisen alan sanaston osaamista.

pipo kirjoitti:

Miksi suomalainen kirjoittaisi koodinsa englanniksi?

Tätä voisi kommenttienne perusteella verrata kysymykseen: Miksi suomalainen kirjoittaisi kirjansa englanniksi? Nokun se on tarkoitettu luettavaksi englannin kieliselle. Kielen valinnan määrää tässä kohdeyleisö. Koodin kommentointia omiksi muistiinpanoikseen voisi verrata jopa kauppalistan tekemiseen, jonka itse teen useimmiten suomeksi. Koodin dokumentaation puolestaan voi kai kirjoittaa niin monelle kielelle kuin on tarvetta. (Tarkoitukseni ei ole vähätellä kielivalintakysymysen merkittävyyttä.)

Grez [13.04.2009 12:41:45]

#

pipo kirjoitti:

Miksi suomalainen kirjoittaisi kirjansa englanniksi? Nokun se on tarkoitettu luettavaksi englannin kieliselle. Kielen valinnan määrää tässä kohdeyleisö.

Riippuu vähän tietysti kirjan lajista, mutta usein jos suomalainen ei ole kovin hyvä englannissa, niin se kirja kannattaisi kirjoittaa suomeksi ja hankkia osaava kääntäjä kääntämään se englanniksi.

Mutta tämä ei oikeastaan liity koodaamiseen mitenkään. Kommenteissa ei niin haittaa vaikka olisi kirjoitusvirheitä ja huonoa kieltä, riittää että ne ymmärtää edes kohtuullisesti.

pipo [13.04.2009 13:44:31]

#

Grez kirjoitti:

Riippuu vähän tietysti kirjan lajista, mutta usein jos suomalainen ei ole kovin hyvä englannissa, niin se kirja kannattaisi kirjoittaa suomeksi ja hankkia osaava kääntäjä kääntämään se englanniksi.

Jos pitää hankkia osaava kääntäjä, niin on jo päätetty että tarvitaan englanninkielinen lopputuote, kieli on siis jo valittu. Luulisin että englantia erinomaisesti osaava kirjailija osaa äidinkieltään vielä paremmin.

Liittyyhän tämä ohjelmoinnissa käytettävän kielen valintaan:

pipo kirjoitti:

Kielen valinnan määrää tässä kohdeyleisö.

Kohdeyleisö voi olla vaikka, työkaveri, työnantaja, putkan oppaan lukija, venäläinen avaruusteknikko, englanninkielisen ohjelmointisivuston lukija tai yleisesti kielestä riippumatta asiakas, joka saattaa joutua lukemaan koodia tai sen dokumentaatiota.

Spongi [14.04.2009 11:27:31]

#

Pientä offtopikkia :p Sama kait se on mitä kieltä sen koodinsa kirjottamiseen käyttää, käyttää sitä mistä tykkää ja mikä tuntuu hyvältä.

goala [14.04.2009 11:54:23]

#

Metabolix kirjoitti:

goala, sinunkin koodissasi on sama virhe: alustat arvosanan nollaksi, joten silmukkaan ei koskaan päästä. Lisäksi for-silmukka on semanttisesti väärä väline tuossa tilanteessa.

Joopa joo, oikeassa olet. En testannut koodia ja triviaali virhe pääsi lipsahtamaan. Pahoittelen tapahtunutta.

goala [14.04.2009 13:25:43]

#

Ja Metabolixille vielä sen verran, että tuo käyttämäni for -silmukka ei ole semanttisesti millään tavalla väärin. Missään ei määritetä sitä, millä tavalla tuo silmukka pitäisi kasata. Generoitu konekieli on tismalleen sama, mikäli käytettäisiin while (arvosana > 0).

pipo [14.04.2009 14:28:48]

#

Spongi kirjoitti:

Pientä offtopikkia :p Sama kait se on

Makuasioista ei voi kiistellä, mutta toisen makua saa haukkua, ja siitä nämä keskustelut saa alkunsa.

(ps. se sanoi semanttisesti väärin, ei ohjelmallisesti väärin)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta