Joitakin esimerkkiohjelmia

Huoneen pinta-ala

Seuraava ohjelma pyytää käyttäjältä suorakulmion muotoisen huoneen pituuden ja leveyden. Se laskee ja tulostaa huoneen pinta-alan. Esimerkistä nähdään, kuinka käyttäjältä voidaan lukea samassa ohjelmassa useampi arvo. Kukin luettu arvo (sen jälkeen, kun se on muutettu desimaaliluvuksi) tallennetaan omaan muuttujaansa.

def main():
    rivi = input("Anna huoneen leveys metreina: ")
    leveys = float(rivi)
    rivi = input("Anna huoneen pituus metreina: ")
    pituus = float(rivi)
    pinta_ala = leveys * pituus
    print("Huoneen pinta-ala on", pinta_ala, "neliometria")

main()

Alla on esimerkki ohjelman suorituksesta.

Anna huoneen leveys metreina: 4.5
Anna huoneen pituus metreina: 3.8
Huoneen pinta-ala on 17.1 neliometria

Tähänastisissa esimerkkiohjelmissa on käytetty lyhyissä Python-ohjelmissa varsin yleistä tapaa, jossa käyttäjälle annettava kehote (pyyntö) on samalla rivillä kuin mille käyttäjä kirjoittaa oman syötteensä (vastauksen ohjelman kysymykseen). Tällä kurssilla tehtävissä harjoitustehtävissä tavan käyttö aiheuttaa kuitenkin ongelmia, koska harjoitustehtävät automaattisesti tarkastava A+-järjestelmä tutkii ohjelmien tulostetta rivi kerrallaan. Ohjelman tulostuksen ja käyttäjän syötteen erottaminen tarkistuksessa on järjestelmälle ongelmallista, jos ohjelman tuloste ei ole välimerkkejä myöten juuri annetun mallin mukainen.

Turhien ongelmien välttämiseksi tällä kurssilla kirjoitetaan sen vuoksi palautettavat harjoitustehtävät niin, että ohjelman tulostukset päätetään aina rivinvaihtoon ja käyttäjä kirjoittaa mahdollisen syötteensä vasta seuraavalle riville. Käskyn input sulkujen sisällä olevan tulostettavan merkkijonon saa päättymään rivinvaihtoon sillä, että lisää merkkijonon loppuun erikoismerkin \n. Tämä merkki siis kirjoitetaan painamalla näppäimistöllä ensin näppäintä \ ja näppäintä n, mutta merkkijonossa yhdistelmä käsitetään yhdeksi merkiksi, joka aiheuttaa rivinvaihdon merkkijonoa tulostettaessa. Käsky print lisää itse rivinvaihdon tulostuksen jälkeen, joten print-käskyä käytettäessä rivinvaihtoa ei tarvitse lisätä.

Alla pinta-alan laskeva ohjelma kirjoitettuna uudelleen niin, että kaikki ohjelman tulosteet päättyvät rivinvaihtoon ja käyttäjä syöte tulee omalle rivilleen.

def main():
    rivi = input("Anna huoneen leveys metreina.\n")
    leveys = float(rivi)
    rivi = input("Anna huoneen pituus metreina.\n")
    pituus = float(rivi)
    pinta_ala = leveys * pituus
    print("Huoneen pinta-ala on", pinta_ala, "neliometria")

main()

Esimerkki ohjelman suorituksesta:

Anna huoneen leveys metreina.
3.7
Anna huoneen pituus metreina.
5.3
Huoneen pinta-ala on 19.61 neliometria

Rivinvaihtojen lisääminen ei ole mikään Python-ohjelmoinnin vaatima toimenpide, vaan ne on lisätty ainoastaan tällä kurssilla käytettävän automaattisen tarkastusjärjestelmän toiminnan helpottamiseksi. Jatkossa esitettävissä esimerkeissä osassa on tulostuksiin lisätty rivinvaihdot, osassa ei. Kurssilla palautettavissa harjoitustehtävissä rivinvaihdot on kuitenkin syytä olla aina mukana (silloin, kun ei tulosteta print-käskyllä, joka lisää itse rivinvaihdon).

Puhelun hinta

Monessa matkapuhelinliittymässä puhelun hinta on koostuu aloitusmaksusta, joka ei riipu puhelun kestosta, sekä puhelun kestosta riippuvasta minuuttihinnasta. Seuraava ohjelma pyytää käyttäjältä aloitusmaksun, minuuttihinnan sekä puhelun keston minuutteina ja laskee puhelun hinnan. Yksinkertaisuuden vuoksi puhelun kesto annetaan desimaalilukuna. Toinen vaihtoehto olisi antaa kesto kokonaisina minuutteina ja sekunteina, joista sitten laskettaisiin vastaava kesto desimaalilukuna.

def main():
    print("Ohjelma laskee matkapuhelun hinnan.")
    rivi = input("Anna puhelun aloitusmaksu.\n")
    aloitusmaksu = float(rivi)
    rivi = input("Anna puhelun minuuttihinta.\n")
    minuuttihinta = float(rivi)
    rivi = input("Anna puhelun kesto minuutteina.\n")
    kesto = float(rivi)
    hinta = aloitusmaksu + kesto * minuuttihinta
    print("Puhelun hinta on", hinta, "euroa.")

main()

Esimerkki ohjelman suorituksesta:

Ohjelma laskee matkapuhelun hinnan.
Anna puhelun aloitusmaksu.
0.049
Anna puhelun minuuttihinta.
0.079
Anna puhelun kesto minuutteina.
8.5
Puhelun hinta on 0.7205 euroa.

Aikamuunnoksia

Välillä tulee vastaa tilanteita, joissa pitempi aika pitää ilmaista sekunteina esimerkiksi erilaisia laskutoimituksia varten. Tämä muunnos on helppo totetuttaa pienellä tietokoneohjelmalla. Toisaalta monesti on vaikea hahmottaa suoraan, kuinka pitkä aika on esimerkiksi 15600 sekuntia. Kun saman ajan ilmaisee tuntien ja minuuttien avulla, tulee aikajakson pituus heti selväksi. Myös tämä muunnos on helppo laskea pienen tietokoneohjelman avulla.

Ensimmäinen esimerkkiohjelma muuttaa tunteina, minuutteina ja sekunteina annetun aikamäärän pelkiksi sekunneiksi. Oletetaan, että aika annetaan sekuntien tarkkuudella (sekuntien osia ei käsitellä), jolloin nyt voidaan käyttää kokonaislukutyyppiä int annettujen lukujen käsittelyyn.

def main():
    print("Tama ohjelma muuttaa annetun aikajakson pituuden sekunneiksi.")
    rivi = input("Anna aikajakson tunnit.\n")
    tunnit = int(rivi)
    rivi = input("Anna aikajakson minuutit.\n")
    minuutit = int(rivi)
    rivi = input("Anna aikajakson sekunnit.\n")
    sekunnit = int(rivi)
    aika_sekunteina = tunnit * 3600 + minuutit * 60 + sekunnit
    print("Aikajakson pituus on", aika_sekunteina, "sekuntia.")

main()

Esimerkki ohjelman suorituksesta:

Tama ohjelma muuttaa annetun aikajakson pituuden sekunneiksi.
Anna aikajakson tunnit.
4
Anna aikajakson minuutit.
37
Anna aikajakson sekunnit.
14
Aikajakson pituus on 16634 sekuntia.

Muunnos sekunneista tunneiksi, minuuteiksi ja sekunneiksi on vähän monimutkaisempi. Tässä voidaan kuitenkin käyttää hyväksi sitä, että käsitellään kokonaislukuja. Kuten aikaisemmin on kerrottu, Pythonissa on tavallisen jakolaskuoperaattorin / vaihtoehtona operaattori //, jota käytettäessä kahden kokonaisluvun jakolaskun tulos on kokonaisluku, johon on otettu mukaan vain jakolaskun tuloksen kokonaisosa. Mitään pyöristyksiä ei siis tehdä. Näin johonkin sekuntimäärään sisältyvät täydet tunnit saadaan selville jakamalla tämä sekuntimäärä 3600:lla. Näiden tuntien jälkeen ylijääneet sekunnit saadaan taas selville ottamalla edellisen jakolaskun jakojäännös, joka voidaan tehdä %-operaattorin avulla. Vastaavalla tavalla saadaan selville jäljelle jääneisiin sekunteihin sisältyvät kokonaiset minuutit ja sekunnit.

def main():
    rivi = input("Anna aikajakson pituus sekunteina.\n")
    pituus_sekunteina = int(rivi)
    tunnit = pituus_sekunteina // 3600
    jaannossekunnit = pituus_sekunteina % 3600
    minuutit = jaannossekunnit // 60
    sekunnit = jaannossekunnit % 60
    print("Pituus on", tunnit, "h", minuutit, "min", sekunnit, "s.")


main()

Esimerkki ohjelman suorituksesta:

Anna aikajakson pituus sekunteina.
18756
Pituus on 5 h 12 min 36 s.

Alla on toinen esimerkki ohjelman suorituksesta. Tästä nähdään, että ohjelma ei osaa jättää pois tuntia, minuutteja tai sekunteja siinä tapauksessa, että jokin niistä on nolla. Ohjelman tulostus ei ole tässäkään tapauksessa virheellinen, mutta se voisi olla lyhyempi. Nollien poisjättämiseen tarvitaan kuitenkin valintakäskyä, joka opetetaan vasta seuraavassa luvussa.

Anna aikajakson pituus sekunteina.
7218
Pituus on 2 h 0 min 18 s.