Kirjoittaminen ja lukeminen
Learning objectives
- Tutustut käsitteisiin ohjelma, lähdekoodi, syntaksi, ja muuttuja.
- Opit käyttämään ohjelmointiympäristöä.
- Opit käyttämään tekstin tulostamiseen ja lukemiseen käytettyjä komentoja.
- Osaat kirjoittaa ohjelman, joka tulostaa tekstiä.
- Osaat kirjoittaa ohjelman, joka lukee käyttäjältä tekstiä ja tulostaa luetun tekstin.
Ensiaskeleet ohjelmointiin otetaan hyvin usein tarkastelemalla ohjelmaa, joka tulostaa käyttäjälle viestin Hei maailma!
. Emme poikkea tästä hyväksi havaitusta tavasta.
Alla on käyttämämme ohjelmointiympäristö. Ohjelmointiympäristön vasemmassa laidassa on alue, johon ohjelman lähdekoodi kirjoitetaan. Oikeassa laidassa on alue, joka näyttää ohjelman tulostaman tekstin. Kokeile painaa sinistä Run
-nappia ja näet kun ohjelma suoritetaan. Mikäli et muuta ohjelmointiympäristössä olevaa ohjelmaa, ohjelman suorittaminen tulostaa tekstin Hei maailma!
.
Lähdekoodi (source code) on ohjelmointikielen sääntöjä noudattavaa ihmiselle luettavassa muodossa kirjoitettua tekstiä. Ohjelma (program) taas on lähdekoodista ohjelmointikielen kääntäjällä -- eli toisella ohjelmalla -- luotu versio, jonka tietokone voi suorittaa. Tässä materiaalissa termillä ohjelma usein viitataan yhteisesti lähdekoodiin sekä siitä luotavaan ohjelmaan.
Lähdekoodi käännetään ohjelmaksi erillisen ohjelman avulla. Tätä lähdekoodin ohjelmaksi kääntämiseen käytettävää ohjelmaa kutsutaan kääntäjäksi. Kun lähdekoodi on käännetty ohjelmaksi, voi sen suorittaa.
Ohjelmointiympäristöissä Run
-napin painaminen aiheuttaa tapahtumaketjun, missä ohjelmointiympäristöön kirjoitettu lähdekoodi käännetään ensin kääntäjän avulla ohjelmaksi, jonka jälkeen se suoritetaan.
Alla on materiaalin ensimmäinen kyselytehtävä. Painamalla tehtäväotsikkoa Mitä ohjelma tulostaa?
saat ensimmäisen kyselytehtävän näkyville. Lue kysymys ja valitse oikea vastaus. Paina tämän jälkeen "Tarkasta vastaus" -nappia.
Question not found or loading of the question is still in progress.
Käännettävät ja tulkattavat ohjelmointikielet
Tässä materiaalissa käyttämämme Dart-ohjelmointikieli on käännettävä ohjelmointikieli. Sen lisäksi, että Dart-kieliset ohjelmat voidaan kääntää ohjelmiksi, voidaan ne myös kääntää Javascript-kielelle. Tämä ominaisuus mahdollistaa Dart-ohjelmien suorittamisen selaimessa.
Kaikki ohjelmointikielet eivät ole käännettäviä, vaan osa niistä suoritetaan ohjelmointikielelle kehitetyn tulkin avulla. Tulkkia käyttävät ohjelmointikielet tulkitaan rivi riviltä, eikä koko lähdekoodia käännetä ohjelmaksi ennen ohjelman suoritusta. Tulkittavia ohjelmointikieliä ovat myös muunmuassa Python ja Ruby.
Hei maailma! -ohjelman lähdekoodi
Tarkastellaan viestin Hei maailma!
tulostavaa ohjelmaa. Ohjelman lähdekoodi on seuraava:
main() {
print('Hei maailma!');
}
Lähdekoodissa on sekä ohjelmointikielen vaatimia osia, että osia, joita ohjelmoija voi muokata ja lisätä. Jokaisella ohjelmalla on aloituspiste, eli kohta, josta ohjelman suoritus alkaa. Käyttämässämme ohjelmointikielessä ohjelman suoritus alkaa kohdasta, johon on kirjoitettu main()
. Tällä tavalla määritellään main
-niminen funktio, jota ohjelma voi kutsua.
Funktiot sisältävät lähdekoodia. Funktioon kuuluva alue eli lohko määritellään avaavalla ja sulkevalla aaltosululla -- avaava aaltosulku {
tulee heti tekstin main()
jälkeen, ja sulkeva aaltosulku }
funktioon kuuluvan lähdekoodin jälkeen. Yllä olevassa esimerkissämme main
-funktioon kuuluva lohko sisältää lauseen print('Hei maailma!');
.
Lause (statement) on yksittäinen tietyn tehtävän suorittava ohjelman osa. Lauseessa print('Hei maailma!');
kutsutaan ohjelmointikielen valmiiksi tarjoamaa print
-funktiota, joka tulostaa sille annettavan tekstin. Funktiolle print
annetaan tulostettava teksti sulkujen sisälle hipsuilla rajattuna, esim. 'Hei maailma!'
. Funktiokutsu päättyy puolipisteeseen ;
, joka tulee sulkujen jälkeen.
Lohkossa voi olla käytännössä rajaton määrä lauseita. Alla on tästä esimerkki. Alla ohjelmassa on kolme tulostuslausetta. Ensin tulostetaan merkkijono Hei
, sitten merkkijono maailma
, ja lopulta merkkijono !
. Kukin tulostus tapahtuu omalle rivilleen.
Lauseet suoritetaan yksi kerrallaan ylhäältä alaspäin. Laajemmin ajateltuna, tietokoneohjelmat eivät koskaan hyppää lauseiden yli ja ne suoritetaan aina annetussa järjestyksessä. Palaamme tähän ohjelman suoritusjärjestykseen ja toisaalta siihen vaikuttamiseen myöhemmin.
Alla on materiaalin ensimmäiset ohjelmointitehtävät. Painamalla tehtäväotsikkoa Hei maailma!
saat ensimmäisen ohjelmointitehtävän näkyviin. Esille tulee myös ympäristö, johon tehtävässä pyydetty ohjelma kirjoitetaan. Ympäristössä saattaa olla valmiina ohjelmakoodia, joka auttaa ohjelman kirjoituksessa. Napin painaminen tuo esille myös toisen napin, Lähetä tehtävä arvioitavaksi
, jota käytetään tehtävän palauttamiseen. Kun saat ensimmäisen tehtävän tehtyä ja lähetät sen arvioitavaksi, pääset heti tekemään myös toisen tehtävän.
Tiesitkö?
Skotlannin kansalliseläin on yksisarvinen. Voit myös suorittaa yllä käytetyssä ohjelmointiympäristössä olevan koodin painamalla CTRL+Enter.
Ohjelmointikielen syntaksi
Jokaisella ohjelmointikielellä on syntaksi eli lauseoppi, jota ohjelmointikieli noudattaa. Syntaksi määrittelee minkälainen ohjelmointikielen rakenne on ja miten ohjelmointikieltä tulee kirjoittaa. Ohjelmointikieliä on useita: tässä materiaalissa käytämme pääosin Dart-nimistä ohjelmointikieltä.
Edellä opimme kirjoittamaan ohjelman, joka tulostaa käyttäjälle viestin. Tarkastellaan tätä ohjelmaa vielä hieman.
main() {
print('Hei maailma!');
}
Yllä oleva ohjelma koostuu kolmesta osasta. Nämä osat ovat seuraavat:
- Ohjelman aloituskohdan määrittelevä funktio
main()
- Funktioon kuuluvan alueen määrittelevä lohko. Lohko aloitetaan avaavalla aaltosulkeella
{
ja lopetetaan sulkevalla aaltosulkeella}
. - Aaltosuluilla rajatun lohkon sisälle kirjoitettava lähdekoodi.
Alla olevasta ohjelmasta on jätetty pois komento print('Hei maailma!');
. Ohjelmassa on yhä aloituskohdan määrittelevä funktio sekä ohjelman alueen määrittelevä aaltosuluilla rajattu lohko.
main() {
}
Ohjelma toimii yhä, mutta sen suorittaminen ei tuota minkäänlaista tulostusta.
Mikäli ohjelman aloituskohdan määrittelevän main
-funktion tai lähdekoodin rajaavan lohkon jättää pois tai kirjoittaa väärin, ei ohjelma toimi. Alla olevassa ohjelmassa on kaksi erillistä virhettä.
- 1. Funktion "main" lohkon määrittelyyn käytettävä avaava aaltosulku puuttuu.
- 2. Tulostamiseen käytetyn "print"-funktiokutsun lopusta puuttuu puolipiste.
Yllä virheet ovat syntaksissa. Tämä tarkoittaa, että kirjoitettu ohjelma ei noudata ohjelmointikielen lauseoppia. Ohjelmointikieli noudattaa hyvin tarkkoja sääntöjä, joita ohjelmointia opiskeleva oppii hiljalleen noudattamaan.
Ohjelmointiympäristömme ilmoittaa lähdekoodissa olevista syntaksivirheistä, jotka kääntäjä tunnistaa kun lähdekoodia käännetään ohjelmaksi. Nämä ohjelmointiympäristön tarjoamat ilmoitukset tukevat ohjelmoinnin ja ohjelmointikielen sääntöjen harjoittelua. Ohjelmointiympäristön tarjoama palaute onkin avainroolissa kun ohjelmointiin harjaantuu yrityksen ja erehdyksen kautta.
Mikäli lähdekoodissa on yksi tai useampi syntaksivirhe, kääntäjä ilmoittaa virheestä. Tällöin lähdekoodin kääntäminen ohjelmaksi epäonnistuu.
Virheviestit tulevat ohjelmointiympäristön oikeaan alalaitaan. Kokeile poistaa alla olevasta esimerkistä puolipiste print
-funktiokutsun lopusta.
Kun poistat puolipisteen yllä olevasta esimerkistä, ohjelmointiympäristö näyttää virheen "Expected to find ';' - line 2". Suomeksi käännettynä virhe tarkoittaa, että ohjelmointikielen kääntäjä odotti puolipistettä riville 2.
error message
Expected to find ';' - line 2
Huomaa, että puolipisteiden, sulkujen, ja aaltosulkujen lisäksi myös kirjoitusasulla on merkitystä. Esimerkiksi funktiokutsu print
tulee kirjoittaa pienellä, aivan kuten myös funktio main
. Alla olevassa esimerkissä yritetään kutsua funktiota Print
.
Tällaista funktiota ei kuitenkaan ole olemassa. Ohjelmointiympäristö näyttää virheen "The function 'Print' isn't defined - line 2" eli funktiota Print
ei ole määritelty.
Alla on muutama kysymys ohjelmointiympäristön näyttämiin virheisiin liittyen. Selvitä kysymyksiin vastaus yllä olevaa ohjelmointiympäristöä käyttäen. Sekä tässä että myöhemmin, tavoitteena ei ole opetella syntaksia tai siihen liittyviä virheitä ulkoa, vaan tutustua virheisiin sekä niiden mahdollisiin syihin.
Question not found or loading of the question is still in progress.
Edellä nähdyt virheviestit ovat lähdekoodia ohjelmaksi kääntävän kääntäjän tuottamia. Kuten huomaamme, virheviestit eivät aina kuvaa ongelmaa kovin tarkasti, ja joskus virheviesti voi jopa johtaa ohjelmoijaa harhaan. Erittäin hyvien ja ohjelmointiongelman ratkaisussa auttavien virheviestien tuottaminen vaatisi tietoa siitä, mitä ohjelmoija yrittää tehdä. Tätä tietoa kääntäjällä ei ole, joten se tarkastaa vain noudattaako lähdekoodi ohjelmointikielen kielioppia.
Käyttäjän syötteen lukeminen
Tutustutaan seuraavaksi syötteen lukemiseen käyttäjältä. Jotta syötteen lukeminen toimii, tulee lähdekoodin ylälaidassa olla rivi import 'dart:io';
. Tämä rivi tuo ohjelmamme käyttöön tekstin lukemiseen tarvittavat apuvälineet -- mikäli riviä ei ole, ei syötteen lukeminen toimi.
Kun syötteen lukemiseen käytetyt apuvälineet ovat käytössä, onnistuu syötteen lukeminen lauseella var syote = stdin.readLineSync();
. Tässä oppimateriaalissa lauseen kutsuminen avaa tulostusalueelle tekstikentän, johon tekstin voi kirjoittaa. Kokeile ohjelman suorittamista.
Yllä oleva ohjelma kysyy käyttäjältä syötettä. Syötettä kysytään tässä oppimateriaalissa popup-ikkunan avulla. Kokeile suorittaa ohjelma painamalla "Run"-nappia. Kun ohjelma suoritetaan, avautuu ikkuna, johon voit kirjoittaa syötettä. Kun olet kirjoittanut syötteen, paina "OK"-nappia. Syötetty teksti näytetään tulostusalueella punaisella värillä värjättynä.
Todellisuudessa ohjelma ei tulosta syötettyä tekstiä. Punaisella värillä näkyvä tulostus on tätä oppimateriaalia varten luotu toiminnallisuus, jonka avulla näet syöttämäsi tekstin.
Vaikka ohjelma ei todellisuudessa tulosta syötettyä tekstiä, ohjelma kuitenkin lukee syötteen ja ottaa sen talteen. Näemme yllä olevassa ohjelmassa ensimmäistä kertaa muuttujan. Muuttuja (variable) on tiedon säilömiseen ja käsittelyyn käytettävä asia. Muuttujaan voi asettaa arvon, ja siellä olevaa arvoa voi katsoa.
Tietokone pitää kirjaa ohjelman muuttujista. Jokaiseen muuttujaan liittyy nimi ja arvo. Muuttuja lisätään kirjanpitoon kun se esitellään. Esittelyn yhteydessä muuttujaan voidaan asettaa myös arvo. Kun muuttuja on esitelty, siinä olevaan arvoon voidaan viitata muuttujan nimellä. Yllä olevassa kuvassa tietokoneen muistissa on yksi muuttuja. Muuttujan nimi on "syote" ja siihen on tallennettu arvo "hei maailma".
Muuttujan esittely (eli luominen) tapahtuu variable-nimestä juontuvalla avainsanalla var
, jonka jälkeen tulee välilyönti ja muuttujalle annettava nimi. Muuttujan nimi on ohjelmoijan päätettävissä, mutta se ei saa sisältää välilyöntejä tai erikoismerkkejä kuten pilkkuja tai pisteitä. Muuttujan nimeä seuraava yhtäsuuruusmerkki kuvaa arvon asettamista -- luotavaan muuttujaan asetetaan yhtäsuuruusmerkin oikealla puolella olevan ohjelmakoodin tuottama arvo, eli tässä tapauksessa käyttäjältä luettava merkkijono.
Lause var syote = stdin.readLineSync();
tarkoittaa kokonaisuudessaan seuraavaa: luo muuttuja nimeltä syote ja aseta siihen käyttäjältä luettu teksti.
Muuttujaan asetettua tietoa voi käyttää osana ohjelmaa. Muuttujan arvoon eli muuttujan sisältöön viittaaminen print
-funktiolla tehtävässä tulostuksessa onnistuu lisäämällä dollarimerkki $
ja muuttujan nimi osaksi tulostettavaa tekstiä. Mikäli muuttujan nimi olisi muuttuja
, voi sen sisältämän arvon tulostaa lauseella print('$muuttuja');
.
Kun tulostettavassa merkkijonossa on dollarilla alkava merkkijono, ohjelma etsii muuttujalistasta dollarilla alkavaa merkkijonoa vastaavaa muuttujaa. Mikäli muuttuja löytyy, vaihdetaan merkkijonon paikalle muuttujan arvo. Katso tällaisen ohjelman suoritus alla olevasta videosta.
YouTube-video
Tämä sivusto käyttää YouTube-videoita. Lue lisätietoja YouTube-videoiden käytöstä YouTuben Terms of Service-sivulla. Salli YouTube-videoiden näyttäminen, jotta voit katsoa videoita.
Question not found or loading of the question is still in progress.
Alla olevassa esimerkissä luetaan käyttäjältä tekstiä, joka asetetaan muuttujaan nimeltä syote
. Tämän jälkeen käyttäjän syöttämä teksti tulostetaan.
Yllä olevan ohjelman tulostus riippuu käyttäjän syöttämästä tekstistä. Mikäli käyttäjä syöttää tekstin hei
, on ohjelman tulostama toinen rivi Syötit tekstin hei
. Vastaavasti, mikäli käyttäjä syöttää tekstin oho!
, on ohjelman tulostama toinen rivi Syötit tekstin oho!
.
Kuten edellä, myös tässä ohjelman kirjoitusasulla on väliä. Tarkastellaan tätä muutaman kysymyksen kautta.
Question not found or loading of the question is still in progress.
Huomaa, että muuttujan arvon voi tulostaa vain mikäli muuttuja on luotu ennen sen tulostamista. Alla olevassa esimerkissä muuttuja luodaan vasta tulostamisen jälkeen, eikä ohjelma toimi.
Ohjelmointiympäristö kertoo, että kyseisessä ohjelmassa on virhe. Virheilmoitus on "Local variable 'syote' can't be referenced before it is declared - line 5" eli muuttujaa syote
ei voi käyttää ennen kuin se on luotu.
Syöte tulostusesimerkeissä
Tulostusesimerkeissä käyttäjän antama syöte esitetään punaisella värillä. Punaisella värillä näytetty teksti on sellaista, jota oman ohjelmasi ei tule tulostaa. Ohjelmointiympäristö tulostaa syötetyn tekstin punaisella värillä automaattisesti ohjelmoinnin oppimisen tueksi.
Konkreettisissa tulostuskentissä tämä näyttää seuraavalta. Alla olevassa esimerkissä ohjelma kysyy käyttäjältä syötettä, ja käyttäjä syöttää luvun 10. Tätä seuraa tulostus, missä ohjelma käyttää käyttäjän syöttämää lukua.
program output
Kirjoita luku. 10 Luettiin luku 10
Monta muuttujaa
Ohjelmassa voi olla monta muuttujaa, mutta jokaisella niistä tulee olla oma uniikki nimi. Alla olevassa esimerkissä on luotu ohjelma, missä käyttäjältä kysytään ensin nimeä ja sitten harrastusta. Tämän jälkeen ohjelma tulostaa viestin, jossa käytetään kumpaakin näistä muuttujista.
Syötteillä Eliel
ja piirtäminen
ohjelman muistiin luotavat muuttujat ja niiden arvo ovat seuraavat.
Yllä olevassa ohjelmassa nimen 'Eliel' ja harrastuksen 'piirtäminen' syöttämisen jälkeen ohjelman muistissa on kaksi muuttujaa. Muuttujaan nimeltä nimi liittyy arvo 'Eliel' ja muuttujaan nimeltä harrastus liittyy arvo 'piirtäminen'.
Kun ohjelma suoritetaan, se kysyy käyttäjältä kahta merkkijonoa (käyttäjän syöttämät merkkijonot kuvattu alla punaisella). Yllä olevassa kuvassa kuvataan muistin tilanne syötteiden lukemisen jälkeen, olettaen että käyttäjä syöttää merkkijonot Eliel
ja piirtäminen
(kuten alla). Kun ohjelmassa suoritetaan muuttujiin viittaava tulostuslause, vaihdetaan tulostettavan merkkijonon kohtien $nimi
ja $harrastus
paikalle muuttujien nimi
ja harrastus
arvot.
Lopulta tulostetaan Hei! Olen Eliel. Harrastukseni on piirtäminen.
.
program output
Tervehdysgeneraattori! Syötä nimesi. Eliel Syötä harrastuksesi! piirtäminen Tervehdyksesi: Hei! Olen Eliel. Harrastukseni on piirtäminen.
Tekoälyllä luotuja ohjelmointitehtäviä
Kurssimateriaalin ensimmäisissä osissa on tarjolla tekoälyllä luotuja ohjelmointitehtäviä. Voit kokeilla tällaisia tehtäviä alla. Valitse mieleisesi teema (Theme), harjoiteltava käsite (Concept), ja vaikeus (Difficulty). Paina tämän jälkeen "Get Exercise"-nappia.
Kurssialusta lataa tämän jälkeen tehtävänannon ja tehtävän, ja tarjoaa ohjelmointiympäristön tehtävän tekemiseen. Kun saat tehtävän valmiiksi, pyydämme sinulta palautetta ohjelmointitehtävästä.
Voit tehdä tekoälyllä luotuja tehtäviä niin paljon kuin haluat. Tehtävät ja tehtävänannot ovat toistaiseksi tarjolla vain englanniksi.
Loading exercises...
Hi! Please help us improve the course!
Please consider the following statements and questions regarding this part of the course. We use your answers for improving the course.
I can see how the assignments and materials fit in with what I am supposed to learn.
I find most of what I learned so far interesting.
I am certain that I can learn the taught skills and knowledge.
I find that I would benefit from having explicit deadlines.
I feel overwhelmed by the amount of work.
I try out the examples outlined in the materials.
I feel that the assignments are too difficult.
I feel that I've been systematic and organized in my studying.
How many hours (estimated with a precision of half an hour) did you spend reading the material and completing the assignments for this part? (use a dot as the decimal separator, e.g 8.5)
How would you improve the material or assignments?