Tietorakenteet ja algoritmit

Samankaltaiset tiedostot
Tietorakenteet ja algoritmit

Dynaamiset tietorakenteet

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Rakenteiset tietotyypit Moniulotteiset taulukot

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Tietorakenteet ja algoritmit

Osoittimet ja taulukot

Tietueet. Tietueiden määrittely

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

Osoittimet ja taulukot

Lyhyt kertaus osoittimista

Dynaaminen muisti Rakenteiset tietotyypit

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

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

Algoritmit ja tietorakenteet / HL Copyright Hannu Laine

Muita linkattuja rakenteita

Tietorakenteet ja algoritmit

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Algoritmit ja tietorakenteet / HL 1 Copyright Hannu Laine. Lista. Yleistä

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

3. Binääripuu, Java-toteutus

Tietorakenteet ja algoritmit

Osoitin ja viittaus C++:ssa

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

TIETORAKENTEET JA ALGORITMIT

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

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

Tieto- ja tallennusrakenteet

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

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

Ohjelmointiharjoituksia Arduino-ympäristössä

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

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Algoritmi ja abstraktio

7. Oliot ja viitteet 7.1

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Moduli 5: Kehittyneitä piirteitä

A TIETORAKENTEET JA ALGORITMIT

Arto Salminen,

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

Algoritmit 1. Luento 3 Ti Timo Männikkö

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

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

HELIA 1 (16) Outi Virkki Tietokantasuunnittelu

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

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

Java-kielen perusteet

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

C-ohjelmointi: Osoittimet

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

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Jakso 4 Aliohjelmien toteutus

Loppukurssin järjestelyt

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

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Loppukurssin järjestelyt C:n edistyneet piirteet

4. Lausekielinen ohjelmointi 4.1

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

C-ohjelmointi, syksy 2006

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

samalla seuraavaan puoliavaruuteen (sukupolveen), jota siivotaan harvemmin.

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

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

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

Tiedon sijainti suoritusaikana (3) Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Miten tietoon viitataan? (4)

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

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

Algoritmit 2. Luento 2 To Timo Männikkö

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

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

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

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

4. Luento: Prosessit ja säikeets. Tommi Mikkonen,

11/20: Konepelti auki

Tiedosto on yhteenkuuluvien tietojen joukko, joka tavallisimmin sijaitsee kiintolevyllä, muistitikulla tai jollakin muulla fyysisellä tietovälineellä.

Tietotyypit ja operaattorit

Transkriptio:

Tietorakenteet ja algoritmit Muuttujat eri muisteissa Ohjelman muistialueen layout Paikallisen ja globaalin muuttujan ominaisuudet Dynaamisen muistinkäytön edut Paikallisten muuttujien dynaamisuus ADT ja dynaaminen muisti Käyttäjän valinnan mukaan ADT:n toteuttajan valinnan mukaan Handle-käsite Viitesemantiikka / arvosemantiikka 1

Missä muuttuja voi sijaita? Muuttuja voi sijaita RAM-muistissa Pinossa Data-segmentissä Dynaamisessa muistissa ( heap) Rekisterissä 2

Ohjelman muistialueen layout Command line arguments High address and environment variables Stack Heap Data segment Code segment Low address 3

Esimerkki-ohjelma Data segment int g; void main(void) { Register (probably) register int i; float l1; Stack segment double *d; d = (double*)malloc(sizeof(double)); g = 10; l1 = 1.0; f(); Heap printf("%d", g); // l2 = 'B'; this is not possible void f(void) { Stack segment char l2; l2 = 'A'; printf("%d", g); g = 20; //l1 = 1.1; this is not possible 4

Paikallisen ja globaalin muuttujan ominaisuudet Ominaisuus / Property Näkyvyys / Visibility Elinaika / Lifetime Muistialue / Storage Local Näkyy vain lohkossa, jossa määritelty. Varataan lohkoon tultaessa ja vapautetaan lohkosta poistuttaessa. Stack Global Kaikkialla, jopa ulos tiedostosta. Sama kuin ohjelman elinaika eli niin kauan kuin ohjelma on muistissa Data segment 5

Dynaamisen muistin edut 1) On tarkasti päätettävissä, milloin varaus ja vapautus tapahtuvat ts. Muisti on varattuna tarkalleen vain sen ajan kun sitä tarvitaan. 2) Varattavan muistialueen koko voidaan päättää ajon aikana. 3) Dynaamisen muistialueen koolla ei ole periaatteessa ylärajaa, koska memory management system voi kasvattaa heapin kokoa ajonaikana. (Pino sen sijaan on hyvin rajattu alue ja silla on kiinteä koko). 4) Dynaamista muistia käytettäessä voidaan testata onnistuiko musin varaus. Jos sen sijaan pinossa ei ole enää tilaa tapahtuu stack overflow, joka kaataa koko ohjelman. 6

Paikallisten muuttujien dynaamisuus 1 Näimme, että dynaamisen muuttujan varaushetki ja varattavan alueen koko voidaan määrätä vapaasti ajonaiakana. Paikallisillakin muuttujilla on tiettyä dynaamisuutta: Muuttujan varaushetkeä voidaan säätää lohkotuksilla Muuttujan tulkintatapaa voidaan muuttaa ajonaikana Esimerkki varaushetken ja vapautushetken säädöstä case 1 void main (void) { float arr1[100]; int arr2[100]; //do some calculations for arr1 //do some calculations for arr2 What is the basic difference? case 2 void main (void) { { float arr1[100]; //do some calculations for arr1 { int arr2[100]; //do some calculations for arr2 7

Paikallisten muuttujien dynaamisuus 2 Esimerkki muuttujan tulkintatavan muuttamisesta ajonaikana. void main (void) { char t[2]; t[0] = 1; t[1] = 2: printf( %d, *(int*)t); // tulostuu 513 8

ADT ja dynaaminen muisti Seuraavaksi tarkastelemme erilaisia tapoja hyödyntää dynaamista muistia abstraktien tietotyyppien yhteydessä. Esimerkkinä käytämme jo tuttua pinoa. Lähdetään aluksi siitä, että on olemassa pino, joka esiteltiin osan 6 sivulla 10. Tällöin tietotyypin määrittely oli tällainen: #define N 8 typedef... Titem; typedef struct { Titem array[n]; int top; Tstack; 9

Pinon käyttäjän valinta Pinon käyttäjä, voi valita käyttääkö hän pinoa staattisessa muistissa vai dynaamisessa muistissa. Pino staattisessa muistissa voi main(void) { Tstack stack; initialize_stack(&stack); push(&stack, a ); // jne.. Pino dynaamisessa muistissa voi main(void) { Tstack* stack; stack = (Tstack*) malloc(sizeof(tstack)); initialize_stack(stack); push(stack, a ); // jne free(stack); Näin sovellusohjelmoija saa etuna sen, että pino vie tilaa vain sen ajan kuin sitä tarvitaan ja että pino ei varaa prosessorin pinoa. Alkioiden ylärajarajoitus edelleen voimassa. 10

Pinon toteuttajan valinta 1 Pinon toteuttaja voi päättää, että pinoa käytetään vain dynaamisessa muistissa. Pinon toteuttaja tekee mahdottomaksi käyttää pinoa staattisessa muistissa. Pinon toteuttaja tekee dynaamisen muistin käytön helpoksi ja itse asiassa näkymättömäksi pinon käyttäjälle. Tietotyyppi määritellään silloin näin: #define N 8 typedef... Titem; typedef struct { Titem array[n]; int top; * Tstack; Lisäksi operaatiofunktioiden valikoimaan lisätään funktiot Tstack create_stack(void); void destroy_stack(tstack stack); 11

Pinon toteuttajan valinta 2 Pinon käyttö näyttää silloin seuraavalta. voi main(void) { Tstack stack; // stack is now a handle stack = create_stack(); push(stack, a ); // jne destroy_stack(stack); Huomautus. Nyt siis funktiossa create_stack varataan tila tietueelle, jossa on kentät array ja top. Samassa funktiossa tehdään myös ne toimenpiteet, jotka aikaisemmin tehtiin funktiossa initialize_stack. Huomautus. Funktio create_stack olisi tietysti voitu edelleen pitää initialize_stack nimisenä. Nyt muuttuja stack ei siis ole itse tietue, jossa on pinon tiedot. Se on osoitin itse tietoon. Käytetään myös termiä kahva (handle), viite tai viittaus (reference). Kyseessä on ns. viitesemantiikka, jota käytetään Javassa. Huomaa, että sovelluksessa ei ole pinoon viitattaessa missään osoiteoperaattoreita (&) eikä funktioiden prototyypeissä osoittimia (*). Javassa ei ole osoittimia tarkoittaa siis, että muuttujat ovat aina osoittimia. 12

Lisää esimerkkejä handle-käsitteestä Tiedostojen käsittely C:ssä handlen avulla: FILE *f ; // muuttuja f on handle f = fopen( A:\\text.txt, wt ); //get the handle //Tämän jälkeen tiedostoa käytetään kahvan f avulla fprintf(f, Title ); fprinff( f, %4d%-10s%5.2f, 12, abcdefg, 12.34);... fclose(f); Ikkunat Windows käyttöjärjestelmässä: HANDLE whnd; //whnd on ikkunan handle whnd = CreateWindow(windowClassName, windowtitle, windowstyle, locx, locy, width, height, handleofparent, handleofmenu, handleofapplication, lpwindowcreationdata); MoveWindow(whnd, newlocx, newlocy, newwidth, newheight, repaint);... CloseWindow(whnd); DestroyWindow(whnd); 13

Lisää handle-periaatteesta Java-kielessä on siis käytössä viitesemantiikka. C-kielessä on käytössä arvosemantiikka. Kuten opimme, C-kielessä voidaan toteuttaa abstrakteja tietotyyppejä, jotka toimivat viitesemantiikan mukaisesti. Viitesemantiikan eli handle ajattelun haittana on mm. se, että sijoitus ei toimi : Esimerkkinä tapaus jossa sijoitetaan "kopio" ja tuhotaan alkuperäinen, jolloin myös kopio häviää! Tarvitaan oma funktio Copy korvaamaan sijoitus. void main ( void ) { Tstack stack, kopio; // stack is now a handle stack = create_stack(); kopio = create_stack(); push(stack, a ); push(stack, b ); kopio = stack; // Muistivuoto!! destroy_stack(stack); // Myös kopio häviää!! destroy_stack(kopio); // Myös tämä on ongelma. Miksi? 14

Muita tapoja hyödyntää dynaamista muistia Olemme nähneet kaksi tapaa hyödyntää dynaamista muistia pinon tapauksessa, kun pinon tietoalkiot ovat edelleen vakiokokoisessa taulukossa. Osassa 7 sivulla 3 on esitetty pino, jossa taulukko varataan dynaamiselta alueelta. Tietomäärittely oli silloin #define INCR_SIZE 4 stack typedef... Titem; Dynaaminen muisti typedef struct { Titem* array; array int size; size int top; Tstack; top Myös tällaista pinoa voidaan käyttää dynaamisessa muistissa, joko pinon käyttäjän valinnan perusteella tai pinon toteuttajan päätöksellä handlena, kuten alla voi main(void) { Tstack stack; // stack in now a handle stack = create_stack(); Tällöin tilanne muistissa näyttää kuten kuvassa. 15