PERUSASIAT - TEHDÄÄN LASKIN

Nyt sinulla pitäisi olla asennettuna Python, Pygame ja Pycharm (tai jokin muu tekstieditori Pycharmin tilalla). Tässä osiossa opetellaan Pythonin alkeet: tulostus, muuttujien käyttäminen, syötteen kysyminen käyttäjältä sekä ehtolauseet. Näiden avulla teemme pieniä harjoituksia ja lopulta laskimen, jolle käyttäjä voi antaa kaksi lukua sekä haluamansa laskutoimituksen. Tulokseksi käyttäjä saa laskutoimituksen tuloksen.

Yleisiä ohjeita

Tehtävien kohdat on alussa numeroitu. Tee siis jokainen kohta, ja kysy neuvoa ohjaajalta jos et ymmärrä mitä kohdassa pyydetään tekemään. Useimmissa ohjelmointikäsitteissä ymmärrys syntyy vasta kun testaa materiaalin esimerkkejä, joten testaa kaikkia esimerkkejä itse. Mikäli et ymmärrä jotain kohtaa, kysy reippaasti neuvoa ohjaajalta.

Miten Python-koodia koodataan ja miten tietokone suorittaa sen?

Python-koodia koodataan kirjoittamalla tekstieditoriin. Tekstieditori on siis ohjelma, jonne kirjoitetaan tekstiä, ja ohjelmointiin tarkoitetuissa tekstieditoreissa tekstit voidaan myös ajaa koodina. Python on tulkittava kieli. Se tarkoittaa suurpiirteisesti sitä, että kun painetaan vihreää kolmiota joka ajaa ohjelman, Python-tulkki tulkitsee rivi kerrallaan koodisi tietokoneen ymmärtämään muotoon ja suorittaa koodirivin.

Tehtävä 1: Tulostus

Tulostamista Pythonissa voi ajatella hieman samankaltaisena asiana kuin Scratchissa sanomista. Pythonissa ei lähtökohtaisesti ole hahmoja kuten Scratchissa, pelihahmojen luonti vaatii monimutkaisempia komentoja joita opetellaan vasta myöhemmin. Tulostaminen tarkoittaa siis sitä, että ohjelma itse sanoo ulkopuolelleen jotain. Seuraavassa kuvassa on muistutuksen vuoksi esimerkki Scratchin sanomisesta. Kuvan jälkeen olevassa tehtävässä harjoitellaan tulostamista ja tehtävän myötä ymmärrät mitä tulostaminen tarkoittaa käytännössä.

Scratch Hei maailma

1. Luo uusi projekti ja anna sille nimeksi laskin. Pycharmissa tämä tapahtuu File -> New Project -valikkojen kautta.

tulostus Hei maailma

2. Luo projektiin uusi Python-tiedosto nimeltään laskin

3. Kirjoita tiedostoon allaoleva koodirivi. Pythonissa on erittäin tärkeää että lainausmerkit ja sulut ovat oikeassa järjestyksessä, joten jos ohjelma ei toimi niin tarkista että ne on kirjoitettu oikein.

print("Hei maailma")

4. Aja koodi joko Run -> Run 'laskin' -valikosta tai vihreästä kolmiosta painamalla. Vihreä kolmio on siis nappi joka löytyy editorista oikeasta yläreunasta. Seuraavassa kuvassa punaisella reunuksella vihreä nappi (eri nimisessä projektissa):

vihreä nappi



Ohjelman pitäisi tulostaa "Hei maailma". Tulostuksen pitäisi Pycharm-editorin alalaidassa olevassa tulostusikkunassa näyttää tältä:

tulostus Hei maailma

Muuttujat

Muuttuja on tietorakenne , johon voi säilöä arvon. Muuttuja on kuin laatikko, jolla on nimi, ja johon voi laittaa yhden esineen. Seuraavassa kuvassa esittelemme muuttujat, eli laatikot, joiden nimet ovat x ja muuttuja. Laatikot ovat tällä hetkellä tyhjiä.



Nyt laitamme laatikoihin sisältöä. Laatikko jonka nimi on x, saa sisällökseen numeron 1. Laatikko jonka nimi on paikka, saa sisällökseen Kumpula.



Pythonissa muuttujiin voi tallentaa mitä tahansa Pythonin tietotyyppejä, aivan kuin laatikoihinkin voi laittaa mitä tahansa. Tietotyyppejä ovat esimerkiksi luku ja merkkijono. Seuraavassa kahdessa kuvassa asetetaan ensin Scratchin muuttujiin x ja paikka samat arvot kuin edellisissä laatikoissa, sen jälkeen sama Pythonissa.





Pythonissa muuttujia ei tarvitse ensin erikseen luoda, vaan niiden luonti tapahtuu kun niihin ensimmäisen kerran asetetaan arvo. Ylläolevassa Python-koodissa ensimmäisellä rivillä asetetaan muuttujaan x arvo 1, ja toisella rivillä asetetaan muuttujaan paikka arvo Kumpula. Kun muuttujaan tallennetaan merkkijono, eli esimerkiksi Kumpula, merkkijonon ympärille pitää lisätä lainausmerkit. Myös numero voi olla merkkijono jos sen ympärille lisää lainausmerkit, esimerkiksi "12" on merkkijono.

Merkkijonon ympärillä on lainausmerkit!

Muuttujan voi myös tulostaa. Se edellyttää kuitenkin että muuttujaan on tallennettu jokin arvo aiemmin. Muuttujan tulostus tapahtuu näin:
print(paikka)

Paritehtävä 2: Muuttujan tulostus

Paritehtävä tarkoittaa sitä, että teet tehtävän parin kanssa. Jos et löydä vierestäsi paria niin kerro siis ohjaajalle että tarvitset parin. Pari tekee toisen version saman asian toteuttavasta ohjelmasta Scratchilla ja toisen version Pythonilla. Lopuksi pari testaa että ohjelma toimii ja näyttää sen ohjaajalle.

1. Määrittele muuttuja nimi, jolle annat arvoksi oman nimesi merkkijonona (eli lainausmerkit "" nimen ympärillä).
2. Tulosta tämän jälkeen (Scratchissa hahmo sanoo) tämä muuttuja. Tulostua pitäisi muuttujan sisältö, eli oma nimesi.

Laskutoimitukset

Tietokone osaa tehdä laskutoimituksia Python-koodin antamien ohjeiden mukaisesti. Harjoitellaan nyt tekemään yhteen-, kerto- ja vähennyslaskuja Pythonilla. Seuraavaksi ensin Scratch-versio lukujen 1 ja 4 summan sanomisesta, sitten Pythonilla saman tulostamisesta.

Scratch summa 1+4

print(1 + 4)

Paritehtävä 3: Tee laskutoimituksia

1. Tehkää ohjelma, joka Pythonissa tulostaa, Scratchissa sanoo kahden luvun tulon. Pythonissa kertomerkki on tähtimerkki *. Valitkaa luvut itse. Käyttäkää ylläolevaa 1 + 4 -esimerkkiä apuna.

2. Tehkää ohjelma, joka tulostaa, Scratchissa sanoo, edellisessä kohdassa käyttämiesi lukujen erotuksen.

Laskutoimituksen tuloksen tallentaminen muuttujaan

Laskutoimituksen tuloksen voi tallentaa muuttujaan ja käyttää muuttujaa myöhemmin. Seuraavassa esimerkissä tallennetaan lukujen 2 ja 1 erotus muuttujaan erotus sekä tulostetaan muuttuja sen jälkeen.

erotus = 2 - 1
print(erotus)

Tehtävä 4: Laskutoimituksen tulos muuttujaan

Tee ohjelma, joka laskee yhteenlaskun 1 + 5 tallentaen sen tuloksen muuttujaan summa. Tämän jälkeen tulosta muuttuja summa. Tulostuksen pitäisi näyttää seuraavalta:

Merkkijonon kysyminen käyttäjältä ja sen tallentaminen muuttujaan

Nyt osaamme tulostaa muuttujan sekä tekstiä. Otetaan seuraavaksi Scratch-vertaus käyttäjältä merkkijonon kysymiseen. Seuraavassa ensin Scratch-koodi ja sitten Python-koodi jossa sanominen on muutettu tulostamiseksi. Testaa Python-esimerkkiä.



vastaus = input("Anna merkkijono: ")
print(vastaus)

Luvun kysyminen käyttäjältä ja sen tallentaminen muuttujaan

Entä jos haluaisimme tehdä laskutoimituksen, jonka luvut riippuvat käyttäjästä? Haluaisimme siis, että käyttäjä voisi antaa kaksi lukua ja tietokone voisi laskea esimerkiksi niiden yhteenlaskun. Näin pääsisimme lähemmäksi osion lopullista tavoitettamme, laskimen koodaamista.

Tehtävä 5: Tee esimerkin mukaan

Seuraava koodi kysyy käyttäjältä kaksi lukua, asettaa ne muuttujiin x ja y, sekä tulostaa niiden summan. Kirjoita koodi tekstieditoriin, aja se ja testaa ohjelmaa. Sen jälkeen jatka lukemista ja tee ohjeen mukaan.

x = int(input("Anna ensimmäinen luku: "))
y = int(input("Anna toinen luku: "))
summa = x + y
print(summa)

Ylläoleva koodi näyttää monimutkaiselta siksi, että se kysyy lukuja eikä tekstiä. Koodi x = int(input("Anna ensimmäinen luku: ")) kysyy siis lukua ja tallentaa sen muuttujaan x, siinä missä koodi x = input("Anna ensimmäinen luku: ") kysyisi merkkijonoa ja tallentaisi sen muuttujaan x.

Poista nyt lukujen kysymisistä int( ) -ympärykset siten että koodisi näyttää sen jälkeen tältä:

x = input("Anna ensimmäinen luku: ")
y = input("Anna toinen luku: ")
summa = x + y
print(summa)

Testaa ohjelmaa. Mitä tulokselle käy, onko tulos oikein? Mistä arvelet sen johtuvan?
Vastaus on, että int( ) -koodilla ympäröity käyttäjältä luvun kysyminen kohtelee kysyttyä lukua lukuna, kun taas ilman int( ) -ympäryksiä oleva input-käsky kohtelee kysyttyä lukua merkkijonona. int() -komento muuttaa merkkijonon luvuksi. Ensimmäisessä esimerkissä siis lukujen yhteenlasku lasketaan oikein, toisessa esimerkissä vain yhdistetään kysytyt luvut niin että esimerkiksi luvuista 1 ja 2 tulisi tulokseksi "12".

Tehtävä 6: Tulosta käyttäjältä kysyttyjen lukujen osamäärä

Tee ohjelma, joka kysyy käyttäjältä kaksi lukua ja tulostaa niiden osamäärän. Kahden luvun jakolasku tehdään Pythonissa / -merkillä.

Ehdollisuus

Ehdollisuus tarkoittaa sitä, että ohjelmassa seuraavaksi suoritettavat käskyt riippuvat ohjelmoijan antamista ehdoista.

Seuraavista Python-esimerkeistä lähtien mukana on sisennyksiä koodissa. Sisennys siis tarkoittaa sitä, että seuraava koodirivi alkaa sisempää kuin edellinen. Pythonissa sisennykset on erittäin tärkeitä tehdä oikein esimerkkien mukaan, muuten koodin ajaminen ei onnistu. Sisennykset ovat ensimmäinen merkittävä Scratchin Pythonista erottava tekijä. Yhtä sisennettyä koodialuetta kutsutaan lohkoksi . Lohko-sanaa tullaan käyttämään myöhemmin.

Esimerkki ehdollisuudesta: Onko luku positiivinen

Otetaan esimerkiksi ohjelma, joka kysyy käyttäjältä lukua ja kertoo, onko luku positiivinen vai negatiivinen. Tässä esimerkissä 0 lasketaan mukaan positiiviseksi luvuksi.



luku = int(input("Anna luku: "))
if luku > -1:
    print("Luku on positiivinen")
else:
    print("Luku on negatiivinen")
Ohjelma siis toimii niin, että ensin kysytään käyttäjältä lukua ja tallennetaan se muuttujaan luku . Tämän jälkeen jos luku on suurempi kuin -1, tulostetaan "Luku on positiivinen" (if). Jos luku ei ole suurempaa kuin -1 eli on -1 tai pienempi kuin se, tulostetaan "Luku on negatiivinen" (else).

Huom! Else -lohko ei ole pakollinen. Mikäli ylläolevasta esimerkistä poistettaisiin else-lohko sisältöineen, ohjelma tulostaisi "Luku on positiivinen" jos luku on positiivinen, mutta jos luku on negatiivinen niin se ei tulostaisi mitään.

Paritehtävä 7: Vuositarkistus

Paritehtävä tarkoittaa sitä, että teet tehtävän parin kanssa. Jos et löydä vierestäsi paria niin kerro siis ohjaajalle että tarvitset parin. Pari tekee toisen version saman asian toteuttavasta ohjelmasta Scratchilla ja toisen version Pythonilla. Lopuksi pari testaa että ohjelma toimii ja näyttää sen ohjaajalle.

Tee ohjelma, joka kysyy käyttäjältä vuoden. Mikäli vuosi on jo mennyt (eli on pienempi kuin 2017), tulostetaan (Scratchissa hahmo sanoo) "Vuosi meni jo!", muuten tulostetaan: "Vuosi ei ole vielä mennyt.". Käytä kopioimaasi luvun positiivisuuden/negatiivisuuden ilmoittavaa esimerkkiä pohjana.

Suuruuden vertailuoperaattorit

Edellisessä tehtävässä käytettiin if-lauseessa pienempi kuin -operaattoria. Seuraavassa taulukossa kaikki vertailuoperaattorit ja niiden merkitykset. Huomaa että Pythonissa "pienempi tai yhtä suuri kuin" sekä "suurempi tai yhtä suuri kuin" toteutetaan yhdellä operaattorilla, kun Scratchissa tarvitaan "tai" väliin.
operaattori merkitys esimerkki sama esimerkki Scratchilla
< pienempi kuin 1 < 2
> suurempi kuin 1 > 2
== yhtä suuri kuin 1 == 2
<= pienempi tai yhtä suuri kuin 1 <= 2
>= suurempi tai yhtä suuri kuin 1 >= 2

Esimerkki ehdollisuudesta: Salasana

Seuraava esimerkkikoodi kysyy käyttäjältä syötettä merkkijonona . Mikäli syöte on sama kuin salasanamme "pythonkerho2017", paljastetaan salainen tieto kerhon ajankohdasta. Mikäli käyttäjän antama salasana on väärin, tulostetaan "Salasana väärin!".


      
 salasana = 'pythonkerho2017'
      
 syöte = input('Anna salasana: ')

      
 if syöte == salasana:
       
   print('Python-kerho keskiviikkoisin linkissä!')
       
 else:
      
    print('Salasana väärin!')

Monta else -lohkoa

Edellisessä tehtävässä ohjelma tarkisti, onko käyttäjän antama vuosi mennyt vai ei. Nyt haluamme tehdä tarkempaa analyysiä, kuinka kaukana menneisyydessä annettu vuosiluku on. Seuraavassa esimerkissä kerrotaan, onko vuosi mennyt, 2000-luvulla vai 1900-luvulla tai aiemmin. Kopioi esimerkki ja kokeile sitä.

luku = int(input('Anna vuosi: '))
if luku >= 2017:
    print('Vuosi ei ole vielä mennyt.')
elif luku < 2000:
    print('Vuosi on 1900-luvulla tai aiemmin')
else:
    print('Vuosi on 2000-luvulla')
Sitten saman asian tekevä esimerkki Scratchilla:




Huomataan että saman asian toteuttaminen on monimutkaisempaa Scratchilla. Scratchissa tarvitaan kaksi jos - muuten -rakennetta joista toinen menee toisen muuten -lohkoon. Pythonissa saman asian ajaa elif . Elif tarkoittaa else if eli jos muuten.

Tehtävä 8: Huomioidaan jos luku on nolla

Palaa katsomaan Onko luku positiivinen -esimerkkiä. Tehtävänäsi on toteuttaa ohjelma, joka kysyy käyttäjältä lukua, ja tulostaa "Luku on nolla", jos luku on 0, "Luku on positiivinen", jos luku on suurempi kuin nolla, ja "Luku on negatiivinen" jos luku on pienempi kuin nolla.

Laskin

Seuraava projekti on tehdä laskin, joka ottaa syötteinä kaksi lukua ja laskutoimituksen. Ohjelman tulee laskea näille luvuille käyttäjän antama laskutoimitus ja tulostaa lopputulos. Ohjelma tehdään kahdessa osassa seuraavissa tehtävissä.

Tehtävä 9: Laskin osa 1

Laskinohjelman alussa tulee kysyä käyttäjältä kaksi lukua, tallentaa ne muuttujiin, sekä kysyä laskutoimitus merkkijonona ja tallentaa se muuttujaan. Lukujen ja laskutoimituksen tulee näyttää seuraavalta ohjelmaa suoritettaessa:

Anna ensimmäinen luku: 1
    
 Anna toinen luku: 2
    
 Anna laskutoimitus joukosta +, -, * ja /: +
Huomioi, että luku kysytään käyttäjältä eri tavalla kuin merkkijono.

Tehtävä 9: Laskin osa 2

Nyt meillä on muuttujiin tallennettuina kaksi lukua lukuina sekä laskutoimitus merkkijonona . Seuraavaksi tarvitsemme ehdollisuutta, tavoitteena tunnistaa eri laskutoimitukset ja laskea lopputulos tunnistetun laskutoimituksen perusteella. Vinkkinä kannattaa katsoa kohtaa "Monta else -lohkoa" sekä seuraavaa kuvaa:

if muuttuja ==
Sinun täytyy siis toteuttaa ehdollisuus tunnistamaan eri laskutoimitukset, ja tulostaa laskutoimituksen lopputulos jokaisessa lohkossa erikseen, riippuen laskutoimituksesta. Testaa että ohjelmasi toimii seuraavanlaisesti (jokaisella laskutoimituksella oikea tulos)

Anna ensimmäinen luku: 1
    
 Anna toinen luku: 3
    
 Anna laskutoimitus joukosta +, -, * ja /: +
    
 4

Totuusarvot

Muuttuja voi olla merkkijonon ja luvun lisäksi myös totuusarvo. Totuusarvoja ovat True eli tosi ja False eli epätosi. Totuusarvoja itse asiassa käytetään jokaisessa if-lauseessa. Jokainen if-ehto saa koodia suoritettaessa totuusarvon sen perusteella onko ehto tosi vai ei, ja sen perusteella ohjelman suorituksessa päätellään siirrytäänkö ehdon sisällä olevaan lohkoon vai ei. Esimerkiksi ehto if 1 == 1 on aina tosi.
Muuttujaan voi sijoittaa totuusarvon seuraavilla tavoilla:

tosimuuttuja = True
epätosimuuttuja = False


Muuttujaan voi sijoittaa totuusarvon myös ehtona. Esimerkiksi seuraavan koodin tulostukseksi tulee True.

totuusarvo = 1 < 2
print(totuusarvo)

Loogiset operaattorit

Loogisilla operaattoreilla voidaan yhdistää monta ehtoa eri logiikoilla tai laskea totuusarvon negaatio. Negaatio tarkoittaa päinvastaista totuusarvoa kuin totuusarvo josta negaatio otetaan. Negaation voi laskea seuraavalla tavalla esimerkiksi muuttujasta nimeltään totuusarvo:

negaatio = not totuusarvo

Muita tällä kurssilla käsiteltäviä totuusarvoja ovat and ja or . Or-operaattorilla yhdistettävät totuusarvot ovat yhteensä tosi jos jompikumpi yhdistettävistä totuusarvoista on tosi. And-operaattorilla yhdistettävät totuusarvot ovat tosi jos molemmat yhdistettävät totuusarvot ovat tosi.
operaattori merkitys vastine Scratchissa
and Yhdistää kaksi totuusarvoa, tosi jos molemmat ovat tosi. Scratch and
or Yhdistää kaksi totuusarvoa, tosi jos jompikumpi tai molemmat ovat tosi. Scratch or
not Negaatio totuusarvosta eli päinvastainen totuusarvo Scratch not

Seuraavan ohjelman avulla voi selvittää, tarvitseeko lastenlipun Helsingin paikallisbusseissa.

ikä = int(input("Anna ikäsi: "))
if ikä >= 7 and ikä <= 16:
   print("Tarvitset lastenlipun")
else:
   print("Olet aikuinen tai niin pieni lapsi että voit matkustaa ilmaiseksi")


Paritehtävä 10: Alaikäinen

Paritehtävä tarkoittaa sitä, että teet tehtävän parin kanssa. Jos et löydä vierestäsi paria niin kerro siis ohjaajalle että tarvitset parin. Pari tekee toisen version saman asian toteuttavasta ohjelmasta Scratchilla ja toisen version Pythonilla. Lopuksi pari testaa että ohjelma toimii ja näyttää sen ohjaajalle.

Tee ohjelma, joka kysyy käyttäjältä iän ja kertoo (Pythonissa tulostaen, Scratchissa hahmo sanoo), onko käyttäjä alaikäinen, eli hänen ikänsä on vähintään 0 mutta alle 18.

Paritehtävä 11: Sekunnit vuodessa

Tee ohjelma, joka laskee, kuinka monta sekuntia on vuodessa. Voit olettaa, että vuodessa on 365 päivää (eli ei ole karkausvuosi). Tulosta lopputulos (Scratchissa hahmo sanoo).

Lisätehtävä: Parillinen vai pariton?

Tee ohjelma, joka kysyy käyttäjältä luvun ja ilmoittaa, onko se parillinen vai pariton. Vihje: Luvun jakojäännös 2:lla kertoo, onko luku parillinen vai pariton. Jakojäännos taas saadaan %-operaattorilla. Esimerkiksi luvun 5 jakojäännöksen 2:lla saa näin:

jakojäännös = 5 % 2

Lisätehtävä: Arvosanat ja pisteet

Tee ohjelma, joka ilmoittaa kurssiarvosanan seuraavan taulukon mukaisesti:

pistemääräarvosana
0–29hylätty
30–341
35–392
40–443
45–494
50–605

Esimerkkitulostuksia:

Anna pisteet [0-60]: 37

2
Anna pisteet [0-60]: 51

5

Lisätehtävä: Luvut suuruusjärjestyksessä

Tee ohjelma, joka kysyy käyttäjältä kolme lukua ja tulostaa ne suuruusjärjestyksessä.

Anna ensimmäinen luku: 8
Anna toinen luku: 1
Anna kolmas luku: 3

1
3
8

Toimiihan ohjelmasi myös, jos käyttäjä antaa monta kertaa saman luvun?

Lisätehtävä: Karkausvuosi

Vuosi on karkausvuosi, jos se on jaollinen 4:llä. Kuitenkin jos vuosi on jaollinen 100:lla, se on karkausvuosi vain silloin, kun se on jaollinen myös 400:lla.

Tee ohjelma, joka tarkistaa, onko vuosi karkausvuosi.

   Anna vuosi: 2011
   Vuosi ei ole karkausvuosi.
   
   Anna vuosi: 2012
   Vuosi on karkausvuosi.