Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

Samankaltaiset tiedostot
Rakenteiset tietotyypit Moniulotteiset taulukot

Binäärioperaatiot Tiedostot ja I/O

Binäärioperaatiot Tiedostot ja I/O

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Osoittimet ja taulukot

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

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

Loppukurssin järjestelyt

1. Mitä seuraava ohjelma tulostaa? Vastaukseksi riittää yksi rivi joka esittää tulosteen. (6 p)

Lyhyt kertaus osoittimista

Loppukurssin järjestelyt C:n edistyneet piirteet

Tietueet. Tietueiden määrittely

Osoittimet ja taulukot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Tieto- ja tallennusrakenteet

Tietorakenteet ja algoritmit

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

Dynaaminen muisti Rakenteiset tietotyypit

Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

Tietotyypit ja operaattorit

Tiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto

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

Moduli 5: Kehittyneitä piirteitä

MAINOSTILA MAINOSTILA MAINOSTILA. Maisema Luonto 2011 MAINOSTILA. Koko: 300 x 400 mm. + mainostila

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Kappale 20: Kantaluvut

OHJ-1010 Tietotekniikan perusteet 4 op Syksy 2012

SELECT-lauseen perusmuoto

Harjoitustyö: virtuaalikone

Tietorakenteet ja algoritmit

ITKP102 Ohjelmointi 1 (6 op)

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Algoritmit 2. Luento 3 Ti Timo Männikkö

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

Ohjelmointi 1 Taulukot ja merkkijonot

Harjoitus 5 (viikko 48)

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

Ohjelmoinnin perusteet Y Python

Paavo Räisänen. Ohjelmoijan binaarialgebra ja heksaluvut.

Tietorakenteet ja algoritmit

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

Osoitin ja viittaus C++:ssa

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

13 Operaattoreiden ylimäärittelyjä

Ohjelmoinnin peruskurssi Y1

Modulaarisessa ohjelmoinnissa jaetaan ohjelma osiin (moduuleihin), jotka ovat yksinkertaisia ja lyhyitä.

Tietorakenteet ja algoritmit

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

C-ohjelmointi, syksy 2006

C-ohjelmointi, syksy Yksiulotteiset taulukot Moniulotteiset taulukot Dynaamiset taulukot. Binääritiedostot. Luento

Tietorakenteet ja algoritmit

Luennon sisältö. Taulukot (arrays) (Müldnerin kirjan luku 10) Yksiulotteiset taulukot. Mikä taulukko on? Taulukko-osoitin. tavallinen osoitin

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

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

ITKP102 Ohjelmointi 1 (6 op)

MAINOSTILA MAINOSTILA MAINOSTILA. Maisema Luonto 2012 MAINOSTILA. Koko: 290 x 400 mm + mainostila

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

811120P Diskreetit rakenteet

13. Loogiset operaatiot 13.1

Harjoitus 2 (viikko 45)

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

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

C-kieli mahdollistaa hyvin tiiviin ja samalla sekavan tavan esittää asioita, kuitenkin hyvän ohjelman tulisi olla mahdollisimman helppolukuinen ja

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

2.8. Kannanvaihto R n :ssä

Taitaja2005/Elektroniikka. 1) Resistanssien sarjakytkentä kuormittaa a) enemmän b) vähemmän c) yhtä paljon sähkölähdettä kuin niiden rinnankytkentä

OPPITUNTI15 Päivämäärien käsittely

if-lauseen yksinkertaisin muoto on sellainen, missä tietyt lauseet joko suoritetaan tai jätetään suorittamatta.

Sisältö. C-ohjelmointi Luento 5: Osoittimet. Keko (heap) Pino (stack) Muistinhallinta Java vs C. Prosessin rakenne

Ohjelmoijan binaarialgebra ja heksaluvut

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

Ohjelmoinnin perusteet Y Python

Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

Ohjelmoinnin peruskurssi Y1

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmoinnin perusteet Y Python

Digitaalitekniikan matematiikka Luku 10 Sivu 1 (14) Lukujärjestelmämuunnokset. 2 s s

C-ohjelmointi: Osoittimet

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin peruskurssi Y1

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

Ohjausrakenteet. Valinta:

Ohjelmoinnin peruskurssi Y1

11/20: Konepelti auki

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Perustietotyypit ja laskutoimitukset

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Transkriptio:

C! : Moniulotteiset taulukot & Bittioperaatiot 15.3.2016

Agenda Pieni kertausharjoitus Moniulotteiset taulukot Esimerkki taulukoista Tauko (bittitehtävä) Binäärioperaatioista Esimerkki (vilkaistaan IP tehtävää) 2

Harjoituspalautteet difficulty usefulness count 3

Kierroksen läpäisseet 600 500 400 300 200 2012 2013 2014 2015 2016 100 0 M1 M2 M3 M4 M5 M6 tentti 4

Tiedotteita Harjoitusvuoroja ei tällä viikolla Pääsiäisen vuoksi ei harjoituksia pe 25.3. eikä ma 28.3. Korvaavat vuorot ti 29.3. pe 1.4. Tehtävät kuitenkin jo auki, kannattaa tehdä / kysyä IRC:ssä Ei luentoa ti 12.4. Päällekkäin ELECarnevalin kanssa Mikäli mielenkiintoa, luento voidaan pitää ti 19.4. Viimeinen luento ti 26.4. Harjoitustentti ja kertausta 5

Pieni kertausharjoitus http://presemo.aalto.fi/c15 6

Moniulotteiset taulukot Moniulotteinen taulukko C:ssä on taulukoista koostuva taulukko Kurssilla keskitytään kaksiulotteisiin taulukoihin, mutta ulottuvuuksia voi olla kuinka monta tahansa Moniulotteinen taulukko voidaan muodostaa eri tavoin Staattinen: ulottuvuudet määräytyvät määrittelyvaiheessa. Dynaaminen: koko määräytyy ajon aikana, tarvittava tila varataan malloc:lla keosta Esim: varataan taulukko, jossa osoittimet yksiulotteisiin taulukoihin Taulukko merkkijonoja, eli kaksiulotteinen taulukko merkkejä 7

Esimerkki staattisesta taulukosta #include <stdio.h> int main(void) { int matrix[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}}; int i,j; } // Print the matrix in rectangular format for (j = 0; j < 3; j++) { for (i = 0; i < 3; i++) { printf("%d ", matrix[j][i]); } printf("\n"); } 8

Edellinen taulukko muistissa Kaikki alkiot peräkkäisissä muistipaikoissa Periaatteessa voisi ottaa osoittimen ensimmäiseen alkioon, ja iteroida kuten yhdeksän alkion yksiulotteista taulukkoa Eli: int *p = &matrix[0][0]; kasittele(*p++); jne int matrix[3][3] 1 2 3 4 5 6 7 8 9 9

Moniulotteinen taulukko funktioparametrina Staattisen taulukon välittäminen funktiolle vaatii tarkkuutta syntaksin kanssa Taulukko taulukoita vs. taulukko osoittimia Jatkoa edelliseen esimerkkiin void printarray(int arr[][3]) { int i,j; // Print the matrix in rectangular format for (j = 0; j < 3; j++) { for (i = 0; i < 3; i++) { printf("%d ", arr[j][i]); } printf("\n"); } } int arr[][3]! tai int (*arr)[3]! 10

Kaksiulotteinen taulukko ja osoittimet Kaksiulotteinen taulukko voidaan esittää osoittimien avulla, esim. kolme riviä int-osoittimia int *array[3];! Kolme riviä int-osoittimia (jotka kukin osoittavat taulukon alkuun) Rivit asetettava erikseen tai esim. varattava dynaamisesti! int * 0x8a15 1 0x8a28 0x8a3a int 2 3 4 5 6 7 8 9 11

Useamman asteen osoittimet int** tarkoittaa osoitinta osoittimeen, jonka päässä on kokonaisluku int ** int * int 0x1008 0x8a15 1 Näin voidaan esittää myös kaksiulotteinen taulukko Koska osoittimella voidaan viitata taulukon ensimmäiseen alkioon Myös muita käyttöjä Esim. osoittimen palauttaminen parametrin kautta 12

Useamman asteen osoittimet int** ja kaksiulotteinen taulukko int ** int * int 0x1008 0x8a15 1 2 3 0x8a28 4 5 6 0x8a3a 7 8 9 Taulukkojen koot täytyy tietää jollain tapaa (muuttuja, loppumerkki, tms.) 13

Moniulotteinen taulukko dynaamisesti varattuna 2-ulotteinen taulukko voidaan varata kokonaan dynaamisesti (mallocin avulla) Ensin varataan 1-ulotteinen taulukko osoittimia varten Sitten varataan 1-ulotteiset taulukot kullekin riville (voidaan varata myös muilla tavoin) Vapautus pitää muistaa hoitaa oikein Käänteisessä järjestyksessä Ensin vapautetaan kukin rivi Lopuksi päällimmäinen taulukko, jossa osoittimet riveihin 14

Merkkijonotaulukko Yleinen kaksiulotteisen taulukon tapaus Merkkijono on taulukko merkkejä (char) taulukko merkkijonoja on kaksiulotteinen taulukko merkkejä Taulukon eri rivit (merkkijonot) voivat olla keskenään eri mittaisia Kaksi erilaista tapaa Vakiomerkkijonot tai dynaamisesti varatut: taulukko osoittimia const char *lista[] = { Yksi, Kaksi, Kolme }; Pinosta varatut muokattavat merkkijonot: taulukko taulukoita char lista[][6] = { Yksi, Kaksi, Kolme }; 15

Esimerkki merkkijonotaulukosta Vakiomuotoiset merkkijonot: #include <stdio.h> int main(void) { char *months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; } for (int i = 0; i < 12; i++) { printf("%s\n", months[i]); } Muokattavat merkkijonot (varataan 20 merkkiä kullekin): char months[12][20] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; 16

http://presemo.aalto.fi/cbits A) 0110 heksadesimaalimuodossa B) 0x37 binäärimuodossa C) 0xB3 binäärimuodossa D) 0101 & 1100 E) 0101 1100 F) 6 & 1 G) 0100 1100 << 2 H) 0x4C >> 4 source: eugbug.hubpages.com 17

Binääriluvut Laitteistolle luonnollinen tapa käsitellä tietoa Tietokone on (iso) sarja kytkimiä jotka ovat joko päällä tai pois Kaikki isommat lukuarvot rakentuvat biteistä Esim tietokoneen muistissa 10-järjestelmän 6 == 110 bitteinä Binäärilukuja ei voi suoraan esittää standardi C-kielellä (jotkut kääntäjät toteuttavat oman binäärivakio-esitysmuotonsa) Esitetään usein heksadesimaalivakioiden avulla Yksi heksadesimaalimerkki vastaa neljää binäärimerkkiä (bittiä) 18

Heksadesimaaliluvut 16-kantainen lukujärjestelmä Voidaan helposti muuntaa binääriluvuiksi (koska 16 == 2 4 ) Yksi heksadesimaalimerkki vastaa neljää bittiä Yksi tavu (= 8 bittiä) mahtuu kahteen heksamerkkiin C-kielessä heksavakiot esitetään 0x - alkuliitteellä 16 merkkiä: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 0xF == 15, 0x10 == 16, 0x1F == 31, 0x20 == 32, Printf ja scanf tulostusformaatti: %x tai %X Vaikka esitystapa vaihtuu, luku pysyy samana 19 == 0x13 == 00010011 19

Lukujärjestelmien vertailua 20

Bittitason operaattorit Lukujen bittisisällön käsittelyyn Vastaavat loogisia operaattoreita (AND, OR, NOT) Loogiset operaattorit (&&,,!) palauttavat kokonaisluvun 0 tai 1 Binäärioperaattorit (&,, ~, ^) muokkaavat lukua yksittäisten bittien tasolla Kaksi lukua käydään läpi bitti kerrallaan, tuloksena syntyy uusi luku kokonaisluvun arvoksi voi tulla muutakin kuin 0 tai 1 Vertailuehdoissa kannattaa olla tarkkana Esim. && vs. & Toimivat vain kokonaislukutyypeillä 21

Bittitason JA A & B: Jos sekä A- ja B-bitti ovat 1, tulos on 1. Muuten tulos on 0 22

Bittitason TAI A B: Jos joko A - tai B - bitti on 1, tulos on 1. Jos molemmat ovat 0, tulos on 0 23

Bittitason poissulkeva TAI A ^ B: Jos vain jompikumpi bitti on 1, tulos on 1. Jos molemmat bitit ovat samoja, tulos on 0 24

Bittitason EI ~A: Käännä bittien tila vastakkaisiksi: 0:sta tulee 1; 1:stä tulee 0 25

Esimerkki bittitason operaatioista int main(void) { unsigned char a = 0x69; // 01101001 unsigned char b = 0xca; // 11001010 printf("a & b = %x\n", a & b); unsigned char c = a b; } printf("a b = %x\n", c); b ^= a; // b = b ^ a printf("a ^ b = %x\n", b); printf("~a = %x\n", ~a); printf("~a & 0xff = %x\n", ~a & 0xff); Tulostuu: a & b = 48 a b = eb a ^ b = a3 ~a = ffffff96 ~a & 0xff = 96 26

Bittien siirtäminen >> operaattori siirtää bittejä oikealle Vastaa kahden potenssilla jakamista << - operaattori siirtää bittejä vasemmalle Vastaa kahden potenssilla kertomista Käytetään kokonaislukutyypin kanssa Arvoalueen ulkopuolelta siirtyvien bittien paikalle tulee 0 27

Bittien siirtäminen -- esimerkkejä 105 210 105 52 105 164 105 144 28

2 tavun paketti 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 A B 29