• Ei tuloksia

Toistokäsky while

3.2 Toistokäsky

3.2.1 Toistokäsky while

While-käskyn yleinen rakenne on while ehto:

käsky

Kun ohjelmassa suoritetaan tällaistä käskyä, toimitaan seuraavasti: Ensin tarkaste-taan, onkoehtotosi. Jos se on epätosi, siirrytään suoraan ohjelmassa eteenpäin. Jos se taas on tosi, suoritetaankäsky. Tämän jälkeen tarkastetaan uudelleen, onkoehto tosi. Jos se on tosi, suoritetaan käsky jälleen. Sen jälkeen tarkastetaan taas, onko ehto tosi. Näin jatketaan, kunnes tullaan siihen tilanteeseen, ettäehto on epätosi.

Silloin lopetaanwhile-käskyn suoritus ja siirrytään ohjelmassa eteenpäin.

Toistettavia käskyjä voi olla joko yksi tai useita peräkkäin. Jälleen sisennysten avulla osoitetaan, mitkä käskyt kuuluvat toistettavien käskyjen sarjaan. Ehdon totuusar-vo tarkistetaan kuitenkin vain ennen ensimmäisen käskyn suoritusta ja aina koko käskysarjan suorituksen jälkeen, ei siis käskysarjaan kuuluvien käskyjen välissä.

Tarkastallaan ensimmäisenä esimerkkinä ohjelmaa, joka pyytää käyttäjältä 10 ko-konaislukua ja laskee niiden keskiarvon.

def main():

print "Anna 10 kokonaislukua, lasken niiden keskiarvon"

i = 0 summa = 0 while i < 10:

rivi = raw_input("Anna seuraava luku: ") luku = int(rivi)

summa = summa + luku i = i + 1

keskiarvo = 1.0 * summa / 10

print "Niiden keskiarvo on", keskiarvo main()

Ohjelmassa käytetään muuttujaaipitämään kirjaa siitä, montako lukua on jo luet-tu. Ennen toistokäskyn alkua i:lle annetaan arvo 0 ja jokaisella kierroksella i:n arvoa kasvatetaan yhdellä. Koska lukuja halutaan lukea 10 kappaletta, on toisto-käskyn suorittamista jatkettava niin kauan kuini:n arvo on pienempi kuin 10.

Tarvitaan myös muuttuja, johon kerätään jo luettujen lukujen summa. Tähän tar-koitukseen ohjelmassa käytetään muuttujaasumma, joka myöskin alustetaan nollak-si ennen toistokäskyn alkua. Toistokäskyn jokaisella kierroksella käyttäjältä luettu luku lisätään muuttujansumma vanhaan arvoon.

Toistokäskyn päätyttyä lasketaan keskiarvo jakamalla summa luettujen lukujen määrällä. Jakolaskun suorittavalla rivillä muuttujan summa arvo on ensin kerrot-tu1.0:lla, jotta jakolaskun tulosta ei katkaistaisi kokonaisluvuksi.

Esimerkki ohjelman suorituksesta:

Anna 10 kokonaislukua, lasken niiden keskiarvon Anna seuraava luku: 12

Anna seuraava luku: 15 Anna seuraava luku: 42 Anna seuraava luku: 33 Anna seuraava luku: 76 Anna seuraava luku: 45 Anna seuraava luku: 22 Anna seuraava luku: 12 Anna seuraava luku: 34 Anna seuraava luku: 33 Niiden keskiarvo on 32.4

Edellisessä ohjelmassa luettavien lukujen määräksi on määrätty 10. Jos lukumäärää halutaan muuttaa, pitää muuttaa itse ohjelmaa. Ohjelma on kuitenkin kirjoitettu

niin, että muutos pitää tehdä kolmeen eri paikkaan: käyttäjälle annettavaan al-kuohjeeseen, toistokäskyn ehtoon ja keskiarvon laskevaan lausekkeeseen. On paljon parempi kirjoittaa ohjelma niin, että luettavien lukujen määrä tallennetaan muut-tujaan, jota sitten käytetään ohjelmassa aina siellä, missä määrää tarvitaan. Tällöin lukumäärää on tarvittaessa helppo muuttaa. Muutos tarvitsee tehdä vain yhteen paikkaan, ja tuon paikan löytäminen on helppoa silloinkin, kun ohjelma on pitkä.

Tällaista muuttujaa kutsutaan vakioksi ja sen nimi kirjoitetaan isoilla kirjaimilla ker-tomaan siitä, että ohjelman suorituksen ei ole tarkoitus muuttaa tämän muuttujan arvoa sen jälkeen, kun ohjelmassa on annettu muuttujalle vakioalkuarvo. Muutettu ohjelma on esitetty alla.

def main():

LKM = 10

print "Anna", LKM, "kokonaislukua, lasken niiden keskiarvon"

i = 0 summa = 0 while i < LKM:

rivi = raw_input("Anna seuraava luku: ") luku = int(rivi)

summa = summa + luku i = i + 1

keskiarvo = 1.0 * summa / LKM

print "Niiden keskiarvo on", keskiarvo main()

Seuraava versio ohjelmasta on sellainen, että käyttäjä voi itse kertoa, kuinka mon-ta lukua hän anmon-taa. Ohjelma pyytää aluksi käyttäjältä annetmon-tavien lukujen luku-määrän ja tallentaa sen muuttujaan lukujen_maara. Sen jälkeen ohjelma pyytää toistokäskyn avulla näin monta lukua ja laskee lopuksi niiden keskiarvon. Koska lu-kujen määrä pyydetään käyttäjältä, on ohjelmaan lisätty tarkistus, jolla vältetään ohjelman kaatuminen jakolaskussa siinä tapauksessa, että lukujen määrä on 0.

def main():

print "Lasken keskiarvon antamistasi kokonaisluvuista."

rivi = raw_input("Anna lukujen maara: ") lukujen_maara = int(rivi)

i = 0 summa = 0

while i < lukujen_maara:

rivi = raw_input("Anna seuraava luku: ") luku = int(rivi)

summa = summa + luku i = i + 1

if lukujen_maara > 0:

keskiarvo = 1.0 * summa / lukujen_maara print "Niiden keskiarvo on", keskiarvo else:

print "Et antanut yhtaan lukua."

main()

Lasken keskiarvon antamistasi kokonaisluvuista.

Anna lukujen maara: 5 Anna seuraava luku: 2 Anna seuraava luku: 4 Anna seuraava luku: 8 Anna seuraava luku: 8 Anna seuraava luku: 10 Niiden keskiarvo on 6.4

Tässäkin versiossa on kuitenkin se ongelma, että käyttäjän on etukäteen tiedettävä, montako lukua hän haluaa antaa. Jos lukuja on paljon, niiden laskeminen voi olla työlästä. Tällöin käyttäjän kannalta olisi parempi, että hän voisi antaa lukuja niin kauan kuin niitä riittää ja sitten kun luvut ovat lopussa, osoittaa jollain sopivalla arvolla lukujen loppuneen.

Jos esimerkiksi tiedetään, että kaikki annettavat luvut ovat suurempia tai yhtäsuu-ria kuin nolla, voi käyttäjä osoittaa lukujen loppuneen antamalla negatiivisen luvun.

Ohjelma kirjoitetaan niin, että se lopettaa lukujen lukemisen ensimmäisen tällaisen luvun saatuaan. Viimeiseksi luettua negatiivista lukua ei tällöin oteta mukaan kes-kiarvoa laskettaessa. Ohjelma toteutetaan siten, että ensimmäinen luku luetaan jo ennen toistokäskyn alkua ja toistokäskyä jatketaan niin kauan kuin viimeiseksi luet-tu luku on vähintään nolla. Koska luettavien lukujen määrää ei tiedetä eluet-tukäteen, on se laskettava.

def main():

print "Lasken keskiarvon antamistasi ei-negatiivisista kokonaisluvuista."

print "Lopeta negatiivisella luvulla."

lukujen_maara = 0 summa = 0

rivi = raw_input("Anna ensimmainen luku: ") luku = int(rivi)

while luku >= 0:

lukujen_maara = lukujen_maara + 1 summa = summa + luku

rivi = raw_input("Anna seuraava luku: ") luku = int(rivi)

if lukujen_maara > 0:

keskiarvo = 1.0 * summa / lukujen_maara print "Niiden keskiarvo on", keskiarvo else:

print "Et antanut yhtaan ei-negatiivista lukua."

main()

Esimerkki ohjelman suorituksesta:

Lasken keskiarvon antamistasi ei-negatiivisista kokonaisluvuista.

Lopeta negatiivisella luvulla.

Anna ensimmainen luku: 24 Anna seuraava luku: 12 Anna seuraava luku: 30 Anna seuraava luku: 13 Anna seuraava luku: -5 Niiden keskiarvo on 19.75