Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Samankaltaiset tiedostot
Tietorakenteet (syksy 2013)

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ohjelmoinnin jatkokurssi, kurssikoe

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet, laskuharjoitus 1,

Algoritmit 2. Luento 13 Ti Timo Männikkö

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

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet, kurssikoe

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Metodien tekeminen Javalla

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin perusteet, syksy 2006

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

Tietorakenteet ja algoritmit

ITKP102 Ohjelmointi 1 (6 op)

Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.

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

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

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

1. Mitä tehdään ensiksi?

Tietorakenteet, laskuharjoitus 3, ratkaisuja

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Taulukoiden käsittely Javalla

Python-ohjelmointi Harjoitus 2

Tietorakenteet ja algoritmit - syksy

Ohjelmointi 1 C#, kevät 2014, 2. uusintatentti NIMI:

Ohjelmoinnin perusteet (Java)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 1. Demot Timo Männikkö

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

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Ohjelmassa on käytettävä funktiota laskeparkkimaksu laskemaan kunkin asiakkaan maksu. Funktio floor pyöristää luvun lähimmäksi kokonaisluvuksi.

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

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

7. Näytölle tulostaminen 7.1

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

Algoritmit 2. Luento 7 Ti Timo Männikkö

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Tee konseptiin pisteytysruudukko! Muista kirjata nimesi ja ryhmäsi. Lue ohjeet huolellisesti!

Ohjelmoinnin perusteet Y Python

Hakemistojen sisällöt säilötään linkitetyille listalle.

TAMPEREEN TEKNILLINEN YLIOPISTO

Algoritmit 2. Luento 8 To Timo Männikkö

Scifest-loppuraportti Jani Hovi kortin temppu

Harjoitus 3 (viikko 39)

Kaikki kurssin laskuharjoitukset pidetään Exactumin salissa C123. Malliratkaisut tulevat nettiin kurssisivulle.

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin peruskurssi Y1

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3 opettaja: Pasi Ranne

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Algoritmit 1. Luento 11 Ti Timo Männikkö

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

Osoitin ja viittaus C++:ssa

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

11. Javan toistorakenteet 11.1

Javan perusteita. Janne Käki

TIETORAKENTEET JA ALGORITMIT

Ohjelmointi Tunnilla 1 (5) Viikko 7 tuntitehtäviä: metodien tekeminen Javalla

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Ohjelmointi 2 / 2011 Välikoe / 25.3

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

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

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Ohjelmointi 1 C#, kevät 2014, tentti

Olio-ohjelmointi Javalla

TAMPEREEN TEKNILLINEN YLIOPISTO

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

58131 Tietorakenteet ja algoritmit. Kevät 2016 Jyrki Kivinen

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

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

1 Tehtävän kuvaus ja analysointi

Ohjelmoinnin perusteet Y Python

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

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

Transkriptio:

Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla, ennen kuin päästään lukuun 1. Esimerkiksi log 2 8 on 3, koska 8/2/2/2 on 1. Jos lukuun 1 ei päästä tasajaoilla, logaritmin lopussa on desimaaliosa, joka kuvaa viimeistä vaillinaista jakoa. Esimerkiksi log 2 9 on noin 3,17, koska 9/2/2/2 on 1,125, eli kolmen jaon jälkeen onvielä hieman matkaa lukuun 1, mutta neljäs täysi jako veisi jo selvästi sen alapuolelle. Laske seuraavat logaritmit ilman laskinta: (i) log 2 16 (ii) log 4 4 (iii) log 3 81 (iv) log 11 1 (v) log 11 121 (vi) log 10 10000 Huom: Tietojenkäsittelijöille 2-kantainen logaritmi on käytetyin ja tärkein. Myöhemmin kurssilla tullaan puhumaan "logaritmisesta"useassa yhteydessä ja näiden kohdalla tarkoitetaan aina 2- kantaista logaritmia ellei toisin mainita. Mietittävää: Logaritmi on (yllättävän?) "nopea". Luvun 1000 logaritmi on noin 10, luvun 1 000 000 logaritmi on noin 20 ja luvun 1 000 000 000 logaritmi on noin 30. Hyöty: Binäärihaku pystyy löytämään valmiiksi järjestetystä taulukosta alkion "logaritmisessaajassa". Tämä tarkoittaa sitä, että miljoona alkioisesta taulukosta binäärihaku löytää alkion puolittamalla taulukkoa vain 20 kertaa! (Huomattavasti nopeampaa kuin miljoonan alkion tarkastaminen yksitellen). 2. Tarkastellaan ei-negatiivisten kokonaislukujen binääriesityksiä (eli 2-kantaisia esityksiä). Esimerkiksi luvulle 50 saadaan seuraava binääriesitys: 110010. Esitystä 110010 voi ajatella lyhenteenä seuraavalle: 1 2 5 + 1 2 4 + 0 2 3 + 0 2 2 + 1 2 1 + 0 2 0 = 32 + 16 + 0 + 0 + 2 + 0 = 50. Muistutus: 2 0 = 1. (a) Mikä on suurin ei-negatiivinen kokonaisluku, jonka pystyt esittämään tasan kuudella merkillä binääriesityksenä? Entä pienin? (b) Mikä on suurin ei-negatiivinen kokonaisluku, jonka pystyt esittämään tasan kymmenellä merkillä binääriesityksenä? Entä pienin? (c) Kuinka pitkä on luvun 200 binääriesitys. (d) Kuinka ensimmäisen tehtävän logaritmien laskenta liittyy edellä olevien laskentaan? Osaatko muodostaa sen avulla yleisen kaavan minkätahansa ei-negatiivisen kokonaisluvun binääriesityksen pituudelle? Huomio: Jokaisen parittoman kokonaisluvun binääriesitys loppuu merkkiin 1 ja parillisen merkkiin 0. Mietittävää: Javan int-tyypin suurin arvo on 2,147,483,647 ja pienin -2,147,483,648. Yhteensä javan int-tyypillä on erilaisia arvoja siis 4,294,967,295 kappaletta. Kuinkakohan monta bittiä näiden esittämiseen tarvitaan... 1

3. Lue rekursiosta seuraavasta linkistä http://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=rekursio Rekursion hallinta on erittäin tärkeää kurssin kannalta. Jos et osaa tehdä seuraavia tehtäviä omin päin, mene välittömästi TiRa-pajaan ja pyydä ohjaajalta avustusta rekursion oppimisessa! Seuraavassa pari yksinkertaista rekursiota käyttävää lämmittelytehtävää. Allaoleviin tehtäviin ei normaalisti käytettäisi rekursiota, eli teemme nämä ainoastaan harjoituksen vuoksi. Huom: jos et ymmärrä mitä tehtävässä kysytään tai saa tehtävää tehdyksi, tule kysymään TiRa-pajasta neuvoa! a) Tee metodi, joka tulostaa parametrinaan saamansa määrän tähtiä, eli -merkkejä. Sen lisäksi funktio kutsuu itseään rekursiivisesti jos parametrin arvo on positiivinen. Metodin runko näyttää seuraavalta: private static void tahtia(int lkm) { // tulosta lkm tahtea // kutsu funktiota rekursiivisesti tulostamaan lkm-1 tahteä Käyttöesimerkki: tahtia(3); Ruudulle pitäisi tulostua Huom: yksittäinen metodin tahtia-komento-osan suoritus siis tulostaa ainoastaan yhden tähtirivin. Eli edellisessä esimerkissä metodi tulee kutsutuksi yhteensä 3 kertaa vaikka main tekeekin ainoastaan yhden kutsun. b) Pienellä muutoksella ohjelma saadaan tulostamaan tähdet päinvastaisessa järjestyksessä, eli esim. kutsuttaessa tahtia(3), tulostuu: Kokeile mikä muutos saa tämän aikaan. Muutos liittyy rekursiivisen metodikutsun paikkaan, ja onnistuu yhtä koodiriviä siirtämällä. Et tarvitse esim. mitään apumuuttujia. c) Yksittäinen metodi voi kutsua itseään rekursiivisesti useampaan kertaan. Kirjoita metodin runkoon kaksi rekursiivista kutsua. Laittamalla kutsut sopiviin paikkoihin, saadaan pääohjelmassa kutsumalla tahtia(2) aikaan kuvio: 2

Ja kutsumalla tahtia(3) kuvio: Kokeile mikä muutos saa tämän aikaan. d) Muokkaa edellistä ohjelmaa siten, että mukaan tulee staattinen muuttuja jonka avulla voidaan laskea kuinka monennesta rekursiivisesta kutsusta on kysymys. Tulosta jokaisen tähtirivin perään sen aiheuttaneen rekursiivisen kutsun järjestysnumero. Seuraavassa hahmotelma: static int kutsut; kutsut = 1; tahtia(3); private static void tahtia(int lkm) { // otetaan talteen monesko kutsu itse ollaan ja kasvatetaan // kutsujen yhteenlaskettua lukumäärää int kutsunnumero = kutsut++; //... // tulosta lkm tahtea ja tulosta kutsunnumero //... Edellisen kohdan kutsun tahtia(3) pitäisi näyttää suunilleen seuraavalta (huom. jos kutsut koodissasi rekursiivisesti myös tahtia(0) voi numerointi mennä hieman eri tavalla): 3 2 4 1 6 5 7 e) Ymmärrätkö varmuudella sataprosenttisesti miten ohjelmasi etenee? Piirrä miten koodin suoritus etenee tai käy ohjelmasi suoritus askeltaen läpi debuggerilla. Piirtämiseen ja debuggerin käyttöön saat ohjausta tirapajassa. f) Kun alat hallita rekursion toimintaperiaatteen, saat pienellä muokkauksella (lisäämällä kolmannen rekursiokutsun) saat ohjelmasi toimimaan esim. seuraavasi: 3 4 5 2 3

7 8 9 6 11 12 13 10 1 Tee tämä muutos. 4.Luonnollisen luvun n kertoma n! voidaan määritellä seuraavasti: n! = { 1 jos n = 0 n (n 1)! jos n > 0 Esimerkiksi 3! = 3 2! = 3 2 1! = 3 2 1 0! = 3 2 1 1 = 6. Toteuta Javalla rekursiivinen funktio, joka laskee luvun kertoman yllä olevalla menetelmällä. Seuraavassa on funktion käyttöesimerkki: private static int kertoma(int luku) { // tee funktio tähän // tulostaa 362880 System.out.println(kertoma(9)); 5. Jos merkkijonon TIRA kääntää ympäri, tuloksena on merkkijono ARIT. Toteuta Javalla rekursiivinen funktio, joka kääntää merkkijonon ympäri. Seuraavassa on funktion käyttöesimerkki: private static String kaanna(string merkkijono) { // tee funktio tähän // tulostaa ARIT System.out.println(kaanna("TIRA")); Vihje: Siirrä ensimmäinen merkki merkkijonon loppuun ja käännä (alkuperäinen) loppuosa rekursiivisesti. 6. Tarkastellaan seuraavaa algoritmia: A. Valitaan jokin positiivinen kokonaisluku n. B. Jos n on parillinen, jaetaan se kahdella. Jos taas n on pariton, kerrotaan se kolmella ja lisätään tulokseen yksi. C. Jos n on yksi, lopetetaan. Muuten palataan kohtaan B. Esimerkiksi jos valitaan aluksi n = 6, algoritmi etenee seuraavasti: 4

6/2 = 3 3 3 + 1 = 10 10/2 = 5 5 3 + 1 = 16 16/2 = 8 8/2 = 4 4/2 = 2 2/2 = 1 Tehtävänä on toteuttaa Java-ohjelma, joka simuloi algoritmia annetulla n:n arvolla. Ohjelman tulostuksen tulee olla seuraavanlainen: Anna luku: 6 6 3 10 5 16 8 4 2 1 1. Toteuta ohjelma iteratiivisesti (eli ilman rekursiota, joko while- tai for-lauseita hyödyntäen). 2. Toteuta ohjelma rekursiivisesti. Osaatko sanoa, pysähtyykö ohjelma kaikilla n:n arvoilla? 5