Tietorakenteet (syksy 2013)

Samankaltaiset tiedostot
Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

58131 Tietorakenteet ja algoritmit (syksy 2015)

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

Ohjelmoinnin jatkokurssi, kurssikoe

1 Lukujen jaollisuudesta

Tietorakenteet, laskuharjoitus 1,

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

13. Loogiset operaatiot 13.1

Python-ohjelmointi Harjoitus 2

Esitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa 1. Lähdetään sieventämään epäyhtälön vasenta puolta:

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 )

Metodien tekeminen Javalla

Ohjelmointi 2 / 2010 Välikoe / 26.3

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Yhtäpitävyys. Aikaisemmin osoitettiin, että n on parillinen (oletus) n 2 on parillinen (väite).

Java-kielen perusteita

Ohjelmoinnin perusteet, syksy 2006

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Java-kielen perusteet

3. Kirjoita seuraavat joukot luettelemalla niiden alkiot, jos mahdollista. Onko jokin joukoista tyhjä joukko?

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

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

11. Javan valintarakenteet 11.1

Algoritmit 1. Demot Timo Männikkö

7. Näytölle tulostaminen 7.1

Olio-ohjelmointi Javalla

Matematiikan tukikurssi

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

ITKP102 Ohjelmointi 1 (6 op)

811120P Diskreetit rakenteet

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 3 (9 sivua) OT

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

1. Omat operaatiot 1.1

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

Tietorakenteet, laskuharjoitus 3, ratkaisuja

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

Ohjelmoinnin perusteet, kurssikoe

13. Loogiset operaatiot 13.1

11. Javan toistorakenteet 11.1

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

1. Mikä on lukujen 10, 9, 8,..., 9, 10 summa? 2. Mikä on lukujen 10, 9, 8,..., 9, 10 tulo? =?

a ord 13 (a)

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

a k+1 = 2a k + 1 = 2(2 k 1) + 1 = 2 k+1 1. xxxxxx xxxxxx xxxxxx xxxxxx

Taulukoiden käsittely Javalla

Matematiikassa väitelauseet ovat usein muotoa: jos P on totta, niin Q on totta.

Johdatus matematiikkaan

= 3 = 1. Induktioaskel. Induktio-oletus: Tehtävän summakaava pätee jollakin luonnollisella luvulla n 1. Induktioväite: n+1

Matematiikan tukikurssi, kurssikerta 1

ITKP102 Ohjelmointi 1 (6 op)

Merkitse kertolasku potenssin avulla ja laske sen arvo.

11. Javan valintarakenteet 11.1

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

4. Luokan testaus ja käyttö olion kautta 4.1

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

Algoritmit 2. Luento 13 Ti Timo Männikkö

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

12. Javan toistorakenteet 12.1

Java-kielen perusteita

Algebra. 1. Ovatko alla olevat väittämät tosia? Perustele tai anna vastaesimerkki. 2. Laske. a) Luku 2 on luonnollinen luku.

Testaa taitosi 1: Lauseen totuusarvo

1 Tehtävän kuvaus ja analysointi

MS-A0402 Diskreetin matematiikan perusteet

Racket ohjelmointia osa 2. Tiina Partanen Lielahden koulu 2014

(a) Kyllä. Jokainen lähtöjoukon alkio kuvautuu täsmälleen yhteen maalijoukon alkioon.

12. Javan toistorakenteet 12.1

1. Mitä tehdään ensiksi?

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

Matematiikan mestariluokka, syksy

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

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

Johdatus matematiikkaan

2017 = = = = = = 26 1

Python-ohjelmointi Harjoitus 5

Jaollisuus kymmenjärjestelmässä

Vaihtoehtoinen tapa määritellä funktioita f : N R on

1. Esitä rekursiivinen määritelmä lukujonolle

joissa on 0 4 oikeata vastausta. Laskimet eivät ole sallittuja.

MS-A0402 Diskreetin matematiikan perusteet

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

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

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

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

Rajapinta (interface)

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

Kenguru 2013 Student sivu 1 / 7 (lukion 2. ja 3. vuosi)

811120P Diskreetit rakenteet

0. Kertausta. Luvut, lukujoukot (tavalliset) Osajoukot: Yhtälöt ja niiden ratkaisu: N, luonnolliset luvut (1,2,3,... ) Z, kokonaisluvut

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

MATEMATIIKAN KOE, PITKÄ OPPIMÄÄRÄ HYVÄN VASTAUKSEN PIIRTEITÄ

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Sisällys. 15. Lohkot. Lohkot. Lohkot

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

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

Ohjelmistojen mallintaminen, sekvenssikaaviot

Algoritmit 1. Demot Timo Männikkö

Transkriptio:

Tietorakenteet (syksy 2013) Harjoitus 1 (6.9.2013) Huom. Sinun on osallistuttava perjantain laskuharjoitustilaisuuteen ja tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. Näiden laskuharjoitusten tarkoituksena on tutustua rekursioon ja kerrata kurssilla tarvittavaa matematiikkaa. 1. Ovatko väitteet totta vai tarua? Todista. (a) Jos k N on pariton luku, niin k 2 1 on parillinen. (b) Jos k N ei ole jaollinen kolmella, niin k 2 1 on aina jaollinen kolmella. (c) On olemassa kolme lukua a,b,c N siten, että (a+b)c < a+b+c. (d) Millä tahansa kolmella luvulla a,b,c N (a+b)c < a+b+c. 2. (a) Javan if-lauseen ehto-osaan voidaan kirjoittaa loogisia lausekkeita. Mitkä seuraavista ehdoista ovat keskenään samoja (A ja B ovat boolean-muuttujia)?!(a B)!(A && B)!A &&!B!A!B (b) Anu Algoritmi on kirjoittamassa java-koodia. Pitkän pähkäilyn jälkeen hän sai if-lauseen ehto-osan tällaiseksi:!(!a!b) && B Auta Anua kirjoittamaan ehto mahdollisimman helppoon muotoon. (c) Koodista löytyi toinenkin monimutkainen ehto: (A!B) && (B!A) Kirjoita tämäkin mahdollisimman helppoon muotoon (d) Koodista löytyi lisää epäselvyyksiä:!(((a!a) A B) &&!A) Voisiko tämänkin esittää lyhyemmin? 3. 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: (a) log 2 128 (b) log 4 4 1

(c) log 3 81 (d) log 11 1 (e) log 11 121 (f) log 10 100000 (g) log 2 2 19 4. Tarkastellaan ei-negatiivisten kokonaislukujen binääriesityksiä (eli 2-kantaisia esityksiä). Esimerkiksi luvulle 51 saadaan seuraava binääriesitys: 110011. Esitystä 110011 voi ajatella lyhenteenä seuraavalle: 1 2 5 +1 2 4 +0 2 3 +0 2 2 +1 2 1 +1 2 0 = 32+16+0+0+2+1 = 51. Muistutus: n 0 = 1, jos n N +. (a) Mikä on suurin ei-negatiivinen kokonaisluku, jonka pystyt esittämään tasan seitsemällä merkillä binääriesityksenä? Entä pienin? (b) Mikä on suurin ei-negatiivinen kokonaisluku, jonka pystyt esittämään tasan yhdeksällä merkillä binääriesityksenä? Entä pienin? (c) Onko seuraava ei-negatiivisen kokonaisluvun binääriesitys parillinen vai pariton: 100111010110100110111? Perustele! (d) Kuinka pitkä on luvun 400 binääriesitys. (e) Muodosta yleinen kaavan minkä tahansa ei-negatiivisen kokonaisluvun binääriesityksen pituudelle. Vihje: Tehtävä 3 Tarvinnet seuraavia merkintöjä (x on reaaliluku): x = max{k Z k x x = min{k Z k x 5. 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 et saa tehtävää tehdyksi, kysy apua ohjelmointipajasta tai torstain laskuharjoituspajasta! Tämä tehtävä on erittäin tärkeä. (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: public static void main(string[] args) { tahtia(3); 2

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: 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; public static void main(string[] args) { kutsut = 1; tahtia(3); 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) Kun alat hallita rekursion toimintaperiaatteen, saat pienellä muokkauksella (lisäämällä kolmannen rekursiokutsun) saat ohjelmasi toimimaan esim. seuraavasi: 3 4 5 2 7 8 9 6 11 12 13 10 1 Tee tämä muutos. 6. (a) Kahden positiivisen kokonaisluvun kertolaskun voi laskea seuraavan palautuskaavan mukaisella rekursiivisella algoritmilla: { x jos y = 1 x y = x+x (y 1) jos y > 1 Näytä, kuinka lasket tällä tavalla 4 7 Laadi Javalla metodi int kertolasku(int x, int y) joka toteuttaa algoritmin. (b) Kahden luonnollisen luvun kertolaskun voi laskea seuraavan palautuskaavan mukaisella rekursiivisella algoritmilla: 4

0 jos y = 0 x y = 2(x y/2 ) jos y on parillinen x+2(x y/2 ) jos y on pariton Näytä, kuinka lasket tällä tavalla 5 9. Laadi Javalla metodi int kertolasku2(int x, int y) joka toteuttaa algoritmin. Huom. Voit pitää merkintää 2(x y/2 ) lyhenteenä merkinnälle x y/2 + x y/2, kahdella kertomista ei siis tarvitse laskea rekursiolla. Javalla voit pyöristää alaspäin esimerkiksi luvun 7/2 helpoiten seuraavasti (int) 7/2 Kumpi ratkaisu tuntuu sinusta nopeammalta? Tässä vaiheessa kurssia sinun ei tarvitse tehdä formaalia analyysia. 5