Palautteita Tutoriaalit olivat vaikeat! Totta, tentti on onneksi helpompi 504
Mitä range() tekee? range on funktio, joka palauttaa listan esim. a = range(5,10) Palauttaa listan [5,6,7,8,9] Siis nämä kolme silmukkaa ovat identtiset: for x in range(5,10): print x a = [5,6,7,8,9] for x in a: print x for x in [5,6,7,8,9]: print x 505
Tietokoneen matemaattiset perusteet
Tänään Tietokoneen matemaattiset perusteet Lukujärjestelmät Tiedon koodaustavat Tentissä ei saa käyttää laskinta. Seuraavat asiat kannattaa opetella sillä silmällä Käytössä on villen alkeellinen laskin
Tietokoneen matemaattiset perusteet
Algoritmista suoritukseen Tähän asti tarkasteltu itse algoritmeja Algoritmien merkitys perustuu niiden automaattiseen suorittamiseen Tietokone yleissuoritin Pystyy suorittamaan erilaisia algoritmeja Aloitetaan tietokoneen toiminnan tarkastelu
Von Neumannin konemalli Lähes kaikki tietokoneet perustuvat 40-luvun John von Neumannin käsitteisiin, ns. von Neumannin konemalliin: Tietokoneessa on Muisti (joukko samankaltaisia muistipaikkoja) Prosessori, jolla käytössä joukko rekistereitä Prosessori voi Ladata tietoa muistista rekistereihin Suorittaa aritmeettisia ja loogisia operaatioita rekistereille Tallentaa rekisterien arvot takaisin muistiin Koneen ohjelma koostuu Käskyjoukosta, jolla operaatioita tehdään Kontrollikäskyistä, joilla määrätään seuraava käsky
Bitti Digitaalisen tietokoneen toiminta perustuu kahden olotilan periaatteelle: kone joka tunnistaa kaksi eri olotilaa Useampien tilojen käyttö ei juuri tuo etuja; mutkistaa rakennetta kohtuuttomasti Lähes kaikki tietokoneet käyttävät binäärijärjestelmää toiminnan pohjana Sana bitti (bit) tulee sanoista BInary digit Tarkoittaa kaksijärjestelmän numeroa Pienin informaation yksikkö
Tiedon koodaus/dekoodaus Tiedon koodaus (coding): tiedon esittämistä jonkin järjestelmän mukaisina merkkeinä tai symboleina Tieto yleensä esitetty jotenkin ennen koodausta, joten kyse tiedon esitystavan muuttamisesta Alkuperäisen esitystavan palautusta kutsutaan dekoodaukseksi (decoding) Kaksi perustapaa koodaukseen Tiedoittainen koodaus: muunnetaan alkuperäinen merkitys kokonaisuutena uuteen esitysmuotoon Esim. liikennemerkit, henkilötunnus, vakioveikkaus Merkeittäinen koodaus: muunnetaan esitystavan merkit yksitellen uuteen esitysmuotoon Esim. morseaakkoset
Esim. sanojen koodaus tiedoittain Tehtävä: koodaa perusmuotoisia suomenkielisiä sanoja Tiedossa lista kaikista suomenkielen sanoista ja järjestysnumeroista Koodaamme sanat niiden järjestysnumerolla listassa Esim. aloittelija => 45 Luku 45 voidaan vaikka lähettää verkon yli ja vastaanottaja dekoodaa sanat samanlaisesta taulukosta 42 aloitteikas 43 aloitteinen 44 aloittelija 45 aloitus 46 aloituskorkeus 47 aloitusmerkki 48 aloituspaikka. 513
Esim. sanojen koodaus merkeittäin Koodataan jokainen merkki erikseen Esim: HEI => 8 5 9, JEE => 10 5 5 0 välilyönti 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I 10 J 514
Tieto tietokoneessa Tieto tietokoneessa voidaan jakaa: Merkkitietoon Aakkosellinen ja aakkosnumeerinen Tiedon merkitys ei suoraan nähtävissä tiedon esityksestä Koodataan yleensä merkeittäin biteiksi Lukuihin Numeerinen tieto Luvun arvo määräytyy suoraan luvun esityksestä (kun lukujärjestelmä tunnetaan)
Aakkosellisen tiedon koodaus Joudutaan siis koodaamaan merkeittäin biteiksi Jokaiselle merkille varataan yksikäsitteinen bittiyhdistelmä Useita järjestelmiä muunnoksen tekemiseen 7- tai 8-bittinen ASCII (American Standard Code for Information Interchange) Pääsi alkuaikoina eräänlaisen standardin asemaan 7-bittisellä ASCII-koodilla esitettävissä 2 7 eli 128 merkkiä Riitti juuri isojen/pienten kirjainten, numeroiden ja välimerkkien koodaukseen Ei riittänyt eri maissa käytettäviin erikoismerkkeihin (ä, ö, å, jne) 8-bittisellä ASCII koodilla 2 8 eli 256 merkin koodaus Riitti myös monien maiden erikoismerkkeihin Yleisesti: n-bittisellä koodisanalla esitettävissä 2 n erilaista koodia
7-bittinen ASCII-taulukko
Aakkosellisen tiedon koodaus Useita järjestelmiä muunnoksen tekemiseen Unicode Ohjelmistotalojen kehittämä merkistöstandardi Yksilöivä koodiarvo yli 90 000 erilaiselle kirjoitusmerkille Useimmin käytetty merkistö nykyisin Esimerkkejä merkeistä: http://unicode-table.com/en/
Aakkosellisen tiedon koodaus Myös numeerinen, numeromerkeistä koostuva tieto, voidaan esittää merkkikoodina Numero ei aina tarkoita lukua vaan tulkittavissa numerosarjoiksi vailla arvoa. Esim. Osoitteissa Nimissä Puhelinnumeroissa Henkilötunnuksissa Asiakasnumeroissa
Lukujärjestelmät
Luku ja numero Luku (number) on matemaattinen objekti jolla arvo Numero (digit) on lukujen esittämiseen käytettävä merkki Numerot 0, 1, 2, 3, 4, 5, 6, 7, 8 ja 9 10-järjestelmän luvuissa Numerot 0, 1 2-järjestelmän luvuissa Kun numerot esittävät lukuja, tiedollinen koodaus mahdollista Jos luvuilla lasketaan, lukujen arvojen koodaaminen järkevämpää kuin lukujen numeroiden koodaaminen Tietokoneessa luvut esitetään kaksikantaisen lukujärjestelmän lukuina
Lukujärjestelmät Lukujärjestelmä (number system) jonka kantaluku k, sanotaan k- järjestelmäksi (eli k-ariseksi järjestelmäksi) k-järjestelmässä luvun esittämiseen käytettävissä k numerosymbolia d 0, d 1,, d k-1 Yleisesti käytetyissä positionaalisissa järjestelmissä luvun esityksessä olevan numeron merkitys riippuu paitsi numerosymbolista, myös sen sijainnista muihin numeroihin nähden Esim numeron 5 merkitys luvuissa 150 ja 5002
Lukujärjestelmät - määritelmä K-järjestelmän esitys a n-1 a n-2 a 1 a 0.a -1 a -2 a -(m-1) a -m tarkoittaa lukua a n-1 k n-1 +a n-2 k n-2 + +a 1 k+a 0 +a -1 k -1 +a -2 k -2 + a -(m-1) k -(m-1) +a -m k -m (missä tahansa järjestelmässä laskutoimitukset suoritetaan, yleensä 10) Kukin a i (i=n-1,,1,0,-1,,-m) on jokin d j (d j =0, 1,,k-1) Jos lukujärjestelmä ei käy selväksi, kantaluku voidaan merkitä luvun esityksen perään (a n-1 a n-2 a 1 a 0.a -1 a -2 a -(m-1) a -m ) k
Esimerkki: 10-järjestelmän esitys 5329 kymmenjärjestelmän esityksenä Tarkoittaa lukua: = 5000+ 300 + 20 + 9
Esimerkki: 2-järjestelmä 10-järjestelmäksi Muuntaminen muista järjestelmistä 10-järjestelmään tehdään yleensä käyttäen edellistä määritelmää: 10110 2-järjestelmän esityksenä Tarkoittaa lukua: =16+0+4+2+0=22 kymmenlukujärjestelmässä
Usein käytettyjä lukujärjestelmiä 2-järjestelmä eli binäärijärjestelmä Kantaluku k = 2 Numerosymbolit: 0, 1 8-järjestelmä eli oktaalijärjestelmä Kantaluku k = 8 Numerosymbolit: 0, 1, 2, 3, 4, 5, 6, 7 10-järjestelmä eli desimaalijärjestelmä Kantaluku k = 10 Numerosymbolit: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 16-järjestelmä eli heksadesimaalijärjestelmä Kantaluku k = 16 Numerosymbolit: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Muunnos 10-järjestelmästä k-järjestelmään Algoritmi, syöte luku a 10-järjestelmässä, tulos luku k-järjestelmässä: 1. Jaa a luvulla k 2. a = kokonaisosa jakolaskusta 3. lisää jakojäännöksen numero tulosluvun etummaiseksi 4. Jos a == 0, lopeta 5. Mene kohtaan 1 527
Esimerkki, 10->2 Muunnetaan luku 523 binäärijärjestelmään 523/2 = 261, jakojäännös 1 261/2 = 130, jakojäännös 1 130/2 = 65, jakojäännös 0 65/2 = 32, jakojäännös 1 32/2 = 16, jakojäännös 0 16/2 = 8, jakojäännös 0 8/2 = 4, jakojäännös 0 4/2 = 2, jakojäännös 0 2/2 = 1, jakojäännös 0 1/2 = 0, jakojäännös 1, jakolaskun lopputulos = 0, voidaan lopettaa 528
Esimerkki, 10->2 Muunnetaan luku 523 binäärijärjestelmään 523/2 = 261, jakojäännös 1 261/2 = 130, jakojäännös 1 130/2 = 65, jakojäännös 0 65/2 = 32, jakojäännös 1 32/2 = 16, jakojäännös 0 16/2 = 8, jakojäännös 0 8/2 = 4, jakojäännös 0 4/2 = 2, jakojäännös 0 2/2 = 1, jakojäännös 0 1/2 = 0, jakojäännös 1, Tulos: 523=1000001011 jakolaskun lopputulos = 0, voidaan lopettaa 529
Esimerkki, 10->2 Muunnetaan luku 16 binäärijärjestelmään, lyhennetään jakojäännös=j 16/2 = 8 j=0 8/2 = 4 j=0 4/2 = 2 j=0 2/2 = 1 j=0 1/2 = 0 j=1 jakolaskun lopputulos = 0, voidaan lopettaa Tulos: 16=10000 Tämä luku on jo hyvä muistisääntö bittien lukujärjestykselle: jos luku luettaisiin ylhäältä alaspäin, tulos olisi 00001=1 joka on järjetöntä Alhaalta ylöspäin ei etunollia voi tulla: viimeinen vaihe on aina 1/2 530
Muunnokset muiden järjestelmien välillä 2 Oletetaan, että haluamme muuntaa x-järjestelmästä y-järjestelmään eikä kumpikaan näistä ole 10-järjestelmä Teoriassa edellä kuvatut algoritmit osaavat tehdä muunnoksen suoraan, jos osaisimme laskea laskutoimituksia x tai y-järjestelmässä Ongelma: (Yleensä) emme osaa luontaisesti laskea x- tai y-järjestelmässä jako tai kertolaskuja (laskimella tai päässä) Ratkaisu: Muunnetaan ensin x-järjestelmästä 10-järjestelmään Sitten 10-järjestelmästä y-järjestelmään Edellä kuvatut algoritmit toimivat helposti 532
Lukujärjestelmän muunnokset - esimerkkejä Muunnetaan luku 374 11 4-järjestelmään (10-järjestelmän kautta) 374 11 = 3*11 2 +7*11+4 = 444 10 444/4 = 111, j=0 111/4 = 27, j=3 27/4 = 6, j=3 6/4 = 1, j=2 1/4 = 0, j=1 Siis 374 11 = 12330 4
Lukujärjestelmän muunnokset Desimaaliluvun muunnos 10-järjestelmästä k-järjestelmään: Oletukset: x on luvun kokonaisosa, y luvun desimaaliosa, eli luku on x.y Jaetaan x toistuvasti k:lla (ottamalla osamäärän kokonaisosa aina uudeksi jaettavaksi), kunnes jaettava tulee nollaksi Peräkkäiset jakojäännökset muodostavat k-järjestelmän luvun kokonaisosan numerot alhaalta ylös Desimaaliosan muunnos kertomalla y toistuvasti k:lla (ottamalla tulon desimaaliosa aina uudeksi kerrottavaksi) Peräkkäisten tulojen kokonaisosat muodostavat k-järjestelmän desimaaliosan numerot ylhäältä alas Huom: vaikka desimaaliluku olisi 10-järjestelmässä päättyvä, se voi olla k- järjestelmässä päättymätön (ja päinvastoin)
Desimaaliluvun muunnos esimerkki Muunnetaan luku 123.703125 10 4-järjestelmään Kokonaisosa: 123/4 = 30, jakojäännös 3 30/4 = 7, jakojäännös 2 7/4 = 1, jakojäännös 3 1/4 = 0, jakojäännös 1 Desimaaliosa: 0.703125*4 = 2.8125 0.8125*4 = 3.25 0.25*4 = 1.00 (0.00*4 = 0.00) Lopputulos: 1323.231 4
Tietojenkäsittely ja kantaluvut Tietojenkäsittelijän näkemys: kantaluvun tulisi olla 2:n potenssi Oktaali- ja heksadesimaalijärjestelmät käytössä binäärilukujen yhteydessä Muunnos k-järjestelmän ja k j -järjestelmän välillä helpompi, koska se voidaan tehdä j numeron lohkoissa
Heksadesimaalijärjestelmä Heksadesimaalijärjestelmä (16-järjestelmä) on tavallinen tapa ilmaista lukuja bittien sijaan Muunnos näiden järjestelmien välillä on helppoa: 4 peräkkäistä bittiä vastaa aina yhtä numeroa heksadesimaalijärjestelmässä Voidaan käyttää taulukkoa: Jos taulukon osaa konstruoida, muunnokset ovat todella helppoja Bitteinä 16-järj. Bitteinä 16-järj. 0000 0 1000 8 0001 1 1001 9 0010 2 1010 A (tämä on hyvä tietää, edelliset algoritmit toimivat myös 0011 3 1011 B 0100 4 1100 C 0101 5 1101 D 0110 6 1110 E 0111 7 1111 F 537
Muunnos binäärijärjestelmän ja heksadesimaalijärjestelmän välillä Muunnetaan 10011011101101 heksadesimaaliksi 0 01 0 0 1 1 0 1 1 1 0 1 1 0 1 2 Muunnetaan CD60 binäärijärjestelmään: 6 1 1 0 0 1 1 0 1 E 0 1 1 0 D 0 0 0 0 C D 6 0 B H B H 0000 0 1000 8 0001 1 1001 9 0010 2 1010 A 0011 3 1011 B 0100 4 1100 C 0101 5 1101 D 0110 6 1110 E 0111 7 1111 F
Oktaalijärjestelmä Oktaalijärjestelmä (8-järjestelmä) on toinen toisinaan esiintyvä järjestelmä Koska järjestelmä on kahden potenssi, muunnos voitaisiin jälleen tehdä taulukolla 2-lukujärjestelmän ja 16- lukujärjestelmien välillä 539
Binäärilukujen yhteenlasku allekkain 1 1 1 0 1 0 + 1 1 0 1 1: 1 1 + 1 1 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 Muistakaa ViLLE-tehtävissä aina merkitä muistinumerot jotka ovat ykkösiä, nekin arvioidaan!
Lukualue Laskutoimituksia rajoittaa lukualue Jos käytössä on 4-bittinen esitys, niin yhteenlaskun tuloskaan ei voi koskaan olla yli 4-bittinen Jos edellisessä olisi määritelty, että käytössä on vain 6 bittiä, seitsemäs bitti olisi ollut ns. ylivuotobitti (overflow) Ylivuotobitti ei kuulu laskun lopputulokseen (Tehtävissä kerrotaan aina selvästi käytetty lukualue) + 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1
Kokonaislukujen esittäminen
Kokonaislukujen esittäminen Positiivisen luvun esitys kaksijärjestelmässä sanotaan luvun puhtaaksi binääriesitykseksi Ei riitä negatiivisten lukujen esittämiseen, myös etumerkki pitää esittää Yksinkertainen tapa: lisätään eteen etumerkin kertova bitti Vasemmanpuoleisin eli eniten merkitsevä (most significant) bitti on Positiivisille luvuille 0 Negatiivisille luvuille 1 n bitillä voidaan esittää 2 n binäärilukua, eli kokonaisluvut -2 n-1, 0, 2 n-1-1 Tätä kutsutaan etumerkki+itseisarvo esitykseksi Vielä pitää varmistua siitä, että yhteenlasku toimii Yhteenlasku on perusoperaatio: kaikki muut voidaan johtaa siitä (-,*,/)
Luku Etum.+itseisarvo Etumerkki+itseisarvo-esitys +5 0101 +1 0001 Toimiiko yhteenlasku? Esim. yhteenlasku -2 ja +3 allekkain 1. Muunnetaan -2= -0010 = 1010 2. Lasketaan allekkain: -2 = 1010 +3 = 0011 1101 = -5 Ongelma 1: Positiivisten ja negatiivisten lukujen lukusuorat kulkevat eri suuntaan Positiivisten lukujen binääriesityksen itseisarvo kasvaa kun luku kasvaa Negatiivisten lukujen pienenee kun luku kasvaa +0 0000-0 1000-1 1001-5 1101 Ongelma 2: Nollalla on kaksi esitystä: plus nolla ja miinus nolla
Luku 1:n komplementti Yhden komplementtiesitys +5 0101 +1 0001 Komplementoidaan negatiivisten lukujen itseisarvo-osat Nollat ykkösiksi Ykköset nolliksi Lukusuorien suunnat nyt samat, korjaa ongelman 1 Esim. yhteenlasku -2 ja +3 allekkain 1. Muunnetaan -2 -> 0010 -> 1010 -> 1101 2. Lasketaan allekkain -2 = 1101 +3 = 0011 0000 = (+)0 +0 0000-0 1111-1 1110-5 1010 Vastaus vieläkin väärin, koska nollalla vielä kaksi arvoa, mutta ainakin lukusuorat kulkevat samaan suuntaan
Oltiinko edes lähellä? Kokeillaan muita arvoja: -2 = 1101 +3 = 0011 0000 = (+)0-1 = 1110 +3 = 0011 0001 = 1 0 = 0000 +3 = 0011 0010 = 3 1 = 0001 +3 = 0011 0010 = 4-0 = 1111 +3 = 0011 0010 = 2 Yhteenlasku melkein toimii, mutta on yhden liian pieni kun yhteenlaskettava on negatiivinen Miten korjataan?
Luku 2:n komplementti Kahden komplementtiesitys +5 0101 +1 0001 Siirretään 1:n komplementtiesityksen negatiivisia lukuja yhdellä pykälällä (lisää +1) Nollalle jää vain yksi esitys (+0) Lukualue laajenee yhdellä negatiiviseen suuntaan Esimerkkiyhteenlasku -2 ja +3 allekkain jälleen 1. Muunnetaan -2 -> -0010 -> 1010 -> 1101 -> 1110-2 -> norm.esitys -> etumerkki-> komplementti -> komplementti+1 2. Lasketaan allekain -2 = 1110 +3 = 0011 0001 = +1 +0 0000-0 - -1 1111-5 1011
Kahden komplementtiesitys Kokonaislukujen mekaaninen yhteenlasku toimii siis myös negatiivisilla luvuilla Ensimmäinen bitti kertoo edelleen etumerkin Käytännössä 2:n komplementtiesitys käytössä kaikissa tietokoneissa Voidaan tulkita lukusuoralla: Positiiviset luvut oikealla paikallaan Negatiiviset luvut siirretty posit. oikealle puolelle lisäämällä niihin 2 n Esim.: -2 = 1110 eli -2 + 2 4 = 14 = 1110. Negatiivisen 10-järjestelmän luvun 2:n komplementtiesitys saadaan: Vaihtamalla itseisarvoltaan vastaavan positiivisen luvun esityksen 1 0 ja 0 1 Lisäämällä lukuun sitten yksi
Kahden komplementtiesitys 2 Yksinkertaisesti muunnoksen kahden komplementtiesitykseen voi kuvata seuraavasti: Jos luku on positiivinen, palauta luvun tavallinen binääriesitys Jos luku on negatiivinen: Komplementoi luku kokonaisuudessaan, etumerkkeineen päivineen Lisää saatuun lukuun yksi ja palauta tulos Huomaa, että komplementointi itsessään asettaa jo etumerkin ykköseksi 550
Kahden komplementtiesitys Laskutoimituksia rajoittaa lukualue Oletetaan, että bittejä on käytössä n kappaletta Jos n = 16, esitettävissä luvut -32 768 +32 767 Jos laskutoimitus ei pysy alueen rajoissa, ei tulos 2:n komplementtiesityksessäkään voi olla oikein syntyy ylivuoto Tämäntyyppisessä ylivuodossa ei välttämättä tule ylivuotobittiä, vaan merkkibitti vain vaihtuu kun sen ei pitäisi Esim. +4 = 0100 +5 = 0101 1001 = -7
Kahden komplementtiesitys Laskun tulos ei kuitenkaan ole mitä sattuu: tulos on aina oikein modulo 2 n (n on esityksen pituus) Luvut X ja y ovat kongruentteja modulo m, merkitään x y (mod m), jos x=y+km Missä k on kokonaisluku Esim. -7 9 (mod 16) Lukusuora onkin siis lukusykli Laskutoimitukset esityksen pituuden n määräämällä lukualueella Toisistaan k*2 n verran eroavat luvut ovat siis samassa kohden rengasta mutta eri kierroksella
Excess-koodaus Vielä yksi yleisesti käytetty kokonaislukujen esitystapa Idea: siirretään lukualue a b kokonaan positiiviselle puolelle lisäämällä kaikkiin lukuihin a Esim jos n=4 ja lukualue -8 7 puhutaan excess-8-koodauksesta Kaikkiin lukuihin lisätään siis 2 4-1 =8 Ensimmäinen bitti edustaa etumerkkiä (0 negatiivinen, 1 positiivinen) Aritmetiikka ei yhtä kätevää kuin 2:n komplementtiesityksessä Eräitä teknisiä etuja Esim koodaus säilyttää lukujen suuruusjärjestyksen Luku Excess +5 1101 +1 1001 +0 1000-0 - -1 0111-5 0011
Esimerkki: koodaaminen excess-4-esitykseen Lukualue siis -4 3 Muunnetaan luku 2 Lisätään lukuun 4, 2+4 = 6 6 muunnetaan binäärijärjestelmään tulos: 110 554