OHJ-1101 Ohjelmointi 1e



Samankaltaiset tiedostot
Java-kielen perusteet

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

Kääntäjän virheilmoituksia

13. Loogiset operaatiot 13.1

Ohjelmoinnin perusteet Y Python

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin perusteet Y Python

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

13. Loogiset operaatiot 13.1

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto


OHJ-1100 Ohjelmointi I

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

etunimi, sukunimi ja opiskelijanumero ja näillä

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Muuttujien roolit Kiintoarvo cin >> r;

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ehto- ja toistolauseet

Ohjelmoinnin perusteet Y Python

12. Javan toistorakenteet 12.1

Tietotyypit ja operaattorit

Ohjelmoinnin peruskurssi Y1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

12. Javan toistorakenteet 12.1

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Python-ohjelmointi Harjoitus 5

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin perusteet Y Python

3. Muuttujat ja operaatiot 3.1

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat ja operaatiot

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

11. Javan toistorakenteet 11.1

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet

Osoitin ja viittaus C++:ssa

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

5/20: Algoritmirakenteita III

12 Mallit (Templates)

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

16. Ohjelmoinnin tekniikkaa 16.1

ITKP102 Ohjelmointi 1 (6 op)

16. Ohjelmoinnin tekniikkaa 16.1

ITKP102 Ohjelmointi 1 (6 op)

5. HelloWorld-ohjelma 5.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin perusteet Y Python

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

11. Javan valintarakenteet 11.1

Ohjelmointi 1 Taulukot ja merkkijonot

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Sisällys. 15. Lohkot. Lohkot. Lohkot

Ohjelmoinnin perusteet, syksy 2006

Tutoriaaliläsnäoloista

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Ohjelmoinnin peruskurssi Y1

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

5. HelloWorld-ohjelma 5.1

Ohjelmoinnin peruskurssi Y1

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Ohjausrakenteet. Valinta:

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Harjoitus 3 (viikko 39)

Ohjelmoinnin peruskurssi Y1

Ohjelmointiharjoituksia Arduino-ympäristössä

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Johdatus Ohjelmointiin

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Zeon PDF Driver Trial

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Ohjelmoinnin perusteet Y Python

11. Javan valintarakenteet 11.1

15. Ohjelmoinnin tekniikkaa 15.1

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

4. Lausekielinen ohjelmointi 4.1

Palautetta viime luennosta

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Transkriptio:

OHJ-1101 Ohjelmointi 1e Essi Lahtinen 2008-2009

OHJ-1101 Ohjelmointi 1e 2008-09 1 Kurssin järjestelyt 20082009 Kurssin vastuuhenkilö Essi Lahtinen (essi.lahtinen@tut., huone: TE210, puh. 040 8490717) vastaa kurssin sisällöstä, materiaalista, korvauksista ja luennoi toiselle ryhmälle. Toisen luentoryhmän luennoijana toimii Mikko Tiusanen (mikko.tiusanen@tut., huone: TF207, puh: 040 8490739). Kurssivääpeli Teemu Erkkola (ohj1e@cs.tut., huone: TE212, puh: 03 3115 3831) vastaa kaikista kurssiin liittyvistä käytännön järjestelyistä (harjoitusryhmät, harjoitustöihin liittyvät asiat, jne.). Lisäksi kurssin henkilökuntaan kuuluu 12 mukavaa ja avuliasta assistenttia, jotka ohjaavat viikkoharjoituksia ja harjoitustöitä. Kurssin henkilökunnan vastaanottoajat löytyvät kurssin nettisivulta.

OHJ-1101 Ohjelmointi 1e 2008-09 2 Tiedottaminen kurssilla Kurssin asioista tiedotetaan ensisijaisesti uutisryhmässä tut.ot.ohj1e, jota kannattaa seurata, jos haluaa selvitä kurssista mahdollisimman helpolla. Uutisryhmien lukemista kerrataan vielä ensimmäisessä viikkoharjoituksessa. Kysy neuvoa harjoitusassistentiltasi. Kurssin kotisivulla http://www.cs.tut./ ohj1e/ on pääasiassa vain kurssin keston ajan muuttumatonta tietoa. Kotisivu kannattaa lukea perusteellisesti läpi, jos haluaa välttää höynäytetyksi tulemisen.

OHJ-1101 Ohjelmointi 1e 2008-09 3 Kurssin suorittaminen Kurssi muodostuu seuraavista osista: Luennot (2. periodilla 4 h/vk ja 3. periodilla 2 h/vk) Harjoitukset (2. ja 3. periodeilla 2 h/vk) Palautustehtävät (yhteensä 4 kpl, joista 3 kpl pakollisia), henkilökohtaisia Harjoitustyö (sisältää välipalautuksen), henkilökohtainen ja pakollinen Kaksi välikoetta tai tentti, pakollinen Luentoja on 36 h ja harjoituksia 22 h, mikä on yhteensä 48 h. Kurssista saa 4 op, joka merkitsee n. 104 h työtä. Muihin hommiin menee varmaan aika paljon aikaa! Ohjelmoimaan oppii vain ohjelmoimalla.

OHJ-1101 Ohjelmointi 1e 2008-09 4 Kurssin arvostelu Kurssin arvosana määräytyy kokonaispistemäärän (= suorituspisteet + bonuspisteet) perusteella. Suorituspisteitä saa tentistä tai välikokeista ( n. 30) ja harjoitustyöstä (3). Bonuspisteitä saa aktiivisesta osalistumisesta harjoituksiin (3). Suorituspisteet vaikuttavat arvosanarajojen määräytymiseen. Bonuspisteillä voi korottaa saamaansa arvosanaa maksimissaan yhdellä. (Hylättyä suoritusta ei voi korottaa.)

OHJ-1101 Ohjelmointi 1e 2008-09 5 Materiaali Kurssin pruju löytyy nettisivulta ja halutessaan sen voi tulostaa paperiversioksi TiTe-killan monistuskoneelta. Pruju on tarkoitettu luentojen tueksi, ei itseopiskeluun. Jos et aio käydä luennoilla, hanki jokin C++-opus. Tällaiseksi sopii esimerkiksi: Walter Savitch: Problem Solving with C++, The Object of Programming tai Jan Skansholm: C++ From the Beginning Epätoivoisesti englanninkieltä pelkäävät voivat kokeilla esim. hiukan kevyempää Päivi Hietanen: C++ ja olio-ohjelmointi C++-perusteos, järeää luettavaa unettomille ja kielestä enemmän kiinnostuneille, enemmän referenssi, kuin oppikirja Bjarne Stroustrup: The C++-programming language (saatavana myös suomenkielisenä)

OHJ-1101 Ohjelmointi 1e 2008-09 6 Kurssin tavoitteet ja motivaatio Tavoitteena on selvittää ohjelmoinnin peruskäsitteet ja yksinkertaiset tietorakenteet ohjelmanteon vaiheet ja ohjelman suorittaminen perustietämys C++-ohjelmointikielestä Kurssi ei ole teoriapainotteinen, vaan se antaa opiskelijalle käytännön perustaidot pienten ohjelmien suunnitteluun ja kirjoittamiseen C++-kielellä. Ammattiohjelmoijia ei kurssilla synny. Jokaisen DI:n tulisi nykyään tietää edes jotain ohjelmoinnista. Kurssilla opitut taidot ovat hyödyllisiä joillain myöhemmillä ammattiainekursseilla (osastosta riippumatta). Edellisvuoden kurssipalauteen mukaan esim. Matlabin tehokas käyttäminen on helpompaa kun ohjelmoinnin peruskäsitteet ovat hallussa. Jos kiinnostus ohjelmointiin herää kurssin kuluessa, voi ohjelmoinin opiskelua jatkaa kurssilla OHJ-1151 Ohjelmointi 2e (tai OHJ-1150 Ohjelmointi 2).

OHJ-1101 Ohjelmointi 1e 2008-09 7 C++:sta Kurssin esimerkkikieli on C++, mutta tarkoitus on perehtyä ohjelmointiin yleisestikin. C++ on vain esimerkkikieli. Kaikkia kielen piirteitä ei käydä läpi. Kielen syvällisempiä piirteitä käsitellään kursseilla OHJ-1400 Olio-ohjelmoinnin peruskurssi ja OHJ-1450 Olio-ohjelmoinnin jatkokurssi C++ ei ole kaikin puolin paras mahdollinen opetuskieli. Se kärsii jonkin verran menneisyyden painolastista, koska se pohjautuu C-kieleen. Huonoja piirteitä ovat mm. syntaksin kryptisyys, erilaisten suojaverkkojen puuttuminen ja jyrkkä oppimiskäyrä. Ohjelmoinnin perusjutut hukkuvat helposti yksityiskohtien alle. C++ on joustava ja tehokas ammattilaisen työkalu niille, jotka tietävät mitä tekevät.

OHJ-1101 Ohjelmointi 1e 2008-09 8 Kurssin ohjelmointiympäristöstä Kurssin ohjelmointiympäristönä käytetään TTY:n proa-klusteria. Kääntäjänä käytetään komentorivipohjaista tutg++:aa. Kurssilla ei opeteta käyttämään mitään graasta ohjelmointiympäristöä, koska komentorivipohjainen ympäristö tuo ohjelman kehityksen eri vaiheet selkeämmin esille. Graasta ympäristöä on helppo oppia käyttämään, jos hallitsee komentorivipohjaisen. Toisinpäin opetteleminen ei yleensä ole yhtä helppoa. Tietotekniikan ammattilainen hallitsee työnsä ympäristössä kuin ympäristössä, myös ei-graasessa. Itse tietenkin saa koodailla ihan missä ympäristössä haluaa.

OHJ-1101 Ohjelmointi 1e 2008-09 9 Esimerkki: Tavuttaminen Ohjelmoinnista on jo saatu yleiskäsitys kurssilla OHJ-1010 Tietotekniikan perusteet. Tällä kurssilla sanalla ohjelmointi tarkoitetaan tietokoneen ohjelmointia. Aloitamme perehtymisen ohjelmoinnin ongelmiin ja vaiheisiin pienen esimerkin avulla: suunnitellaan pientä tietokoneohjelmaa, joka tavuttaa suomenkielistä tekstiä. Esimerkissä ei ole tarkoitus keskittyä tavutussääntöjen opettelemiseen vaan ajattelu- ja toimintatapaan, jota ohjelmoija tarvitsee. Kiinnitä huomiosi muuhunkin kuin yksityiskohtiin.

OHJ-1101 Ohjelmointi 1e 2008-09 10 Äidinkielen kirja kertoo, että suomen kielen tavuttaminen seuraa melko suoraviivaisesti seuraavia sääntöjä: Konsonanttisääntö: Jos tavuun kuuluvaa vokaalia seuraa yksi tai useampia konsonantteja, joita vielä seuraa vokaali, tavuraja sijoittuu välittömästi ennen viimeistä konsonanttia. lef-fas-sa ki-vaa kah-del-le: tra-giik-kaa se-kä hork-ka-ti-lo-ja Vokaalisääntö: Jos tavun ensimmäistä vokaalia seuraa toinen vokaali, niiden väliin tulee tavuraja, ellei a) edellinen vokaali ole sama kuin jälkimmäinen (pitkä vokaali). b) kysymyksessä ole jokin diftongi. lu-en-to Aa-si-an kää-pi-ö-puo-lu-eis-ta Diftongisääntö: Jos tavun kuuluvaa diftongia tai pitkää vokaalia seuraa vokaali, tähän väliin tulee aina tavuraja. raa-is-tu-nut maa-il-ma, liu-ot-ti-met lau-an-tai-na tau-ot-ta leu-an al-la Poikkeuksiakin löytyy: de-mo-kra-ti-a, kai-vos-auk-ko, jne, jne. Diftongit ovat: ai, ei, oi, ui, yi, äi, öi, au, eu, ey, ie, iu, ou, uo, yö, äy tai öy.

OHJ-1101 Ohjelmointi 1e 2008-09 11 TiTePK:sta muistamme, että tietokone ei osaa tavuttaa noin ylimalkaisten tavutussääntöjen perusteella, vaan sitä varten pitää kehittää algoritmi. Algoritmin pitää olla: 1. yksikäsitteinen (ei tulkittavissa väärin) 2. yksityiskohtainen (tyhmäkin osaa seurata) 3. saavuttaa tavoitteensa (eli toimii oikein) 4. määrää toimenpiteiden suoritusjärjestyksen (seuraus kohdasta 1) 5. sisältää äärellisen määrän toimenpiteitä (muuten tehtävä ei tulisi suoritetuksi, seuraus kohdasta 3) Tietokone on tyhmä.

OHJ-1101 Ohjelmointi 1e 2008-09 12 Riittävä yksikäsitteisyys ja yksityiskohtaisuus ovat tulkinnanvaraisia ja riippuvat tilanteesta. Ihminen ymmärtää, mitä pitää tehdä, jos algoritmi sanoo Laske yhteen luvut yhdestä sataan. Ihminen saattaa jopa keksiä tähän luovan ratkaisun ja välttyä käsityöltä. Tietokoneet ovat "rajoittuneita". Suunniteltaessa tietokonealgoritmeja niiden on oltava äärimmäisen yksikäsitteisiä ja yksityiskohtaisia. Esimerkiksi, jos halutaan, että tietokone selvittää, montako vokaalia sanassa on, se pitää ohjeistaa tietokoneelle näin tarkasti: Ota käsiteltäväksi sana ensimmäinen kirjain Ota vokaalien lukumääräksi nolla NIIN KAUAN KUIN ei olla sanan lopussa JOS käsiteltävänä on vokaali Kasvata lukumäärää yhdellä Siirry seuraavaan kirjaimeen Tulosta lukumäärä

OHJ-1101 Ohjelmointi 1e 2008-09 13 Edellisessä algoritmissa esiintyi toistoa ja ehdollisuutta. 1. Jotain algoritmin osaa saatetaan tarvittaessa suorittaa useita kertoja peräkkäin (toisto). 2. Jonkin algoritmin osan suorittaminen saattaa riippua olosuhteista (ehdollisuus). Toisto voidaan esittää algoritmissa seuraavasti: NIIN KAUAN KUIN väite toimenpiteet jota tulkitaan suoraviivaisesti siten, että toimenpiteitä toistetaan yhä uudelleen niin kauan kuin esitetty väite on tosi. Väite voi siis periaatteessa olla mikä tahansa toteamus, kunhan siitä tavalla tai toisella voidaan päätellä, pitääkö se paikkansa vai ei.

OHJ-1101 Ohjelmointi 1e 2008-09 14 Algoritmissa ehdollisuus esitetään muodossa: JOS väite NIIN toimenpiteet1 MUUTEN toimenpiteet2 Tätä tulkitaan siten, että mikäli väite on tosi, on algoritmin toteuttamiseksi suoritettava toimenpiteet1. Mikäli väite taas ei pidä paikkaansa, suoritetaan toimenpiteet2. Kuten aiemminkin väite saa olla mitä tahansa, jos siitä vain voidaan päätellä, onko se tosi vai epätosi. Ehtorakenne voi olla myös sellainen, että siinä on vain JOS-osa ilman MUUTEN-osaa. Tällöin ei tehdä mitään, jos väite ei pidä paikkaansa.

OHJ-1101 Ohjelmointi 1e 2008-09 15 Pseudokoodi Algoritmikielessä "jos-niin-muuten" ja "niin kauan kuin" ovat syntaktisia (l. kieliopillisia) rakenteita, joiden semantiikka (l. merkitys) on ehdollisuus ja toisto. Monista ohjelmointikielistä löytyy vastaavankaltaiset rakenteet "ifthen-else" ja "while-do". Jatkon kannalta on selvempää, jos käytämme niitä suomenkielisten rakenteiden sijaan. Tällaista ohjelmointikielen ja puhutun kielen yhdistelmää kutsutaan pseudokoodiksi. Se on erittäin hyödyllinen työkalu ohjelmien suunnittelemisessa.

OHJ-1101 Ohjelmointi 1e 2008-09 16 Palataan tavutusongelmaan ja kokeillaan ensin muodostaa suoraan tavutussääntöjen pohjalta sen kummemmin miettimättä algoritmi, joka tavuttaa yhden sanan. Kootaan algoritmi siten, että toistorakenteen avulla käydään läpi tavutettavaa sanaa kirjain kerrallaan: Ota käsiteltäväksi sanan ensimmäinen kirjain WHILE ei olla sanan lopussa DO Selvitä tuleeko tähän kohtaan tavuviiva Ota käsiteltäväksi seuraava kirjain Tulosta sana tavuviivoin

OHJ-1101 Ohjelmointi 1e 2008-09 17 Osaa Selvitä tuleeko tähän kohtaan tavuviiva täytyy tarkentaa: valintarakenteen avulla katsotaan jokaisen kirjaimen kohdalla, mikä säännöistä on tarkoitus suorittaa: IF konsonanttisääntötilanne voimassa THEN Suorita konsonanttisääntö ELSE IF vokaalisääntötilanne voimassa THEN Suorita vokaalisääntö ELSE IF diftongisääntötilanne voimassa THEN Suorita diftongisääntö

OHJ-1101 Ohjelmointi 1e 2008-09 18 Kun valintarakenne lisätään toistorakenteen sisään, algoritmiksi muodostuu:

OHJ-1101 Ohjelmointi 1e 2008-09 19 Käyttäen aidinkielenkirjan tavutussääntöjä, edellisen kuvan pohjalta voidaan kirjoittaa pseudokoodilla seuraava tavutusalgoritmi: Ota käsiteltäväksi sanan ensimmäinen kirjain WHILE ei olla sanan lopussa DO IF käsiteltävänä on vokaali ja sitä seuraa konsonantti THEN IF viimeisen peräkkäin olevan konsonantin perässä on vokaali THEN Sijoita tavuviiva ennen viimeistä konsonanttia ELSE IF käsiteltävänä on vokaali ja sitä seuraa vokaali THEN IF käsiteltävä ja seuraava eivät ole tuplavokaali tai diftongi THEN Sijoita tavuviiva käsiteltävän vokaalin jälkeen ELSE IF käsiteltävä ja seuraava ovat tuplavokaali tai diftongi THEN IF tuplavokaalia tai diftongia seuraa vokaali THEN Sijoita tavuviiva tuplavokaalin tai diftongin jälkeen Siirry käsittelemään seuraavaa kirjainta Tulosta koko sana tavuviivoineen

OHJ-1101 Ohjelmointi 1e 2008-09 20 Vuokaavio tavutusalgoritmista tarkemmin

OHJ-1101 Ohjelmointi 1e 2008-09 21 Tässä vaiheessa herää epäilys: voiko tavutusalgoritmin muodostaminen olla noin yksinkertaista? Testataan kehittämäämme algoritmia. Hyvää testiaineistoa löytyy esimerkiksi sivulta 10. Otetaan käyttöön kynä ja paperia ja testataan algoritmia sanalla luento. Lopputuloksena lu-en-to eli näyttää siltä, että ainakin vokaalisääntö ja konsonanttisääntö toimivat. Ainakin joskus... Tai ainakin tässä tilanteessa! :) Toimiiko algoritmimme nyt siis oikein?

OHJ-1101 Ohjelmointi 1e 2008-09 22 Algoritmien muodostaminen Hyväksi havaittu tapa algoritmien muodostamiseen on kokonaisuutta pienempiin osiin. Pieniä kokonaisuuksia on helpompi hallita. jäsentää Kokonaisuus saadaan pienistä osista yhdistämällä, kunhan osien algoritmit ovat oikein muodostettu ja liitetty toisiinsa. "Hajoita ja hallitse." Jäsentämistä jatketaan, kunnes osatoiminnot ovat riittävän yksinkertaisia. Algoritmin toiminnot ovat monimutkaisuudeltaan samalla tasolla kuin mitä algoritmin suorittava systeemi ymmärtää käskyinään. Tärkeintä on, että paloittelet ja jäsennät kokonaisuuden niin, että itse ymmärrät, mitä olet tekemässä.

OHJ-1101 Ohjelmointi 1e 2008-09 23 Yritetään muodostaa tavutusalgoritmi uudestaan, tällä kertaa niin, että myös ymmärretään, miten se toimii. Kun katsotaan kaikkia tavutussääntöjä, huomataan, että jokainen niistä alkaa siitä, että käsitellään vokaalia. Tavutusalgoritmin kannattaa ensimmäiseksi tarkastaa ollaanko käsittelemässä vokaalia. Jos ei, niin ei tarvitse tehdä mitään, siirrytään vain seuraavaan kirjaimeen. Algoritmiksi tämän voisi pukea esim. näin: Ota käsiteltäväksi sanan ensimmäinen kirjain WHILE ei olla sanan lopussa DO IF käsiteltävänä on vokaali THEN Täytyy tehdä jotain... Siirry käsittelemään seuraavaa kirjainta Tulosta koko sana tavuviivoineen

OHJ-1101 Ohjelmointi 1e 2008-09 24 Kohtaa Täytyy tehdä jotain... pitää selvästikin tarkentaa. Säännöt jakautuvat kahteen tilanteeseen: 1. vokaali ja sen jälkeen konsonantti toteutetaan konsonanttisääntö 2. vokaali ja sen jälkeen vokaali toteutetaan joko vokaalisääntö tai diftongisääntö Ja sama algoritmina: IF käsiteltävästä seuraava kirjain on konsonantti THEN ELSE Suoritetaan konsonanttisääntö Suoritetaan joko vokaalisääntö tai diftongisääntö Samaan tyyliin voidaan jatkaa pala kerrallaan koko tavuttamisalgoritmin muodostamista.

OHJ-1101 Ohjelmointi 1e 2008-09 25 Lopputuloksena saadaan korjattu ja siistitty algoritmi: Ota käsiteltäväksi sanan ensimmäinen kirjain WHILE ei olla vielä sanan lopussa DO IF käsiteltävänä on vokaali THEN IF käsiteltävästä seuraava kirjain on konsonantti THEN IF viimeisen peräkkäin olevan konsonantin jälkeen on vokaali THEN Sijoita tavuviiva ennen viimeistä konsonanttia ELSE IF käsiteltävä vokaali on tuplavokaalin tai diftongin alku THEN IF tuplavokaalin tai diftongin jälkeen on vielä vokaali THEN Sijoita tavuviiva tuplavokaalin tai diftongin perään ELSE Sijoita tavuviiva käsiteltävän vokaalin perään Siirry käsittelemään seuraavaa kirjainta Tulosta koko sana tavuviivoineen

OHJ-1101 Ohjelmointi 1e 2008-09 26 Vuokaavio lopullisesta tavutusalgoritmista

OHJ-1101 Ohjelmointi 1e 2008-09 27 Tätä uutta algoritmia testataan tietenkin uudestaan vähintään yhtä kattavasti kuin ensimmäistäkin versiota algoritmista. Kun algoritmia on testattu riittävästi ja todettu toimivaksi, se voidaan toteuttaa jollakin ohjelmointikielellä. Kuten algoritmin toteutuksessakin, tässä vaiheessa ohjelmakoodi voidaan kirjoittaa monella eri tavalla. Seuraavalla kalvolla esitettävä toteutus ei ole ainoa oikea vaan yksi mahdollinen. Valmiiksi hyvin suunnitellun algoritmin toteuttaminen C++:lla ei todennäköisesti ole C++:aa osaavalle henkilölle yhtään niin vaativaa, kuin itse algoritmin suunnitteleminen. Siitä huolimatta tässä vaiheessa kurssia ei vielä tarvitse ymmärtää, miten seuraava C++toteutus toimii. Ohjelmalistauksesta voi kuitenkin saada jonkinlaisen käsityksen siitä, millaista C++ on.

OHJ-1101 Ohjelmointi 1e 2008-09 28 Yksi tapa toteuttaa tavutusalgoritmi C++:lla: string tavuta( string sana ) { vector< bool > viivat( sana.size(), false ); for( unsigned int i = 0; i < sana.size(); ++i ) { if( vokaali( sana.at( i ) ) && i+1 < sana.size() ) { // Jos käsiteltävänä vokaali ja sana ja if( konsonantti( sana.at( i+1 ) ) ) { // Vokaalin perässä konsonantti -> Konsonanttisäänt int j = 1; // Lasketaan kuinka monta konsonanttia on peräkkäin while( i+j < sana.size() && konsonantti( sana.at( i+j ) ) ) { ++j; if( i+j < sana.size() && vokaali( sana.at( i+j ) ) ) { viivat.at( i+j-2 ) = true; else { // Vokaalin perässä toinen vokaali if( ( sana.at( i ) == sana.at( i+1 ) ) diftongi( sana.at( i ), sana.at( i+1 ) ) ) { // Tuplavokaali tai diftongi -> Diftongisääntö if( i+2 < sana.size() && vokaali( sana.at( i+2 ) ) ) { viivat.at( i+1 ) = true; else { // Ei tuplavokaali eikä diftongi -> Vokaalisääntö viivat.at( i ) = true; string tavutettu; for( unsigned int i = 0; i < sana.size(); ++i ) { tavutettu += sana.at( i ); if( viivat.at( i ) ) { tavutettu += "-"; return tavutettu;

OHJ-1101 Ohjelmointi 1e 2008-09 29 Ohjelmoinnin vaiheet Seuraava malli kuvaa onnistuneen ohjelmointiprojektin vaiheita: 1. Ongelman ratkaisuvaihe (a) Analysointi ja määrittely: ymmärrä ongelma ja selvitä, mitä ratkaisun on tarkoitus tehdä. (b) Yleinen ratkaisu (algoritmi ): kehitä looginen sarja ohjeita, joita noudattamalla ongelmalle saadaan haluttu lopputulos. (c) Tarkistus: testaa kynällä ja paperilla, että algoritmi toimii. 2. Ratkaisun toteutusvaihe (a) Konkreettinen ratkaisu: toteuta algoritmi sopivalla ohjelmointikielellä. (b) Testaus: suorita ohjelmaa eri syötteillä ja vertaile tuloksia tunnettuihin oikeisiin ratkaisuihin: jos virheitä löytyy, mieti "miksi?" ja korjaa ne. 3. Ylläpitovaihe (a) Käyttö: käytä ohjelmaa suunniteltuun tarkoitukseen. (b) Ylläpito: korjaa löytyviä virheitä ja lisää mahdollisia uusia tarvittavia ominaisuuksia.

OHJ-1101 Ohjelmointi 1e 2008-09 30 Asiaan perehtymättömillä on usein sellainen käsitys, että ohjelmointi on sitä, kun istutaan tietokoneen ääressä ja syötetään näppäimistöltä koneelle ohjelmaa. Kun naputtelu on ohi, kone suorittaa ohjelman ongelmitta ja näyttää oikean tuloksen. Kun tätä käsitystä ohjelmoinnista vertaa kalvolla 29 esitettyyn malliin, niin jotain puuttuu: Harhaluuloinen käsitys koostuu pelkästään yleisen mallin viimeisestä vaiheesta. Ongelmaa ei välttämättä ole ymmärretty kunnolla eikä sen ratkaisua mietitty loppuun saakka. Väärä lähestymistapa johtaa ikävyyksiin: ongelmaa ei ole ymmärretty ratkaistaan väärä ongelma ratkaisutapa virheellinen ohjelman antama tulos on väärä ohjelmaa pitää korjata hukataan aikaa ja rahaa Karkea sääntö: ratkaisuvaihe/toteutusvaihe tulisi olla 50%/50%, kun vertaillaan käytettyä aikaa ja resursseja. "Väärää lähestymistapaa" käyttävillä suhde on usein 10%/90% tai huonompi: ongelmaa pohdittu kahvikupin verran ja rynnätty suoraan toteuttamaan. Vaikka virheellinen lähestymistapa saattaakin toimia pienissä ohjelmointiprojekteissa, ongelman koon kasvaessa se ei toimi.

OHJ-1101 Ohjelmointi 1e 2008-09 31 Ohjelmointikielistä Ohjelmointikieli on se kieli, jolla tietokoneen kanssa voidaan kommunikoida (l. kuvata algoritmit muodossa, joka saadaan koneen ymmärtämään muotoon). Tarkoitus on myös, että koodia lukeva ihminen ymmärtää, mistä on kyse. Se on selkeästi analoginen puhutun kielen kanssa, mutta sangen yksinkertainen. Kaikki tietokoneet ymmärtävät pohjimmiltaan vain omaa konekieltään: sopivassa järjestyksessä koneen muistiin tallennettuja lukuja 0 ja 1 (tosiasiassa jännitetasoja). Tietyssä järjestyksessä esiintyvät nollat ja ykköset tietokone osaa tulkita alkeellisiksi käskyiksi, konekäskyiksi. Alunperin kaikki ohjelmointi oli puhtaasti konekielellä ohjelmointia: johtoja ja vipuja. Konekieli on kovin hankalakäyttöistä. Symbolinen konekieli. Korkean tason ohjelmointikielet (esim. lausekielet ).

OHJ-1101 Ohjelmointi 1e 2008-09 32 Lausekielet Lausekielet ovat konekieltä ilmaisuvoimaisempia: niillä halutun tehtävän selittäminen tietokoneelle helpompaa ja lopputulos ymmärrettävämpää ihmiselle. Yksi lausekielellä kirjoitettu käsky vastaa useita, jopa tuhansia, konekäskyjä. Ennen kuin tietokone voi suorittaa jollain muulla kuin sen omalla konekielellä kirjoitetun ohjelman, se täytyy tavalla tai toisella muuntaa konekieleksi: kääntäminen (compiling) tulkkaaminen (interpreting)

OHJ-1101 Ohjelmointi 1e 2008-09 33 Ohjelman tulkkaaminen Ohjelman tulkkaaminen perustuu siihen, että ohjelmointikielen tulkki suorittaa ohjelmaa käsky ( lause/lauseke) kerrallaan. Etuja: ohjelma voidaan testata pala kerrallaan tulkki huolehtii virheilmoituksista ja auttaa virheiden etsinnässä Haittoja: ohjelman suoritus vaatii aina tulkin tehoton

OHJ-1101 Ohjelmointi 1e 2008-09 34 Ohjelman kääntäminen Ohjelman kääntäminen perustuu siihen, että ohjelmakoodi käännetään kokonaisuudessaan konekielelle erityisellä kääntäjäohjelmalla (kääntäjällä) ennen kuin se voidaan suorittaa. Etuja: syntaksi- ja semanttiset virheet havaitaan aina kääntäjää ei enää tarvita uudelleen ajettava ohjelma nopea helpompi optimoida Haittoja: ajonaikaiset virheet jäävät yleensä ohjelmoijan hoidettavaksi

OHJ-1101 Ohjelmointi 1e 2008-09 35 Kääntäjän toiminta

OHJ-1101 Ohjelmointi 1e 2008-09 36 Ensimmäinen C++-ohjelma Käydään yksityiskohtaisesti läpi pikkuruinen C++-kielinen ohjelma: 1 // Lähdekooditiedosto: forever.cc // ------------------------------ // Ohjelma tulostaa näytölle lausahduksen: // "I plan to live forever or die trying." rivitettynä 5 #include <iostream> #include <cstdlib> using namespace std; 10 int main() { // Ohjelman toiminnot alkavat tästä. cout << "I plan to live forever" << endl; cout << "or die trying." << endl; return EXIT_SUCCESS; 15

OHJ-1101 Ohjelmointi 1e 2008-09 37 Pienessä ohjelmassa on monta tärkeää asiaa: Teksti //-kirjainyhdistelmästä rivin loppuun on kommentti, joka ei vaikuta ohjelman toimintaan. Kaikissa C++-ohjelmissa pitää olla funktio int main(), joka päättyy käskyyn return. Varsinaiset ohjelman suorittamat toiminnot ovat main:ia seuraavien aaltosulkeiden sisällä. Käskyt (lauseet) tuntuvat päättyvän ";":een. Jos C++-ohjelmassa halutaan lukea syötteitä tai kirjoittaa tulosteita, sen alkuun on lisättävä #include <iostream> ja using namespace std. cout on C++:ssa tulostusvirta, johon voidaan <<-operaattorilla ohjata tulosteita, jotka sitten ilmestyvät ohjelmaa suoritettaessa näytölle. Lainausmerkkien väliin kirjoitettua tekstiä kutsutaan merkkijonoksi, mikä tarkoittaa selkokielellä tekstimuotoista tietoa. endl tulostaa rivinvaihdon: seuraavat tulostukset alkavat uudelta riviltä (sen vasemmasta laidasta).

OHJ-1101 Ohjelmointi 1e 2008-09 38 Lähdekoodista suoritettavaksi ohjelmaksi C++-ohjelman tekeminen etenee yleensä seuraavasti: 1. Suunnitellun algoritmin C++-version kirjoittaminen jollain editorilla 2. Tallentaminen tiedostoon, jonka nimi päättyy.cc 3. Tiedoston kääntäminen C++-kääntäjällä konekielelle 4. JOS tuli käännösvirheitä NIIN takaisin editoriin korjaamaan ne 5. Käännetyn ohjelman testaaminen, jotta nähdään, toimiiko se oikein 6. JOS ei toimi oikein NIIN mieti miksi ei ja palaa takaisin editoriin korjaamaan viat 7. MUUTEN ohjelma on valmis

OHJ-1101 Ohjelmointi 1e 2008-09 39 Editointi C++-ohjelmia voi kirjoittaa millä tahansa editoriohjelmalla. Ohjelmien editointiin kannattaa kuitenkin, jos mahdollista, käyttää jed- tai emacs-editoria. Kun jedillä tai emacsilla käsittelee tiedostoa, jonka nimi päättyy.cc:hen, editori menee automaattisesti C++-tilaan, joka osaa esimerkiksi sisentää ohjelmakoodin automaattisesti, kun vain painaa sarkainnäppäintä. Periaatteessa tällä kurssilla ei ole tarkoitus uppoutua editoriohjelman käyttöön: jonkin editorin tuntemus pitäisi jokaisella olla TiTePk:sta. Ensimmäisissä viikkoharjoituksissa kuitenkin käydään pikaopastus jedin ja emacsin tärkeimpiin ominaisuuksiin.

OHJ-1101 Ohjelmointi 1e 2008-09 40 Kääntäminen Ohjelman kääntämiseen käytämme tutg++-nimistä kääntäjää. tutg++:lle luetellaan komentorivillä kaikki C++-kieliset lähdekooditiedostot, ja se kääntää niistä suoritettavan konekielisen ohjelman: proffa> tutg++ forever.cc Jos koodi on virheetön, tuloksena syntyy ajokelpoinen ohjelma a.out, joka suoritetaan kirjoittamalla sen nimi komentotulkille: proffa>./a.out I plan to live forever or die trying. a.out ei ole kuvaava nimi, mutta tutg++:lle voi kertoa vivulla -o, minkä nimisen ohjelman haluaa tuloksena: proffa> tutg++ -o plan forever.cc proffa>./plan I plan to live forever or die trying. tutg++ tunnistaa kymmeniä muitakin komentorivivipuja. Kuten TiTePK:sta muistamme, komentoriville kirjoitetun komennon alussa./ tarkoittaa, että ajettava ohjelma on työhakemistossa.

OHJ-1101 Ohjelmointi 1e 2008-09 41 Virhetilanteet Periaatteessa ohjelmissa on kolmenlaisia virheitä: kielioppi- eli syntaksivirheitä semanttisia eli "merkitysvirheitä" loogisia eli "ajatusvirheitä" Syntaksivirheet Syntaksivirheet ovat virheitä, jotka syntyvät, kun lähdekoodi ei ole käytetyn ohjelmointikielen kielioppisääntöjen mukaista. Esimerkiksi cout- tai return-lauseen lopusta puuttuva ";"-merkki olisi C++:ssa syntaksivirhe. Kääntäjä löytää aina syntaksivirheet. Virheen löydyttyä kääntäjä tulostaa ilmoituksen, joka kertoo virheen syyn ja (suuntaa-antavan) rivinumeron, jolla virhe lähdekooditiedostossa sen mielestä sijaitsi. Tyypillisesti virheilmoitus alkaa "syntax error" tai "parse error".

OHJ-1101 Ohjelmointi 1e 2008-09 42 Semanttiset virheet Semanttiset virheet syntyvät, kun ohjelmakoodi on syntaktisesti oikein, mutta kääntäjä ei silti pysty ymmärtämään sitä. Jos esimerkkiohjelmassa olisi vahingossa kirjoitettu ndl, kun oikea vaihtoehto on endl, olisi tuloksena semanttinen virhe. ndl on kyllä syntaktisesti ihan oikeanlainen: se voisi olla jonkin asian tunniste. Semanttinen virhe tulee, koska kääntäjä ei kuitenkaan ymmärrä, mitä ndl tarkoittaa. Semanttiset virheetkin kääntäjä löytää useimmiten. Semanttisesta virheestä tulostuu virheilmoitus, jonka jälkeen kääntäjä tyypillisesti sekoaa ja väittää löytävänsä koodista samalta ja myöhemmiltä riveiltä kaikennäköisiä virheitä. Korjaa virheet aina kääntäjän ilmoittamassa järjestyksessä.

OHJ-1101 Ohjelmointi 1e 2008-09 43 Loogiset virheet Loogiset virheet syntyvät, kun ohjelman kirjoittaja ajattelee jotain väärin tai unohtaa ottaa huomioon jonkun joskus hyvinkin vähäpätöisen seikan. Loogiset virheet ovat tavallisesti kirjoitusvirheitä tai algoritmin suunnittelussa tapahtuneita virheitä. Loogiset virheet ilmenevät siten, että ohjelma toimii väärin. Kääntäjällä ei ole mahdollisuuksia havaita loogisia virheitä, koska se vaatisi ohjelmoijan ajatuksenjuoksun ymmärtämistä. Ainoa tapa välttää loogisia virheitä on ohjelman huolellinen suunnittelu ja kirjoittaminen.

OHJ-1101 Ohjelmointi 1e 2008-09 44 Varatut sanat Kuten puhutuissa kielissä, on ohjelmointikielissäkin sanoja, joilla on jokin kiinteä merkitys. Esim. suomessa "kolme", "koska" ja "minä" tai C++:ssa main ja return. Ohjelmointikielistä puhuttaessa tällaisia sanoja kutsutaan varatuiksi sanoiksi. Varatuille sanoille on siis ohjelmointikielessä määritelty merkitys, eikä ohjelmoija yleensä voi muuttaa tätä merkitystä, koska tällöin kyseisen sanan alkuperäinen tarkoitus hukkuisi. Joskus kielen varattuja sanoja kutsutaan myös käskyiksi. Sanaa "käsky" käytetään kuitenkin usein hiukan vapaammin, esimerkiksi tarkoittamaan yhtä ohjelman lausetta. Varatut sanat luovat perustan koneen ja ohjelmoijan kommunikoinnille käytettäessä korkean tason ohjelmointikieltä.

OHJ-1101 Ohjelmointi 1e 2008-09 45 C++-kielen varatut sanat Seuraavassa on lueteltu C++-kielen varatut sanat: and and eq asm auto bitand bitor bool break case catch char class compl const const cast continue default delete do double dynamic cast else enum explicit export extern false oat for friend goto if inline int long main mutable namespace new not not eq operator or or eq private protected public register reinterpret cast return short signed sizeof static static cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar t while xor xor eq Osaan kurssilla tutustutaan, mutta ei läheskään kaikkiin.

OHJ-1101 Ohjelmointi 1e 2008-09 46 Esimerkki // Lähdekooditiedosto: vastukset.cc // -------------------------------- // Kommentointi on tärkeä osa ohjelman kirjoittamista, mutta // kalvoilla se vie liikaa tilaa, joten vastaisuudessa prujun // esimerkit ovat kommentoituja vain tositarpeessa! #include <iostream> #include <cstdlib> using namespace std; int main() { cout << "Sarjaan: " << 5.0 + 10.0 << endl; cout << "Rinnan: " << 5.0 * 10.0 / ( 5.0 + 10.0 ) << endl; return EXIT_SUCCESS;

OHJ-1101 Ohjelmointi 1e 2008-09 47 Kun ohjelma käännetään ja suoritetaan: proffa> tutg++ -o vastukset vastukset.cc proffa>./vastukset Sarjaan: 15 Rinnan: 3.33333 Siitä opittua: C++-kieli selvästikin ymmärtää lukuja ja sallii niillä laskemisen. cout:in avulla voidaan tulostaa myös lukuja (laskulausekkeen arvoja). C++ ei ole kovin tarkka siitä, kuinka jaamme ohjelmamme riveille. Huomaa sisentäminen ja koodin ulkoasu! VIP-esimerkki: 1.1. (ks. VIP-esimerkit kurssin ohj1e IDLEn valikosta)

OHJ-1101 Ohjelmointi 1e 2008-09 48 Perustietotyypit Tietokoneohjelmat koostuvat kahdenlaisista asioista: tiedosta toimenpiteistä, jotka käsittelevät tietoa Jotta ohjelmointikielellä voisi tehdä tietoa käsitteleviä ohjelmia, on oltava joku tapa tiedon esittämiseen ja käsittelyyn. Perustietotyypit (alkeistietotyypit ) tiedon esittämiseen Varatut sanat ja operaattorit sen käsittelyyn Yleisesti ottaen tietotyypillä käsitetään joukkoa alkioita, joilla on samat ominaisuudet, eli niitä voidaan käsitellä samoilla operaattoreilla. Perustietotyypit ovat sellaisia tiedon esitysmuotoja, jotka ohjelmointikieli tuntee automaattisesti (ilman kirjastoja). Tavallisesti perustietotyyppien alkioiden käsittelyyn on valmiit käskyt konekielessä.

OHJ-1101 Ohjelmointi 1e 2008-09 49 Kaikella tiedolla on joku tyyppi ja yleensä vain samantyyppisillä tietoalkioilla voi operoida keskenään. Alussa riittää tutustua perustietotyyppeihin, joita C++-kielessä ovat: bool totuusarvoille (true ja false) int kokonaisluvuille (esim. -2, 12345) double (ja float) liukuluvuille (esim. 3.1415, 1E10) char kirjainmerkeille (esim. 'a', '\n'). Liukuluvut eivät ole sama asia kuin reaaliluvut, vaan kasa likiarvoja. Tyyppejä int, double, float ja char kutsutaan aritmeettisiksi tyypeiksi, eli tyypeiksi, joille voidaan suorittaa normaaleja laskuoperaatioita (kuten yhteen- ja kertolasku). Todellisuudessa C++ käsittelee kirjainmerkkejäkin pieninä kokonaislukuina eli tallettaa niiden ASCII-koodin. Toistaiseksi käsitellään myös merkkijonoja ( string, tekstimuotoinen tieto, lainausmerkkien sisällä oleva teksti) kuten perustietotyyppejä, vaikka ne eivät perustietotyyppejä olekaan.