Sisältö. Tietue - Määrittely. Tietueet (struct) Tietue - Rakenne. Tietue - Käyttö. C-ohjelmointi Luento 6: tietueet ja joukot

Samankaltaiset tiedostot
ltö Tietue - Rakenne C-ohjelmointi Luento 6: tietueet ja joukot muistialue. viittausten yksinkertaistamiseksi kenttien

Sisältö. C-ohjelmointi Luento 6: tietueet ja joukot Tiina Niklander. Tietueet (struct) Määrittely Rakenne Käyttö

struct info { typedef struct InfoT { char firstname[20]; char firstname[20]; char lastname[20]; char lastname[20]; int age; int age;

ltö C-ohjelmointi Luento 6: tietueet ja joukot Tietueet (struct( struct) Lueteltu tyyppi (enum( enum) Union Linkitetty lista

Lyhyt kertaus osoittimista

Tietueet. Tietueiden määrittely

TIETORAKENTEET JA ALGORITMIT

Rakenteiset tietotyypit Moniulotteiset taulukot

Tietorakenteet ja algoritmit

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

A TIETORAKENTEET JA ALGORITMIT

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

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

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

18. Abstraktit tietotyypit 18.1

Tietorakenteet ja algoritmit

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

Tietorakenteet ja algoritmit

Ohjelmoinnin peruskurssien laaja oppimäärä

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

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Ohjelmoinnin peruskurssien laaja oppimäärä

Tietorakenteet ja algoritmit

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

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

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

Dynaaminen muisti Rakenteiset tietotyypit

Muuttujien roolit Kiintoarvo cin >> r;

Algoritmit 2. Luento 2 To Timo Männikkö

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

Algoritmit 1. Luento 4 Ke Timo Männikkö

Ohjelmoinnin perusteet Y Python

C-ohjelmointi, syksy 2006

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

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

Tietorakenteet ja algoritmit

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

Algoritmit 2. Luento 2 Ke Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

ITKP102 Ohjelmointi 1 (6 op)

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Java-kielen perusteet

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

Osoitin ja viittaus C++:ssa

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

Algoritmit 2. Luento 7 Ti Timo Männikkö

Olio-ohjelmointi Syntaksikokoelma

Ohjelmoinnin peruskurssien laaja oppimäärä

Listarakenne (ArrayList-luokka)

ITKP102 Ohjelmointi 1 (6 op)

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

3. Binääripuu, Java-toteutus

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

Tietorakenteet ja algoritmit

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Rakenne. C-ohjelmointi: Tietorakenteita ja tyyppejä. Tyyppimuunnoksia aritmeettisten tyyppien välillä. Tyyppimuunnokset. & (bitti and) Bittioperaatiot

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

C-ohjelmointi: Osoittimet

Tieto- ja tallennusrakenteet

Jakso 4 Aliohjelmien toteutus

Algoritmit 1. Luento 9 Ti Timo Männikkö

Luento 3: Tietorakenteiden esittäminen

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Osa VII. Mitä mallit ovat ja kuinka niitä käytetään Miksi mallit tarjoavat paremman vaihtoehdon makroille Kuinka luokkamalleja luodaan

Java-kielen perusteet

Harjoitustyö: virtuaalikone

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

Taulukot. Jukka Harju, Jukka Juslin

Algoritmit 1. Luento 12 Ti Timo Männikkö

Ohjelmointi 1 Taulukot ja merkkijonot

Algoritmit 1. Luento 12 Ke Timo Männikkö

815338A Ohjelmointikielten periaatteet

Algoritmit 1. Demot Timo Männikkö

Java kahdessa tunnissa. Jyry Suvilehto

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

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

13 Operaattoreiden ylimäärittelyjä

ITKP102 Ohjelmointi 1 (6 op)

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Loppukurssin järjestelyt C:n edistyneet piirteet

Algoritmit 1. Luento 6 Ke Timo Männikkö

2. Perustietorakenteet

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Harjoitus 4 (viikko 47)

4. Olio-ohjelmoinista lyhyesti 4.1

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

Tietorakenteet ja algoritmit

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Transkriptio:

Sisältö C-ohjelmointi Luento 6: tietueet ja joukot 21.2.2006 Tiina Niklander Tietueet (struct) Määrittely Rakenne Käyttö Lueteltu tyyi (enum) Joukot (union) Määrittely Rakenne Käyttö Linkitetty lista Tietueet (struct) Tietue - Määrittely Tietueessa voi olla vain datakenttiä (vrt. luokka) Tietueen kentät voivat olla keskenään erilaisia. Kenttiä ei voi iilottaa, vaan ne kaikki näkyvät (vrt. ublic). Ajatellaan hetkinen Javan luokkatoteutusta Pikkuvarasto (A.Wiklan Java-kurssi). Tällä luokalla on metodi vievarastoon. Metodikutsu x.vievarastoon(y) koskettaa kahta oliota: This, tässä x ja y, joka välitettiin arametrina C:ssä voi vastaavaa toimintaa jäljitellä, mutta tuo this on välitettävä funktiolle arametrina, joten C:ssä vastaava funktio olisi muotoa vievarastoon(x,y); struct info char Name[20]; ; struct info i1, i2; Tietueen kenttiin viitataan muodolla nimi.kenttänimi: 1.age = 18; rintf("%s\n", i2.name); tyedef struct InfoT char Name[20]; InfoT; InfoT 1; Suositeltavin taa struct info char Name[20]; k1, k2; Tietue - Rakenne Tietueelle varataan yhtenäinen muistialue. Kuitenkin muistialueen koko voi olla eri kuin kenttien yhteenlasketut koot, koska viittausten yksinkertaistamiseksi kenttien välejä saatetaan jättää käyttämättä. Esim: sizeof(infot)?>=? 40*sizeof(char)+sizeof(int) Tietue - Käyttö InfoT i1, i2; Tietueen sijoittaminen toiselle i1 = i2 koioi tietueen sisällön bitti kerrallaan täsmälleen samanlaisena, mutta ei seuraa kentissä mahdollisesti olevia osoittimia. Tietueita EI voi verrata suoraan: i1 == i2 vaan vertailu on tehtävä itse: strcm(i1.name, i2.name) == 0 && strcm(i1.lastname, i2.lastname) == 0 && i1.age == i2.age 1

Sisäkkäiset tietueet Tietueen kenttinä voi olla myös tietueita e1: tyedef struct info: Name: lastname: age: char Name[20]; InfoT; tyedef struct InfoT info; salary: double salary; EmloyeeT; EmloyeeT e1; e1.info.age = 21; e1.salary = 125.6; Tietueita käsitellään usein osoitinmuuttujan kautta: (*).x tai ->x PairT w; PairTP q; PairTP = &w; Osoitin tietueeseen tyedef struct double x; double y; PairT,, *PairTP* PairTP; PairT x; PairTP ; if((q = malloc(sizeof(pairt))) == ) if((q = malloc(sizeof(struct ))) == ) w.x = 2; ->x = 1; (*).x = 1; *.x = 1; q->y = 3.5; tietue viitearametrina void constructorp(pairtp this, double x, double y) this->x = x; this->y = y; Funktio saa osoittimen Kutsujan aiemmin varaaman tietueen PairT w; muistialueeseen. PairTP ; constructorp(&w,, 1, 2); if(( = malloc(sizeof(pairt))) == ) error; constructorp(,, 1, 2); tietue aluuarvona Funktio voi alauttaa kokonaisen tietueen. Silloin kutsujan on tehtävä alautetusta tietueesta koio, koska alkueräinen vaautuu inosta funktiosta alattua. PairT constructorfunc(double x, double y) PairT ;.x = x;.y = y; Pinossa alautettu return ; tietue on koioitava heti talteen. PairT w = constructorfunc(1, 2.2); /* koio */ osoitin aluuarvona Funktio varaa tilan tietueelle, jolloin kutsujan vastuulle jää vaauttaa tuo varattu tila. PairTP constructor(double x, double y) /* client resonsible for deallocation */ PairTP ; if(( = malloc(sizeof(pairt))) == ) ->x = x; Funktio varaa tilan tietueelle ->y = y; Ja alauttaa osoittimen siihen return ; Kutsuja vaauttaa tilan myöhemmin. PairTP 1 = constructor(1, 2); free(1); osoitin aluuarvona Käyttö toisen funktion arametrina: int comare(const PairTP, const PairTP q) return ->x == q->x q && ->y == q->y; q PairTP 2 = constructor(1, 3); PairTP 3 = constructor(2, 6); int i = comare(3, 2); free(2); free (3); Vältä muistivuotoa! i = comare(1, constructor(3.5, 7)); Tässä kadotetaan osoitin tietueeseen, joten muisti jää vaauttamatta 2

Muistilohko tietueista Muistilohkon käsittely ei riiu lohkon alkioiden tyyistä. Tietueen omiin alkioihin viittaus kuten itsenäisissäkin tietueissa. PairTP rectangle; PairTP aux; double x, y; rectangle if((rectangle= = malloc(4*sizeof(pairt sizeof(pairt)))== )))==) )error; for(aux = rectangle; aux < rectangle + 4; aux++) rintf("enter two double values:"); if(scanf("%lf%lf", ", &x, &y)!= 2) /* error */ break; constructorp(aux,, x, y); Osoitinlohko tietueisiin Mahdolliset viittaustavat: rectangle[1][0].x rectangle[1]->x (rectangle+1)->x rectangle PairTP *rectangle; for(i = 0; i < 4; i++) rintf("enter two double values:"); if(scanf("%lf%lf", ", &x, &y)!= 2) error; if((rectangle[i] ] = constructor(x,, y)) == ) error; for(i = 0; i < 4; i++) rintf("vertex %d = (%f %f)% f)\n", i, rectangle[i][0].x, rectangle[i][0].y); 1 x y Lueteltu tyyi (enum) Luetellun tyyin määrittelemät järjestetyt vakiot vastaavat järjestyksessä kokonaislukuja 0,1,2 jne. Numeroinnin voi myös aloittaa haluamastaan arvosta tyedef enum ocodes lvalue, rvalue, ush, lus OcodesT; enum ocodes e; OcodesT f; int i = (int)rvalue( int)rvalue; ; /*i=1*/ enum ocodes lvalue = 1, rvalue, ush, lus ; enum ocodes e = lvalue; if(e == ush) int i = (int)rvalue( int)rvalue;/*i=2*/ Lueteltu tyyi funktion aluuarvona Lueteltua tyyiä voi käyttää virhetiedon käsittelyssä Virheilmoitustekstit kootaan taulukkoon, jota indeksoidaan luetellun tyyin alkioita vastaavilla kokonaislukuarvoilla FoerT rocess(); tyedef enum FOPEN, FCLOSE, FOK FoerT; #define TOINT(f) ) ((int)(f int)(f)) )) char *Messages[] = "File can not be oened", "File can not be closed", "Successful oeration", "This can not haen" ; rintf("result of calling rocess() is %s\n",% Messages[TOINT(rocess())]; ())]; Tietue Alkiot eräkkäin eli kaikki käytettävissä struct intanddouble double d; ; int double intanddouble Joukot (union) Joukko Alkiot äällekkäin eli vaihtoehtoisia int double intordouble union intordouble double d; ; Käyttö yleensä tietueen osana Tietueessa kenttä (tag), joka kertoo miten joukko itää tulkita Käytetään aljon tietoliikennerotokollissa säästämässä tilaa Kenttiin viitataan samalla istenotaatiolla kuin tietueidenkin kenttiin Joukko - Käyttö tyedef enum integer, real TagTyeT; tyedef struct TagTyeT tag; union double d; value; TaggedValueT; TaggedValueT v; if(v.tag == integer) v.value.i ; v.value.d ; 3

Linkitetyt tietorakenteet Tauko Abstraktit tietorakenteet Käsitelty Tietorakenteiden kurssilla Kannattaa kerrata kaikki rakenteet sieltä Pino : oeraatiot ush, o ja emty Jono: oeraatiot enqueue, dequeue ja emty Linkitetty lista rakenteesta äätettävä Yhteen suuntaan vai kahteen suuntaan Rengas vai ei Tunnussolmu vai ei Järjestetty vai järjestämätön Alkiot erilaisia vai sallitaan myös samanlaiset alkiot Linkitetty lista - Määrittely Tunnussolmullinen yhteensuuntaan linkitetty arvoa käytetään aina listan loun osoittamiseen Huomaa seuraavaan alkioon osoittavan kentän määrittely! tyedef double DataTye; tyedef struct elem DataTye value; struct elem *;,, *P* P; tyedef struct P ;,, *P* P; P ; Linkitetty lista Tunnussolmun luonti ja oisto Listan luonti Tehdään vain tunnussolmu ja asetetaan linkit Listan oistaminen Alkioiden oistoon oma funktio Tässä vain tunnussolmun tilan vaautus P construct(void) ) P ; if(( = malloc(sizeof())) == ) -> = ; return ; void destruct(p *this) clear(*this); /* alkiot ois */ free(*this); *this = ; Linkitetty lista - Käyttö Linkitetty lista - Käyttö Kaikkien listaa käsittelevien toimintojen täytyy säilyttää seuraavat invariantit: Tyhjälle listalle ätee -> on. Eätyhjälle listalle ätee, että viimeisen alkion kentän arvo on. Oeraatioita: Listan läikäynti Aina linkien kulkusuuntaan Listaan lisääminen Alkuun, louun, keskelle Listasta oistaminen Alusta, lousta, keskeltä 4

Listan läikäynti aux void rintall(const P this) P aux; for(aux=this =this->; aux!=; aux=aux aux->) rintf("%f\n", ", aux->value); /* idetään aux edellisessä alkiossa */ If ((->!= ) && (->->!=)) for(aux = ->; aux->!= ; aux = aux->)... Lisäys listan alkuun int insertfront(p this, DataTye d) P aux; if((aux = malloc(sizeof())) == ) aux-> = this->; /* save state */ aux->value = d; this-> = aux; int deletelast(p this, DataTye *value) P aux; Viimeisen alkion oisto listasta if(this-> == ) /* emty list */ if(this-> >-> > == ) /* single */ *value = this-> >->value; >value; free(this->); this-> = ; for(aux = this->; aux-> >->!= ; aux = aux->) ; /* aux viimeistä edelliseen */ *value = aux-> >->value; >value; free(aux->); aux-> = ; value 3.5 Koko listan tuhoaminen Tuhotaan alkio kerrallaan edetään lista alusta louun int deletefirst(p this) P aux = this->; if(aux == ) /* emty list */ this-> = aux->; free(aux); void clear(p this) while(deletefirst(this)) ; this-> = ; Moduuli List Tehdään oma käännösyksikkö (moduuli), joka sisältää listan määrittelyt ja käsittelyfunktiot Tässä tehtävällä moduulilla on seuraavat iirteet Moduuli ystyy käsittelemään useita eri listoja Moduuli käsittelee void-tyyistä dataa, joten eri listoihin voi sijoittaa eri tyyistä tietoa Listan sisäinen toteutus ei näy käyttäjälle Listan käyttäjä vastaa datan rakenteesta ja käsittelystä Tyyin määrittelyt: ListItem ja List Funktiot: CreateList, CreateItem, AddTail, AddHead, ListLength, DeleteList, PrintList, EmtyList Lähde: Jan Lindströmin verkkomoniste Moduulin tarjoama rajainta: list.h #ifndef MY_LIST_LIBRARY #define MY_LIST_LIBRARY /* Määritellään listatyyit */ tyedef struct listitem struct listitem *Next; /* Seuraava alkio listassa */ struct listitem *Prev; /* Edellinen alkio listassa */ void *Data; /* Tietoalkio */ unsigned long Size; /* Tietoalkion koko */ ListItem; tyedef struct ListItem *Head; /* Listan alku */ ListItem *Tail; /* Listan lou */ unsigned long Items; /* Listan alkioiden lkm */ List; 5

List.h jatkuu /* Listakirjaston tukemat funktiot */ extern List *CreateList(void); /* Luo uusi lista */ extern ListItem *CreateItem(void *Data, unsigned long Size); /* Luo lista-alkio */ extern int AddTail(List *,ListItem *); /* Lisää listan louun */ extern int AddHead(List *,ListItem *); /* Lisää listan alkuun */ extern unsigned long ListLength(List *); /* Laske listan ituus */ extern void DeleteList(List *); /* Tuhoa lista */ extern void PrintList(List *); /* Tulosta listan sisältö */ extern int EmtyList(List *); /* Tarkista onko lista tyhjä */ #endif List.c : CreateList /* Varataan muistia uudelle listalle ja alustetaan kentät */ List *CreateList(void) List *uusi; if(!(uusi = (List *)malloc(sizeof(list)))) uusi->head = ; uusi->tail = ; uusi->items = 0; return uusi; List.c: CreateItem /* Varataan muistia uudelle listan alkiolle ja alustetaan kentät */ ListItem *CreateItem(void *Data,unsigned long size) ListItem *uusi; /* Jos järkevää dataa ei ole annettu oistu */ if (Data == ) if(!(uusi = (ListItem *)malloc(sizeof(listitem)))) if(!(uusi->data = (void *)malloc(size))) uusi->next = ; uusi->prev = ; memcy(uusi->data,data,size); uusi->size = size; return uusi; List.c: AddTail /* Lisätään alkio listan louun */ extern int AddTail(List *lista,listitem *item) if (lista == item == ) if ( lista->head == ) lista->head = lista->tail = item; lista->tail->next = item; item->prev = lista->tail; lista->tail = item; lista->items++; List.c: AddHead List.c: ListLength ja EmtyList /* Lisätään alkio listan alkuun */ extern int AddHead(List *lista,listitem *item) if (lista == item == ) if ( lista->head == ) lista->head = lista->tail = item; lista->head->prev = item; item->next = lista->head; lista->head = item; lista->items++; /* 'Lasketaan' listan ituus */ unsigned long ListLength(List *lista) if ( lista == ) return lista->items; /* Tarkista onko lista tyhjä */ int EmtyList(List *lista) if ( lista == ) if (lista->head == ) 6

List.c:DeleteList /* Tuhotaan koko lista */ void DeleteList(List *lista) ListItem *tm; if ( lista == ) return; tm = lista->head; while(tm!= ) tm = lista->head->next; free(lista->head->data); free(lista->head); lista->head = tm; free(lista); List.c: PrintList /* Tulostetaan koko lista */ void PrintList(List *lista) ListItem *tm = lista->head; rintf(" "); while(tm!= ) rintf("%s ",(char *)tm->data); tm = tm->next; rintf(" -\n"); Tässä oletetaan, että listassa on merkkijonoja. Paremi ratkaisu olisi käyttää funktioarametria data-alkioiden käsittelyyn. Käyttäjä joutuisi silloin itse ohjelmoimaan alkioiden käsittelyn, mutta listan käyttöalue kasvaisi. Harjoitustyö Käytettävät iirteet: Linkitetty tietorakenne osoittimilla (ino, lista, uu, hajautustaulu, ) Tiedosto (tekstitiedosto tai binääritiedosto) Komentoriviarametrit (jos ei muuta järkevää, niin ainakin h oastus) Funktioita arametreineen mielekkäästi Käännyttävä laitoksen Linux-ymäristössä gcc:n arametreilla ansi edantic ja Wall ilman varoituksia Vähintään kaksi käännösyksikköä ja make Koodi dokumentoitava järkevästi Erillinen lyhyt rakennedokumentti ja käyttöohje Aiheet 1. Yksinkertainen laskin 2. Sanalaskuri 3. Kauan kassan simulointi 4. Lennon varausjärjestelmä 5. Työntekijärekisteri 6. Ravintolan simulointi 7. Sukuuu 8. Kokkaavan ystävän au Aiheen valinta Aihe olisi syytä valita mahdollisimman ian e 17.3. mennessä Valinnan voi kertoa sähköostilla: Liisa.Marttinen@cs.helsinki.fi Tai 2. eriodin ensimmäisellä viikolla luennolla tai laskareissa. Omista (varsinkin simulointityyisistä) aiheista voi neuvotella Liisan tai Tiinan kanssa 7