Ohjelmoinnin perusteet, syksy 2006

Samankaltaiset tiedostot
5. HelloWorld-ohjelma 5.1

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

Kääntäjän virheilmoituksia

5. HelloWorld-ohjelma 5.1

12. Javan toistorakenteet 12.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

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

12. Javan toistorakenteet 12.1

11. Javan toistorakenteet 11.1

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

13. Hyvä ohjelmointitapa (osa 1) 13.1

7. Näytölle tulostaminen 7.1

Tietorakenteet (syksy 2013)

14. Hyvä ohjelmointitapa 14.1

11. Javan valintarakenteet 11.1

58131 Tietorakenteet ja algoritmit (syksy 2015)

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

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

Java-kielen perusteet

Harjoitus 5 (viikko 48)

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

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

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

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

1. Omat operaatiot 1.1

8. Näppäimistöltä lukeminen 8.1

11. Javan valintarakenteet 11.1

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

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

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

12. Näppäimistöltä lukeminen 12.1

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Mikä yhteyssuhde on?

Ohjelmoinnin perusteet Y Python

Maahan on pudonnut omenoita, ja Uolevi aikoo poimia niitä. Tiedät jokaisesta omenasta, kuinka painava se on.

Ohjelmoinnin perusteet Y Python

Metodien tekeminen Javalla

Interaktiivinen tarinankerronta

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Sisältö. 22. Taulukot. Yleistä. Yleistä

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

Ohjelmoinnin jatkokurssi, kurssikoe

Java-kielen perusteita

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

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

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

Harjoitus 4 (viikko 47)

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Seuraavassa on esimerkki for-, while- ja do-while -lauseesta:

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Ohjelmoinnin perusteet Y Python

Sisällys. 15. Lohkot. Lohkot. Lohkot

Java-kielen perusteet

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

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Harjoitus 3 (viikko 39)

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1

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

17. Javan omat luokat 17.1

8. Näppäimistöltä lukeminen 8.1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

9. Periytyminen Javassa 9.1

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Taulukot. Jukka Harju, Jukka Juslin

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjelmoinnin perusteet Y Python

Rajapinta (interface)

Harjoitus 5 (viikko 41)

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

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

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Olio-ohjelmointi Javalla

Poikkeustenkäsittely

Java-kielen perusteita

Ohjelmoinnin perusteet Y Python

Python-ohjelmointi Harjoitus 2

Harjoitustyön testaus. Juha Taina

4. Lausekielinen ohjelmointi 4.1

Luokat ja oliot. Ville Sundberg

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Ohjelmoinnin peruskurssi Y1

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

Ohjelmointi 2 / 2011 Välikoe / 25.3

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

Javan perusteita. Janne Käki

Transkriptio:

Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen rivin jälkeen. Algoritmille annetaan syötteet 1, 2 ja 3. (Huom: tämä ei ole Javaa!) a := 3; b := 2; c := 1; lue(d); a := (b d)*a; b := a+(b+(c+(d+1)*c)*b)*a; lue(a); lue(c); kirjoita(a c); c := c+c*c; Alla algoritmin tila esitetään riveittäin. Jos kuvausrivillä on merkki '"', ei muuttujan tilaan kosketa kyseisellä rivillä. Se siis säilyy ennallaan. Merkki '?' tarkoittaa, ettei muuttujaa olla alustettu, eikä sen arvoa siis tiedetä. Viimeisellä sarakkeella kerrotaan vielä, mitä ohjelma tulostaa, vaikkei tätä tehtävänannossa pyydettykään. Jos sarakkeella ei lue mitään, ei ohjelma tulosta mitään... a b c d tulostetaan a := 3; b := 2; c := 1; 3 2 1? lue(d); " " " 1 a := (b d)*a; 9 " " " b := a+(b+(c+(d+1)*c)*b)*a; " 63 " " lue(a); lue(c); 2 " 3 " kirjoita(a c); " " " " 1 c := c+c*c; " " 12 " 2. Mitä seuraava algoritmi tulostaa? Perustele. (Huom: tämä ei ole Javaa!) edellinen := 1; seuraava := 1; while (edellinen < 25) { kirjoita(edellinen); apu := seuraava; seuraava := edellien + seuraava; edellinen := apu; Simuloidaan algoritmin suoritusta rivi riviltä, muuttuja muuttujalta samaan tapaan kuin edellisessä tehtävässä. edellinen seuraava apu tulostetaan edellinen :=1; seuraava := 1; 1 1? while (edellinen < 25) { // Ehto pätee! " "? kirjoita(edellinen); " " " 1 apu := seuraava; " " 1 seuraava := edellinen+seuraava; " 2 " edellinen := apu; 1 " "

kirjoita(edellinen); " " " 1 apu := seuraava; " " 2 seuraava := edellinen+seuraava; " 3 " edellinen := apu; 2 " " kirjoita(edellinen); " " " 2 apu := seuraava; " " 3 seuraava := edellinen+seuraava; " 5 " edellinen := apu; 3 " " kirjoita(edellinen); " " " 3 apu := seuraava; " " 5 seuraava := edellinen+seuraava; " 8 " edellinen := apu; 5 " " kirjoita(edellinen); " " " 5 apu := seuraava; " " 8 seuraava := edellinen+seuraava; " 13 " edellinen := apu; 8 " " kirjoita(edellinen); " " " 8 apu := seuraava; " " 13 seuraava := edellinen+seuraava; " 21 " edellinen := apu; 13 " " kirjoita(edellinen); " " " 13 apu := seuraava; " " 21 seuraava := edellinen+seuraava; " 34 " edellinen := apu; 21 " " kirjoita(edellinen); " " " 21 apu := seuraava; " " 34 seuraava := edellinen+seuraava; " 55 " edellinen := apu; 34 " " while (edellinen < 25) // Ehto ei päde! " " "

Algoritmi siis tulostaa Fibonaccin lukusarjaa: 1, 1, 2, 3, 5, 8, 13, 21. 3. Millaisen "reaalimaailman" ongelman seuraava algoritmi ratkaisee? (Huom: tämä ei ole Javaa!) a := 0; lue(b); c := b; while (c>0) { lue(d) a := a + d; c := c 1; if (b=0) kirjoita("heissulivei") else kirjoita(a/b); Kirjoita algoritmi uudelleen siten, että muuttujilla on nimet, joiden avulla algoritmin tehtävän voi ymmärtää he lpommin! Täydennä algoritmia myös tulostusoperaatioin, jotka kertovat, mistä on kysymys. Ketä ensimmäinen parannus palvelee? Entä toinen? Algoritmi laskee annettujen lukujen keskiarvon. Aluksi syötetään syötettävien lukujen määrä. Alla valistuneempi versio ohjelmasta. kirjoita("tämä ohjelma laskee lukujen keskiarvon. ); kirjoita("monenko luvun keskiarvo lasketaan?"); lue(lukumäärä); luettavaajäljellä := lukumäärä; while (luettavaajäljellä > 0) { kirjoita("syötä luku, kiitos:"); lue(luku) summa := summa + luku; luettavaajäljellä := luettavaajäljellä 1; if (lukumäärä=0) kirjoita("keskiarvo nollalle luvulle on määrittelemätön!"); else { kirjoita("syötettyjen lukujen keskiarvo on:"); kirjoita(summa/lukumäärä); Kuvaavien muuttujanimien käyttö tekee koodista heti ymmärrettävämpää. Samalla koodi kommentoi itseään: tarve erillisten kommenttien kirjoittamiselle vähenee. Tulostusoperaatiot tekevät koodista käyttäjäystävällisempää. Käyttäjän ei pitäisi tarvita nähdä ohjelmakoodia ymmärtääkseen, kuinka ohjelmaa käytetään. 4. a) Laadi algoritmi, joka lukee 10 lukua ja tulostaa niiden summan. Laaditaan algoritmi edellisten tehtävien tyyliin, ei siis Javalla. kirjoita("ohjelma lukee 10 lukua ja tulostaa niiden summan."); i := 0; while (i < 10) { kirjoita("syötä luku:");

lue(apu); summa := summa + apu; i := i + 1; kirjoita("lukujen summa:"); kirjoita(summa); Ylläolevan kaltaisen while ehdon määrittely on klassinen ohjelmointivirheen paikka. Pidä huoli, että lukuja algoritmissasi luetaan tosiaan kymmenen, ilman +/ yhden virhemarginaalia. b) Laadi algoritmi, joka lukee ensin luvun n, sitten lukee n kappaletta lukuja ja tulostaa niiden summan. Pienellä muutoksella saadaan ylläolevasta algoritmista nyt haluttu. kirjoita("ohjelma lukee halutun määrän lukuja ja tulostaa niiden summan."); kirjoita("monenko luvun summa lasketaan?"); lue(lukumäärä); i := 0; while (i < lukumäärä) { kirjoita("syötä luku:"); lue(apu); summa := summa + apu; i := i + 1; kirjoita("lukujen summa:"); kirjoita(summa); 5. Kirjoita seuraava Java ohjelma tekstitiedostoksi Eka.java: public class Eka { public static void main(string[] args) { System.out.println("Hyvää päivää!"); System.out.println("Minä olen tietokone."); System.out.println(" ========="); System.out.println("Luulethan, että olen hyvin viisas?"); Käännä ohj elma Java kääntäjällä ja suorita ohjelma Java tulkilla. Kokeile ohjelman ensimmäisen puolipisteen poistamista. Mitä käänt äjä sanoo? Kokeile ensimmäisen lainausmerkin poistamista. Mitä käänt äjä sanoo? Kirjoita ensimmäinen sana "System" pienellä alkukirjaimella. Mitä käänt äjä sanoo? Poistetaan ensimmäinen puolipiste ja yritetään kääntää muokattu ohjelma. Tällöin kääntäjä herjaa: Eka.java:4: ';' expected System.out.println("Minä olen tietokone."); 1 error Virheilmoitus saadaan, koska riveillä 3 ja 4 olevien tulostuslauseiden välissä kuuluisi olla puolipiste. Hyvin muotoillussa ohjelmakoodissa tämä puolipiste kuuluu luonnollisesti rivin 3 loppuun eikä rivin 4 alkuun, mutta kääntäjän kannalta tällä ei ole merkitystä. Vasta riville 4 tullessaan kääntäjä tietää kaivata puolipistettä ja valittaa näin ollen rivistä 4, vaikka oikeastaan pitäisi korjata riviä 3. On monimutkaisempiakin tilanteita, joissa virhe koodissa aiheuttaa kääntäjän havaitseman kielioppivirheen vasta jollain myöhemmällä, sinänsä täysin virheettömällä rivillä.

Kokeillaan seuraavaksi, mitä tapahtuu, jos poistetaan ensimmäinen lainausmerkki. Saadaan kääntäjältä ilmoitus: Eka.java:3: ')' expected System.out.println(Hyvää päivää!"); Eka.java:3: unclosed string literal System.out.println(Hyvää päivää!"); 2 errors Kääntäjä on näkevinään kaksi virhettä. Koska aloitussulun ja Hyvää merkkijonon välissä ei ole lainausmerkkiä, tulkitsee kääntäjä Hyvää merkkijonon muuttujaksi. Kieliopillisesti oikein olisi kirjoittaa System.out.println(Hyvää); ja jotain tällaista kääntäjä arvelee tulevan vastaan. Rivi ei kuitenkaan jatkukaan loppusulkeella, ja tämän kääntäjä tulkitsee virheeksi. Toinen kääntäjää kummeksuttava asia on rivillä esiintyvä yksittäinen lainausmerkki. Kääntäjä ei kuitenkaan ole kyllin fiksu osatakseen näyttää, mista kohtaa lainausmerkin pari on jäänyt pois, joten se vain osoittaa paritonta, sinänsä ihan oikeassa paikassa olevaa lainausmerkkiä. Kuten esimerkistä havaitaan, kääntäjä ei aina ymmärrä, mikä ongelma oikeasti on. Se ei siis välttämättä tarjoa suoraa, oikeaa ohjetta virheen korjaamiseen. Yksi ohjelmointivirhe voi myös kääntäjän herjoissa muuttua useammaksi. Kirjoitetaan sitten yksi "System" pienellä: Eka.java:3: package system does not exist system.out.println("hyvää päivää!"); 1 error Tämän virheilmoituksen tarkkaa syytä ei tarvitse vielä tässä vaiheessa ymmärtää. Javassa merkkien koolla on merkitystä, joten "System" ei ole "system". (Tarkemmin: Rivillä käytetään PrintStreamluokan metodia java.lang paketin System luokan kautta. system luokkaa tai pakkausta ei Javasta puolestaan löydy.) Pakkauksiin (package) ja luokkiin perehdytään joskus tulevaisuudessa.