Rakenteiset tietotyypit Moniulotteiset taulukot

Samankaltaiset tiedostot
Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

Dynaaminen muisti Rakenteiset tietotyypit

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

Osoittimet ja taulukot

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

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt

Tieto- ja tallennusrakenteet

Tietueet. Tietueiden määrittely

Tietorakenteet ja algoritmit

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

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Lyhyt kertaus osoittimista

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

Moduli 5: Kehittyneitä piirteitä

Osoittimet ja taulukot

Tietorakenteet ja algoritmit

TIETORAKENTEET JA ALGORITMIT

Tietorakenteet ja algoritmit

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

Osoitin ja viittaus C++:ssa

A TIETORAKENTEET JA ALGORITMIT

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

C-ohjelmointi: Osoittimet

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Algoritmit 1. Luento 6 Ke Timo Männikkö

Ohjelmointi 1 Taulukot ja merkkijonot

18. Abstraktit tietotyypit 18.1

ITKP102 Ohjelmointi 1 (6 op)

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

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

Tietorakenteet ja algoritmit

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 1. Luento 4 Ke Timo Männikkö

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

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

Olio-ohjelmointi Syntaksikokoelma

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

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

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

Harjoitustyö: virtuaalikone

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

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

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

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

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

Tietorakenteet ja algoritmit

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

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

C-ohjelmointi, syksy 2006

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

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

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

7. Oliot ja viitteet 7.1

Muuttujien roolit Kiintoarvo cin >> r;

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

Tietorakenteet ja algoritmit

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Taulukot. Jukka Harju, Jukka Juslin

Algoritmit 2. Luento 2 To Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

13 Operaattoreiden ylimäärittelyjä

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

Jakso 4 Aliohjelmien toteutus

15. oppitunti. Taulukot. Osa. Mikä on taulukko?

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

7/20: Paketti kasassa ensimmäistä kertaa

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Listarakenne (ArrayList-luokka)

Dynaamiset tietorakenteet

Algoritmit 2. Luento 2 Ke Timo Männikkö

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

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

3. Binääripuu, Java-toteutus

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

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

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

Ohjelmoinnin jatkokurssi, kurssikoe

Tietorakenteet ja algoritmit

Luento 4 Aliohjelmien toteutus

Binäärioperaatiot Tiedostot ja I/O

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Tietorakenteet ja algoritmit

Harjoitus 4 (viikko 47)

Muita linkattuja rakenteita

Ohjeet. Jaa vastauksesi konsepteille siten, etta:

Algoritmit ja tietorakenteet / HL Copyright Hannu Laine

Tietorakenteet ja algoritmit - syksy

815338A Ohjelmointikielten periaatteet

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssien laaja oppimäärä

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Transkriptio:

C! Rakenteiset tietotyypit Moniulotteiset taulukot 22.2.2018

Agenda Rakenteiset tietotyypit Vilkaisu 6. kierroksen tehtäviin Moniulotteiset taulukot Esimerkki Seuraava luento to 8.3. Ilmoittautuminen ohjelmointikokeeseen aukeaa maaliskuun alussa 2

Tietotyypeistä Toistaiseksi ollaan tarkasteltu primitiivisiä tietotyyppejä ja taulukoita Esimerkiksi funktiolle välitetty kukin tyyppi erikseen Rakenteisella tietotyypillä voidaan useita muuttujia koota yhteen omaksi tietotyypikseen Rakenteista tietotyyppiä voidaan käyttää kaikkialla missä on muitakin tietotyyppejä Funktion parametrit ja paluuarvo, muuttujat Monissa muissa kielissä luokat hieman vastaavia C:n rakenteet sisältävät tietoa, ei toimintoja 3

Osoittimet tietorakenteessa #include <stdlib.h> #include <string.h> struct person { char *name; int age; }; int main(void) { struct person lady; struct person dude; const char *n1 = "Kirsi"; name asettaminen kannattaa tehdä huolella Suora sijoitus lady.name = Kirsi asettaisi viittauksen kirjoitussuojattuun muistiin (olisi ok jos const char* name) } lady.name = malloc(strlen(n1) + 1); strcpy(lady.name, n1); lady.age = 22; Tässä tapauksessa tila merkkijonolle varattava dynaamisesti 4

Tietueen kopiointi struct person lady = { "Kirsi", 22 }; struct person dude; dude = lady; // what?? lady: char *name = 0x01A5 int age = 22 0x01A5 (read-only) Kirsi\0 dude: char *name = 0x01A5 int age = 22 5

Tietorakenteen syväkopiointi struct person { char *name; int age; }; struct person personcopy(struct person orig) { struct person new; new.name = malloc(strlen(orig.name) + 1); strcpy(new.name, orig.name); new.age = orig.age; return new; } const char *name = 0xA110 int age = 22 const char *name = 0xA125 int age = 22 Kirsi\0 Kirsi\0 6

Taulukko tietueen jäsenenä Taulukko kopioituu tietueen osana myös Kätevä ominaisuus: paljasta taulukkoa ei voi kopioida sijoittamalla Tietueen osana taulukon kopiointi helpottuu voidaan myös välittää taulukko funktiolle ja palauttaa taulukko funktiosta struct person { char name[40]; int age; }; 7

Tietueen kopiointi lady: struct person { char name[40]; int age; }; struct person lady = { "Kirsi", 22 }; struct person dude; dude = lady; Tietorakenteen koko nyt isompi kuin aiemmissa esimerkeissä char name[40] = int age = 22 dude: char name[40] = int age = 22 Kirsi\0 Kirsi\0 Nyt nimeä voi muuttaa vaikuttamatta toiseen tietueeseen 8

Rakenteinen tietotyyppi osoittimena (Katso materiaali) 10

Dynaaminen taulukko Yhden alkion koko tavuina: [0] sizeof(struct oodi) [1] [2] struct oodi *array student course grade 0 struct date strlen(array[0].course) + 1 Oleellinen funktio taulukon varaamisessa: realloc 12

Linkitetty lista (tehtävä Jono ) struct queue first last - Kukin listan elementti on varattu dynaamisesti erillisellä malloc:lla - Kukin elementti sisältää muistiviittauksen seuraavaan elementtiin - Tässä: viittaukset listan alkuun ja loppuun struct student student 0 name next student name next 0 student name next 0 13

Linkitetty lista (tyhjä) struct queue first last 14

Linkitetty lista (ensimmäinen alkio) first last struct queue - Varaa muistia struct student:lle (muista name-merkkijono) - Linkitä first- ja last-osoittimet (mallocin palauttama osoite) - Next-osoitin alustetaan NULL struct student student 0 name next 15

Linkitetty lista (alkion lisääminen) struct queue first last - Varaa muisti struct studentille (muista name) - Linkitä listan viimeisen alkion next-osoitin tähän uuteen - Päivitä last-osoitin uuteen viimeiseen alkioon struct student student 0 name next struct student student 0 name next 16

Linkitetty lista (alkion poistaminen) struct queue first last - Aseta poistettavaa edeltävä next-osoitin osoittamaan poistettavaa seuraavaan alkioon (tai NULL jos viimeinen) - Vapauta muisti poistettavan alkion osalta - Huom: erikoistapaukset ensimmäinen tai viimeinen struct student student 0 name next student name next 0 student name next 0 17

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ä 18

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"); } 19

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 20

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] 21

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 * int 0x8a15 1 2 3 0x8a28 0x8a3a 4 5 6 7 8 9 22

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 23

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.) 24

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 25

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 }; 26

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" }; 27