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

Samankaltaiset tiedostot
TITO. ltö. C-ohjelmointi, syksy 2006: Funktiot. Aliohjelmaesimerkki. Esimerkki: potenssiin korotus. Luento 4, ti

C-ohjelmointi, syksy 2006: Funktiot

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

C-ohjelmointi: Funktiot. Luento: viikko 2

C-ohjelmointi, syksy 2008: Funktiot

TITO. C-ohjelmointi, syksy 2008: Funktiot. ltö. Aliohjelmaesimerkki. Esimerkki: potenssiin korotus. Luento 4, pe

TITO. Sisältö. C-ohjelmointi, kevät 2006: Funktiot. Aliohjelmaesimerkki. Yleistä. Parametrit. Esimerkki: potenssiin korotus

C-ohjelmointi, kevät 2006: Funktiot

C-ohjelmointi Luento 5: Osoittimet Tiina Niklander

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

C-ohjelmointi Luento 5: Osoittimet

Lyhyt kertaus osoittimista

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

Tietueet. Tietueiden määrittely

C-ohjelmointi, kevät t 2006: Funktiot. Luento 4, ti Tiina Niklander

Rakenteiset tietotyypit Moniulotteiset taulukot

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

Luennon sisältö. C-kurssi kevät Tasokokeen kohta 1: Taulukon järjestäminen. Tasokokeen kohta 2. Tasokokeen kohta 2. Tasokokeen kohta 3

C-kurssi kevät Luennon sisältö

Tietorakenteet ja algoritmit

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

Binäärioperaatiot Tiedostot ja I/O

Luennon sisält. ltö. C-kurssi syksy ääreet: int ja char. Yksinkertaiset tyypit. Kokonaisluvut. Merkit

C-kurssi syksy ltö. Luennon sisält. Luento 2: tyypit, rakenteet, makrot Tyypit. signed, unsigned short,, long Vakiot const Rakenteet

Binäärioperaatiot Tiedostot ja I/O

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

Java-kielen perusteet

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

13 Operaattoreiden ylimäärittelyjä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

C-ohjelmointi: Osoittimet

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Moduli 5: Kehittyneitä piirteitä

C-kurssi kevät t Luento 2: tyypit, rakenteet, makrot

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

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

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

Harjoitustyö: virtuaalikone

Loppukurssin järjestelyt

C-ohjelmointi, syksy 2006

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

Tietorakenteet ja algoritmit

Osoittimet ja taulukot

Loppukurssin järjestelyt C:n edistyneet piirteet

Java-kielen perusteet

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Tietorakenteet ja algoritmit

ITKP102 Ohjelmointi 1 (6 op)

15. Ohjelmoinnin tekniikkaa 15.1

1. Omat operaatiot 1.1

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

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

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Jakso 4 Aliohjelmien toteutus

Tietotyypit ja operaattorit

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

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

Tietorakenteet ja algoritmit

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

Muuttujien roolit Kiintoarvo cin >> r;

Tietorakenteet ja algoritmit

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

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

ITKP102 Ohjelmointi 1 (6 op)

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

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

7. Näytölle tulostaminen 7.1

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

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

Osoitin ja viittaus C++:ssa

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

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

13. Loogiset operaatiot 13.1

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

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

TIETORAKENTEET JA ALGORITMIT

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

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

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

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

Tietorakenteet ja algoritmit

12 Mallit (Templates)

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

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

Tieto- ja tallennusrakenteet

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

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

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

Ohjelmoinnin jatkokurssi, kurssikoe

C-ohjelmointi, syksy Modulaarinen ohjelmointi. Luento C-ohjelmointi Syksy

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmoinnin perusteet Y Python

Osoittimet ja taulukot

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

13. Loogiset operaatiot 13.1

Transkriptio:

C-ohjelmointi: Tietorakenteita ja tyyppejä Liisa Marttinen & Tiina Niklander 22.3.2005 Tyyppimuunnokset Tyyppimuunnoksia aritmeettisten tyyppien välillä Laskutoimituksissa tehdään automaattisia tyyppimuunnoksia Tyyppimuunnoksen voi myös tehdä eksplisiittisesti float f; void *g; i = i+ (int)f; f = f*i; g = &i; *(int*)g=435; Jos lausekkeen operandit ovat erityyppisiä, niin c:ssä tehdään automaattinen tyyppimuunnos laskutoimitusta varten aritmeettisten tyyppien välillä. Aina pienemmän tarkkuuden omaava tyyppi muunnetaan tarkemmaksi tyypiksi seuraavan järjestyksen mukaisesti: int unsigned long unsigned long float double long double Bittioperaatiot & (bitti and) & x & ^ vertaavat alkioita bitti kerrallaan ja palauttavat tämän tuloksen << >> siirtävät bittejä sanan sisällä ~ yhden komplementti 0-> 1 ja 1-> 0 low-order byte B & bitwise and bitwise or ^ bitwise xor (exclusive or) << left shift >> right shift ~ one's complement jos(x) i == 1 ja (y) i == 1 niin (x & y) i == 1 muuten (x & y) i == 0 Tätä käytetään usein bittien nollaukseen, esim: x & 0xff nollaa sanan kaikki muut bitit paitsi vähiten merkitsevän tavun (low-order byte): & x 0xff low-order byte B 00 00 11111111 0xff 00 00 11111111 x & 0xff 0 0 B x & 0xff 0 0 B 1

(bitti or) ^ (bitti xor) jos(x) i == 1 tai(y) i == 1 niin (x y) i == 1 muuten (x y) i == 0 Tällä usein asetetaan tiettyjä bittejä ykkösiksi. Asetetaan x:n alimman tavun ylin bitti ykköseksi: x 0x80, low-order byte x 0x80 C B 1B 2B 3 00 10000000 jos(x) i == (y) i niin (x ^ y) i == 0 muuten (x ^ y) i == 1 Bittioperaatio ^ (xor, poissulkeva or) nollaa ne bittipositiot, joiden arvo on sama, ja asettaa ykköseksi ne bittipositiot, jotka olivat eriarvoiset. Yksinkertainen testi sanojen samuudelle: x ^ y palauttaa 0 jos x ja y samat (eli kaikki bitit vastasivat toisiaan). x 0x80 C 1B 2B 3 ~ (yhden komplementti) << Siirto vasemmalle Yhden komplementti: ~x (~x) i == 1 - (x) i Bitit vaihtuvat vastakkaisiksi. Esimerkiksi. Halutaan vain nollata sanan x 3 alinta bittiä ja jättää loput ennalleen:x & ~7 (Niin miten tuo oikein toimii?) Vastaavasti, kun halutaan asettaa kaikki bitit ykkösiksi ~0 Left shift: i << j Tuloksena on sana, jossa bitit ovat siirtyneet vasemmalle j paikkaa Sana on täydennetty oikealta tarvittavalla määrällä nollia. Tämä on näppärä kahden kertolaskuissa: x <<= 1 on sama kuinx *= 2 x <<= 3 on sama kuinx *= 8. >> Siirto oikealle Right shift:i >> j Tuloksena on sana, jossa bitit ovat siirtyneet j paikkaa oikealle. Etumerkittömillä tyypeillä (ja positiivisilla luvuilla) oikealta täydennetään aina nollilla. Etumerkillisillä ja negatiivisilla luvuilla täydennyksenä voi olla 0 tai 1 toteutuksesta riippuen. (MIKSI?) x >>= 1 is equivalent tox /= 2 x >>= 2 is equivalent to x /= 4. Esimerkki: #include <stdio.h> /* Bittipeliä*/ int main(void) { enum {LL = 011 ; int i, j; i = 0; j = i LL; printf( i: %d, LL (okt):%o, i LL: %d, oktaalina %o\n, i, LL, j, j); printf( 1 & 6: %d, 1 && 6: %d\n, 1 & 6, 1 && 6); printf( 1<<3: %d, 8>>3: %d\n, 1<<3, 8>>3); Tulostaa: i: 0, LL (okt):11, i LL: 9, oktaalina 11 1 & 6: 0, 1 && 6: 1 1<<3: 8, 8>>3: 1 2

Moduulit C ei suoraan tue modulaarista (tai rakenteista) ohjelmointitapaa ei sisäkkäisiä funktioita globaalit muuttujat näkyvät saman tiedoston funktioille C:ssä on ohjelmoijan kuitenkin mahdollista käsitellä tiedostoja siten, että yhteen kuuluvat elementit sijoitetaan samaan tiedostoon yhden abstraktin tietotyypin toteutus yhteen tiedostoon Moduulia voi jopa ajatella luokan kaltaisena elementtinä Esim. tiedostot lista.h ja lista.c lista.h tietorakenteiden kuvaus ja funktioiden prototyypit lista.c funktioiden toteutukset ja omien muuttujien esittelyt Esimerkki: LINUXin prosessilista Tehokkuuden vuoksi prosessien kuvaajien tiedot tallennetaan kahteen suuntaan linkitettyyn listaan prev next prev next prev next Listalle on myös määritelty omat käsittelyrutiinit (funktioita ja makroja) list_add(n,p), list_add_tail(n,h) list_del(p) list_empty(p), list_entry(p,t,f) list_for_each(p,h) Prosessilistan omat makrot: SET_LINKS REMOVE_LINKS (kts. www-sivu http://lxr.linux.no/source/include/linux/list.h ) Muuttujien määrittelyt ja näkyvyyssäännöt Poikkeamat näkyvyyssäännöistä: Viittaaminen muualla määriteltyyn extern #include <stdio.h> /* globaalit muuttujat tänne*/ double tulos; int main(int argc, char** argv) { /* funktion muuttujat tänne */ for (i=0; i < 20; i++) { /* Lohkon muuttujia */ int j; j = i*4; Lohkon sisäiset muuttujat määritellään lohkon alussa Funktiokin on lohko Lohko on mikä tahansa aaltosulkujen { kattama ohjelman osa Eivät näy lohkon ulkopuolelle Arvo ei säily kutsukerrasta toiseen Globaalit muuttujat Määritellään funktioiden ulkopuolella Näkyvät myöhemmin määritellyille funktioille Arvo säilyy suorituksen ajan static int si; extern int ei; void f() { int fi; static int sif; extern int eif; /* vältä tätä! */ void g(); static void h(); int eif; /* määritelty vasta täällä */ Määrittely on tällöin tyypillisesti jossain toisessa tiedostossa tai kirjastossa Samassa tiedostossa, mutta myöhemmin Vältä tämän käyttöä!! Pyri määrittelemään muuttujat mahdollisimman paikallisesti, ja ainakin yhden tiedoston sisällä 3

Poikkeamat säilyvyyssäännöistä: Funktion sisäinen muuttuja pysyväksi - static Muuttujien sijoittelu muistiin static int si; extern int ei; void f() { int fi; static int sif; extern int eif; /* vältä tätä! */ void g(); static void h(); int eif; /* määritelty vasta täällä */ Määrittelemällä sisäinen muuttuja static määreellä muuttujan arvo säily suorituskerrasta toiseen. Toisaalta static määre globaalin muuttujan tai funktion nimen edessä rajoittaa kyseisen tunnuksen näkyvyyttä. Sitä ei voi tämän jälkeen käyttää muista tiedostoista käsin. ( Vrt. javan private) Extern määre kertoo kääntäjälle, että tässä kohtaa muuttujalle ei tarvitse varata tilaa, koska muuttuja on määritelty muualla Static määre kertoo kääntäjälle, että paikalliselle muuttujalle on varattava tilaa pinon ulkopuolelta, koska arvon pitää säilyä Register määre kertoo kääntäjälle, että muuttujaa käytetään niin paljon, että sille kannattaisi varata oma rekisteri prosessorilta tässä lohkossa Muuttujan esittely ilman määrettä, ns. automaattinen tilanvaraus globaaleille muuttujille tilanvaraus käännösaikana paikallisille muuttujille tilanvaraus pinosta suoritusaikana Funktio-osoittimien käyttö yleisissä moduuleissa Funktioita voi kutsua useita kertoja Funktion paluuarvo ja parametrilista on tyypitetty Geneerisissä tietorakenteissa ja niiden käsittelyrutiineissa käytetään usein tyypittömiä parametreja ja paluuarvoja: Yleiskäyttöisempiä rutiineja, mutta Paljon enemmän virhemahdollisuuksia Usein alkion sisältöä käsittelevä funktio välitetään funktioparametrina Etsintä: Example funktio 8-9 search Yleistetään tuo etsintäfunktio search /* Search a block of double values */ int search( const double *block, size_t size, double value) { double *p; Osoitin viiteparametrina C ei salli polymorfismia, mutta voimme simuloida sitä käyttämällä geneerisiä osoittimia (i.e. void*). Funktion prototyyppi voi määritellä että paluuarvo ja parametrit ovatkin määräämätöntä tyyppiä void if(block == NULL) for(p = block; p < block+size; p++) if(*p == value) return 1; Tietorakenteen läpikäynti Prototyyppi: alkioiden lkm vertailufunktio int searchgen(const void *block, size_t size, void *value); /* Määrittämätön tyyppi ei riitä*/ /* Vaan tarvitaan lisää parametreja */ int searchgen(const void *block, size_t size, void *value, size_t elsize int (*compare)(const void *, const void *)); tietorak. alkion koko 4

Funktion kutsujan toimenpiteet Funktion kutsujan täytyy määritellä vertailufunktio, jota voidaan kutsua etsintäfunktiosta (ns. Call back ) Tyyppien kanssa määrittely voisi olla: int comp(const double *x, const double *y) { return *x == *y; Tyypittömien parametrien avulla funktio täytyykin määritellä seuraavasti int comp(const void *x, const void *y) { return *(double*)x == *(double*)y; Esimerkki 8: Application geneerisen of generic etsinnän search käytöstä /* Application of a generic search */ #define SIZE 10 double *b; double v = 123.6; int main (void) { if(malloc(b, double, SIZE)) exit(exit_failure); for(i = 0; i < SIZE; i++) /* initialize */ if(scanf("%lf", &b[i])!= 1) { free(b); exit(exit_failure); printf("%f was %s one of the values\n", v, searchgen(b, SIZE, &v, sizeof(double), comp) == 1? "" : "not"); /* tai exit(exit_success); */ Geneerisen funktion search toteutus int searchgen(const void *block, size_t size, void *value, size_t elsize, int (*compare)(const void *, const void *)) { void *p; if(block == NULL) for(p = (void*)block; p< block+size*elsize; p = p+elsize) if(compare(p, value)) return 1; HUOM: Osoittimen siirrossa on nyt otettava myös alkion koko huomioon! Virheiden käsittely ja havaitseminen: assert Ennakkoehtojen tarkastaminen Ennakkoehto (precondition) on välttämätön ehto, jonka täytyy olla voimassa toimenpidettä suoritettaessa Esimerkiksi taulukolle x[size] 0 <= i < size on ennakkoehto viittaukselle x[i] Standardikirjasto assert.h sisältää makron assert(int e): assert(0 <= i && i < size) Toiminnan määrää makron NDEBUG määrittely. (no debug) oletusarvoisestiassert() on käytössä ja valvoo ohjelman toimintaa Määrittele makro NDEBUG poistaaksesi nuo tarkistukset ohjelmasta. (joko #define tai kääntäjän parametrina) Kutsutaan assert(i): Vaihtoehto 1: NDEBUG on määrittelemättä jai:n arvo on 0: Tulostetaan virheilmoitus (kertoo tiedoston ja rivin) ja ohjelman suoritus keskeytetään kutsumallaabort(). Virheilmoituksessa on annettu ennakkoehto ja makrojen FILE ja LINE arvot. Vaihtoehto 2: NDEBUG on määrittelemättä jai:n arvo ei ole 0, tai NDEBUG on määritelty: makron assert() kutsu ei vaikuta suoritukseen millään tavalla. 5

Muuta virheiden käsittelystä errno perinteinen tapa raportoida virhetilanteesta muuttujan arvo kertoo virheen tyypin stderr oletustiedosto virheiden tulostusta varten tulee ruudulle, vaikka varsinainen stdout olisikin putkitettu tiedostoon siis virheilmoitukset kannattaa tulostaa fprintf(stderr, ) jolloin varsinainen tulostus ei sotkeennu näistä! EXIT_SUCCESS ja EXIT_FAILURE Ohjelman suorituksen voi päättää mistä tahansa exitfunktiolla, jolle voi antaa parametriksi suorituksen onnistumista kuvaavan arvon Ylivuodon testaus: Älä koskaan tee näin: i + j > INT_MAX (EI!) Vaan näin: i > INT_MAX j Tee bittisiirtoja vain etumerkittömille kokonaisluvuille. Erityisesti vältä negatiivisia lukuja: x << -2 (EI!) copyright: Thomasz Müldner Kirjastorutiinit Kirjastorutiinien otsikkotiedostot ovat usein UNIXympäristöissä saatavilla hakemistosta /usr/include Kirjastorutiinien käyttö edellyttää tuon otsikkotiedoston liittämistä ohjelmaan #include Jotkut kirjastot, kuten math.h, pitää ottaa vielä käännösaikana erikseen mukaan sopivalla ohjauksella, matematiikkakirjastolle ohjaus on lm Standardinmukaiset otsikkotiedostot (ainakin nämä on kaikissa) Ohjelman toteutuksen vaiheet assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h diagnostiikkamakro erilaisia merkkitekstejä järjestelmän virhetilanteet, muuttuja errno liukulukujen ominaisuuksia kokonaislukujen ominaisuuksia paikallisen merkistön ominaisuuksia matematiikkafunktioita pikahypyt eri kohtiin ohjelmassa signaalien käsittelyyn tarvittavia funktioita vaihtuvamittaisten parametrijonojen käsittely tyyppimäärittelyjä, ei yleensä tarvita erikseen syöttö ja tulostus sekalaista, mm. muunnos ja muistinhallinta merkkijonojen käsittely päiväyksen ja kellonajan käsittely Määrittely kuvaa toteutettavan ohjelman toiminnan Suunnittelu Moduulit eli tietorakenteet ja niiden käsittelyrutiinit Tiedostorakenne ainakin kukin moduuli omaan tiedostoonsa Toteutus Moduuli kerrallaan? Testaus (ja virheenjäljitys) Erilaiset testityökalut aputulostukset? Käyttöohje Tämän voisi tehdä jo suoraan määrittelystä!!! 6

Tietorakenteista Tietorakenteiden suunnitteluperiaatteita: Puut, jonot, verkot, pinot - suurimmalta osin käsitelty TIRAn kurssilla Ei kannata keksiä pyörää uudelleen joka kerta, vaan käyttää aiemmin tutkittuja yleisiä rakenteita niille sopivissa paikoissa Toimivat vaihtoehdot: taulukko, hajautustaulu, linkitetty tietorakenne Tiedetäänkö koko ennalta? Staattinen taulukko on usein toimiva Dynaaminen linkitetty tietorakenne tai hajautus Alkiot käsiteltävä järjestyksessä? Järjestämätön kaikki käy Järjestetty taulukko, linkitetty tietorakenne Mitä tietoja tarvitaan? Tietue, yksittäisiä arvoja? Aiheuttaako sovellusalue muita rajoituksia? Tiedostoja? Teksti vai binääri? 7