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.