Formaalit menetelmät ja testaus: Abstraktien tietotyyppien käyttö yksikkötestauksessa
|
|
- Antti Laine
- 7 vuotta sitten
- Katselukertoja:
Transkriptio
1 Formaalit menetelmät ja testaus: Abstraktien tietotyyppien käyttö yksikkötestauksessa Tommi Kärkkäinen JYVÄSKYLÄN YLIOPISTO Informaatioteknologian tiedekunta Tietotekniikan laitos syksy 2006
2 Yleistä formaaleista menetelmistä Tässä luvussa esitellään formaaleihin menetelmiin liittyviä yleisiä asioita (lähinnä) lähteen [NASA] NASA RELEASE NOTES, Formal Methods Specification and Verification Guidebook for Software and Computer Systems; Volume I: Planning and Technology Insertion, NASA, Washington,! " #$% &" '()* +," -" 1998 pohjalta Käyttötarkoitukset Formaalien menetelmien käyttötarkoitus ohjelmistosuunnittelussa on pääasiassa ohjelmien vaatimusmäärittelyn toteuttaminen mahdollisimman selkeällä ja yksikäsitteisellä tavalla Tähän voi myös liittyä ohjelman toiminnan oikeellisuuden verifiointi eli varmistaminen joko teoreettisesti ja/tai kokeellisesti usein olemassaolevien työkalujen avulla Ohjelmistosuunnittelussa formaali lähestyminen on erityisen tärkeää rakenteeltaan monimutkaisia ja turvallisuuskriittisiä (ydinvoimaloiden ohjausjärjestelmät, sairaalavimpaimet, yms) järjestelmiä kehitettäessä Formaalin ohjelmankehityksen yhtenä ääritapauksena voidaan pitää ns Dijkstralaista koulukuntaa, jonka mukaan ohjelmalle annetut vaatimukset mallinnetaan matemaattisesti käyttäen jotain aksiomaattista menetelmää ja ohjelman toiminta todistetaan oikeaksi ennenkuin tehdään ensimmäistäkään riviä koodia! Etuja Formaali ajatusmalli Ohjelman toiminta kuvataan täsmällisesti ennen implementointia voi vain auttaa tulemaan paremmaksi ohjelmistokehittäjäksi tai testaajaksi! (vaikka et sitä pilkulleen noudattaisikaan) Käytettäessä formaaleja menetelmiä spesifikaatio pyritään tekemään täsmällisesti ja yksikäsitteisesti jo ohjelmiston elinkaaren alkupuolella, analyysi-/suunnitteluvaiheessa Siksi määrittelyn sisältämiä epätäsmällisyyksiä ja varsinaisia virheitä voidaan havaita jo elinkaaren tässä vaiheessa - toisin kuin käytettäessä epätäsmällisempiä menetelmiä Lisäksi on olemassa paljon esimerkkejä tapauksista, joissa formaalien menetelmien käyttö on paljastanut jo toiminnassa olevista ohjelmistoista virheitä, joita ei ole huomattu kehitys- ja testausvaiheissa Kun ohjelma tila ja sen muutokset on määritelty tarkasti, voidaan ohjelman toimintaa käydä läpi eli simuloida ja (esim tilastollisesti) testata täsmällisesti Simuloinnissa 2
3 etsitään erityisesti tilanteita, joissa jokin ohjelmalle etukäteen määrätty rajoite ei ole voimassa eli ohjelma toimii väärin Parhaassa tapauksessa voidaan jopa todistaa matemaattisesti, että ohjelma toimii eli tekee sen, mitä vaatimusmäärittely edellyttää Formaalien menetelmien avulla voidaan löytää määrittelyssä esiintyviä ristiriitoja varmemmin ja enemmän Lisäksi joissain tapauksissa voidaan taata (osoittaa), että ohjelma ei käyttäydy (tosin, NASA:ssa näitä tekniikoita sovelletaan ja avaruusteleskoopit ja -sukkulat senkun reistailevat ja avaruusluotaimet hukkuvat viimeistään määränpäässään ;-) Formaali mallitus Ohjelmistojen formaalilla mallituksella tarkoitetaan prosessia, jossa systeemin ei-matemaattinen, sanallinen tai vaikkapa tietorakenteiden ja objektien muutoksia kuvaava diagrammiesitys muunnetaan matemaattiseksi esitykseksi Formaaliin mallitukseen liittyviä perustermejä ovat mm Formaali määritys: ohjelmiston ominaisuuksien ja toiminnan kuvaaminen epätäsmällisten ilmauksien sijasta matemaattisten rakenteiden avulla mahdollisimman abstraktilla tasolla Formaali todistus: matemaattinen, usein työkaluavusteisesti kehitetty todistus sille, että ohjelma toimii vaatimusten määräämällä tavalla Abstrahointi: ohjelmiston toiminnan kuvaaminen mahdollisimman yleisellä tasolla, jossa tarkemmat yksityiskohdat määritetään vasta kehitysprosessin myöhemmässä vaiheessa Vaatimusten animointi (emulointi, simulointi): Formaalia määritysprosessia tuetaan usein ohjelmankehitystyökaluilla, joiden avulla määritys muutetaan toimivaksi ohjelmaksi ja järjestelmän toimintaa jäljitellään tämän avulla Tällaisiin malleihin on suoraviivaista lisätä ohjelman tilaa ja sen muutoksia kuvaavia testitapauksia, joita voidaan käyttää esim (osana) regressiotestauksessa Formaali mallitus voi muodostua esimerkiksi seuraavien askeleiden kautta: Formaali määritys Tyyppien tarkistus: Ohjelman sisältämille muuttujille valittujen tyyppien oikeellisuuden varmistaminen (tyypit ja niiden muunnokset (tai näiden puuttuminen) ovat tyypilliä virhelähteitä heikosti tyypitetyille kielille) Ominaisuuksien määritys: Systeemin halutun toiminnan identifiointi ja (formaali) määrittely (ominaisuuksien ja toiminnan testaus) Loogisten ehtojen todistus: Systeemin haluttua toimintaa kuvaavien loogisten lausekkeiden todistaminen oikeaksi (ja varmennus testaamalla)
4 Formaalit menetelmät projektin osana Kun formaaleja menetelmiä on tarkoitus soveltaa jossakin ohjelmistoprojektissa, täytyy ottaa huomioon ainakin seuraavia asioita: Henkilökunta: Formaalien menetelmien yleistymisen suurin este on koulutetun henkilökunnan puute Koska menetelmien soveltaminen vaati aikalailla matemaattisia pohjia, on erityisesti jo alalle työskentelevien henkilöiden kouluttaminen aikaavievä projekti, joka yrityksissä usein jätetään tuottavuussyistä tekemättä ja ummistetaan raakasti silmät koko asialta Ei meillä ole ennenkään tuollaista tarvittu Prosessin integrointi: Olemassaolevian määrittelytapojen muuttaminen formaaliin suuntaan vaatii toisaalta hyvän yleisnäkemyksen alasta sekä myös tietoa menetelmien hyödyistä/rajoitteista, jotta ohjelmistoprosessia voidaan muokata hallitusti vanhoja tapoja uudistamalla ja parantamalla Projektin suunnittelu: Ne ohjelmistoprojektin osat, joissa formaalien menetelmien soveltamisesta saadaan paras mahdollinen hyöty, pitää pystyä tunnistamaan (elinkaaren mahdollisimman aikaisessa vaiheessa) Ohjelmistotyyppi: Useissa tapauksissa jokin muu, jo olemassaoleva tapa toteuttaa ohjelmistoprojekteja toimii tarpeeksi hyvin ilman sen kummempia muutoksia Erityisesti laajojen ohjelmistoprojektien täydellinen formalisointi voi tukehduttaa koko projektin tai ainakin viedä liikaa (työnantajalle) kallista aikaa Usein tyydytäänkin ratkaisuun, jossa tarvittaessa ohjelmiston kriittisimmät osaratkaisut esitetään formaalisti Lisäksi erityyppisten systeemien rakentamiseen soveltuvat luonnollisesti erilaiset työkalut, joten yhteen ratkaisuun kiinnittyminen voi pitkässä juoksussa tuoda hankaluuksia Formaalien menetelmien haittoja Listataanpas vielä osittain jo aikaisemmin mainittuja tekijöitä, jotka monesti estävät formaalien menetelmien soveltamisen: hankalia käyttää, vaativat liian paljon pohjatietoja liian vähän hyviä ja toisaalta liian paljon erilaisia työkaluja, joiden kaikkien hallitseminen liian työlästä yhdelle ihmiselle/projektiryhmälle/yritykselle ilman CASE-työkaluja osa tehosta menetetään sovelletaan, mutta esitietojen hallitsemattomuuden vuoksi väärin formaali spesifikaatio pitää erikseen suomentaa asiakkaalle (mutta niiden hyödyntäminen testauksessa tarjoaa mielenkiintoisia mahdollisuuksia, kts kuva 1) niin laaja alue, että niihin liittyen on mahdotonta (onko mikään?) muodostaa selkeää luentokokonaisuutta ;-)
5 ! (laatu) Testi(tapaus)! (täsmällisyys) Asiakas? Formaali Speksi Kuva 1: Formaalin spesifikaation rooli testauksessa Formaalien menetelmien sovelluskohteita Lopuksi listataan jo osittain aikaisemmin mainittuja formaalien menetelmien pääasiallisia sovelluskohteita: turvallisuuskriittiset järjestelmät: ydinvoimaloiden prosessinohjaus, lentokoneen ohjaus, sairaalalaitteistot, hankalasti korjattavat järjestelmät: avaruusluotaimet, piilastut, puhelinverkon protokollat, (virheiden korjaus joko mahdotonta tai älyttömän kallista, virheet nakertavat organisaation imagoa ja tiputtavat/romahduttavat pörssiarvon) reaktiiviset järjestelmät: monen käyttäjän järjestelmät, tietoliikenne, (rinnakkaisuuden hallinta ihmiselle vaikeaa, sopivasti ilmaistuna koneelle helppoa) 7+7 myyttiä ja 10 käskyä Formaaleista menetelmistä on 1960-luvulta lähtien käyty osin kiihkeätäkin keskustelua ohjelmistotekniikan piirissä Tämä keskustelu on suuresti vaikuttunut artikkeleista [Hal90] A HALL, Seven Myths of Formal Methods, IEEE Software, vol 7(5), pp 11 20, 1990, [BH95] J P BOWEN AND M G HINCHEY, Seven More Myths of Formal Methods, IEEE Software, vol 12(4), pp 34 41, 1995, joihin on koottu yhteensä 7+7 formaaleihin menetelmiin liitettyä "myyttiä"eli uskomusta eli syytä sille, miksi menetelmiä ei pidä ottaa vakavasti: 1 Formaalit menetelmät takaavat, että ohjelmisto on täydellinen 2 Formaalit menetelmät liittyvät pelkästään ohjelman oikeaksi todistamiseen 3 Formaalit menetelmät ovat tarpeellisia vain turvallisuuskriittisissä järjestelmissä 4 Formaalit menetelmät vaativat korkeasti koulutettuja matemaatikkoja soveltajikseen 5 Formaalit menetelmät kasvattavat kehityskustannuksia 6 Formaalit menetelmät eivät sovi asiakkaille
6 7 Formaaleja menetelmiä ei käytetä oikeiden, laajojen ohjelmistojen suunnittelussa 8 Formaalien menetelmien käyttö hidastaa ohjelmistoprosessin läpimenoaikaa 9 Formaalien menetelmien tueksi ei ole olemassa työkaluja 10 Formaalit menetelmät korvaavat perinteiset suunnittelumenetelmät 11 Formaalit menetelmät soveltuvat vain ohjelmistosuunnitteluun 12 Formaaleja menetelmiä ei tarvita 13 Formaaleja menetelmiä ei tueta 14 Formaalien menetelmien soveltajat käyttävät aina formaaleja menetelmiä Jälkimmäistä artikkelia seuranneessa julkaisussa [BH95b] J P BOWEN AND M G HINCHEY, Ten Commandments of Formal Methods, IEEE Computer, vol 28(4), pp 56 63, 1995, muotoiltiin sitten kymmenen formaaleihin menetelmiin liittyvää käskyä raamatullisessa hengessä ("Thou shalt"; käännös poikkeaa alkuperäisestä esityksestä (suom huom)): Käytä soveltuvaa notaatiota: Jokainen spesifiointimenetelmä on tarkoitettu tietyntyyppisten käsitteiden esittämiseen, ja luonnollisen sovellusalueensa ulkopuolella esityksistä tulee yleensä kohtuuttoman monimutkaisia ja hankalasti ymmärrettäviä Tyypillisenä esimerkkinä mainittakoon taas mallipohjaiset Z ja VDM sekä rinnakkaisuuden esittämisen vaikeus Muistetaan myös, että jonkun oudon notaatioläjän syntaksin ja semantiikan opettelu tarkasti on vaativa prosessi - erityisesti eri roolien (kehittäjä, asiakas, manageri) näkökulmasta Formalisoi, mutta älä yliformalisoi: Tosiasia on, että todella laajojen järjestelmien täydellinen formaali mallittaminen ja määrittäminen ei ole vielä nykypäivänä mahdollista tai edes tarpeellista Formaalit menetelmät liittyvät intiimisti järjestelmän toiminnallisuuteen, joten esim käyttöliittymän visuaalisen olemuksen kuvaamiseen ja testaamiseen kannattaa käyttää muita, käyttäjälähtöisempiä menetelmiä Siis (jos osaa) kannattaa soveltaa, mutta vain tarvittaessa Arvioi kulut: Tarvittavan osaamispääoman luominen yritykseen vaatii yleensä henkilöstön lisäkoulutusta, jonka kulut on pystyttävä kattamaan Lisäksi formaalejakin menetelmiä soveltavan asiakasprojektin kulut on pystyttävä arvioimaan etukäteen, ja tämä vaatii tietoa jo toteutuneista projekteista Tämmöistä tietoa on kuitenkin edelleenkin hyvin rajoitetusti saatavilla, joten kulujen arviointiin liittyvää kokemusta on vähän Hanki guru: Yhteistä onnistuneille formaaleja menetelmiä soveltaneille projekteille on ollut projektihenkilökunnan mahdollisuus korkealaatuiseen ammatilliseen ohjaukseen todellisen asiantuntijan toimesta Älä hylkää perinteisiä menetelmiä: Integroi (Tästä on puhuttu ja kirjoitettu jo tarpeeksi montaa kertaa tähän mennessä!) Dokumentoi riittävästi: Formaalit määritykset tulee täydentää dokumentoinnissa esitysmuodoilla, joita kaikki eri osapuolet ymmärtävät
7 Säilytä laatustandardit: Formaalit menetelmät eivät (yleensä, välttämättä) takaa ohjelman oikeellisuutta, joten muita laadun varmistusmenetelmiä (testaukset, katselmukset jne) ei pidä unohtaa tai poistaa käytöstä Älä ole dogmaattinen: Formaalit(kaan) menetelmät eivät ole ohjelmistokehityksen "hopealuoti" Esimerkiksi prosessia, jossa epäformaalit vaatimukset muutetaan formaaleiksi, ei voi itseään todistaa oikeaksi, joten ohjelmistoprosessin validoimiseksi tarvitaan muitakin menetelmiä (kts edellinen kohta) Lisäksi formaaleja menetelmiä tukevien työkalujen luotettavuutta on mahdoton todistaa Testaa, testaa, testaa: Ihmisten suunnittelemista, määrittelemistä ja toteuttamista ohjelmista löytyy aina bugeja ja virheitä, joten formaalit(kaan) spesifikaatiot eivät koskaan korvaa kattavan testauksen tarpeellisuutta Uudelleenkäytä: Formaali spesifikaatio perustuu korkeaan abstraktiotasoon ja täsmälliseen määritykseen, jonka vuoksi kerran kunnolla tehtynä se tarjoaa hyvät uudelleenkäyttömahdollisuudet sekä projektin sisällä että muissa projekteissa
8 Abstraktit tietotyypit ja yksikkötestaus Kappale pohjautuu (pääosin) lähteeseen [Vliet] H VAN VLIET, Software Engineering: Principles and Practice (2nd edition), John Wiley & Sons, New York, 2000 Tässä yhteydessä yksityiskohdat (erityisesti terminologia) ei ole merkityksellisessä roolissa, sillä päätarkoituksena on antaa konkreettinen tuntuma täsmällisten spesifikaatioiden olemuksesta ja käytöstä yksikkötestauksen suunnittelun apuna IEEE Standard Glossary of Software Engineering Terminology:n (1990) mukaan testitapaus (test case) määritellään (jotakuinkin) seuraavasti: Testitapaus muodostuu joukosta testisyötteitä, suoritusehtoja ja tavoiteltavia tuloksia, joiden avulla voidaan esim tarkastaa, toimiiko ohjelma tiettyjen määritysten mukaisesti Mistä nämä testitapaukset tulevat ja miten ne saadaan muotoiluiltaan sellaisiksi, että ei testata lillukanvarsia (Int: 1+1 <> 3, i+2 = 3)? Abstrakti tietotyyppi (abstract data type, ADT) on rakenteensa ja operaatioidensa suhteen täsmällisesti kuvattu ohjelmistokomponentti, joka on käytännössä hyvin läheistä sukua abstraktille luokalle (terminologian outouden ja ehkäpä hieman ristiriitaisuudenkin selittää se, että tässä esitettävät kuvaukset olivat käytössä jo ennen kuin olioparadigman valtakausi alkoi; itse asiassa ADT:t ovat vahvasti koko paradigman taustalla) Kappaletta läpikäydessä kannattaakin esitettyjä asioita koko ajan verrata luokkaan, sen rakenteeseen, rakenteen määrittämiseen ja luokan (rajapinnan) yksikkötestaukseen! ADT koostuu joukosta arvoja, "sortteja"(engl sort; ei taaskaan löydy hyvää suomennosta, mutta käytännössä nämä voidaan samaistaa luokan atribuutteihin), sekä joukosta operaatioita, joita voidaan kohdistaa "sortteihin"(metodit; vrt saantimetodit, tiedon piilotus, ei suoraa yhteyttä luokan atribuutteihin) Tyypillisiä esimerkkejä ADT:iden avulla määriteltävissä olevista tietorakenteista ovat vaikkapa: pino esim operaatioilla Create, Top, Pop, Push binääripuu esim operaatioilla Create, Insert, IsIn hierarkkinen taulukko esim operaatioilla Create, IncrLevel, DecrLevel, Add, IsIn, Retrieve Geneeriseksi rakenteet tekee se, että alkioiden tyyppiä muuttamalla sama toiminnallisuus voidaan kohdistaa esim int, float, string yms eri pinoille, puille ja taulukoille Lisäksi ADT:iden määrityksissä ei oteta mitään kantaa siihen, millä ohjelmointikielellä rakenne todellisuudessa implementoidaan, kunhan implementointi tarjoaa määritetyt operaatiot sitä 8
9 käyttävässä ohjelmassa valitulle tyypille Tämä on hyödyllistä esim koodigeneraattoreita ja korkeamman tason ohjelmointiympäristöjä rakennettaessa ADT:n määrityksessä ilmoitetaan sekä operaatioiden syntaksi (muoto) että niiden semantiikka (tulkinta) Mallipohjaisissa formaaleissa määrityksissä semantiikka kerrotaan eksplisiittisesti, mutta algebrallisessa spesifikaatiossa semantiikka esitetään implisiittisesti sitomalla määriteltyjen operaatioiden toiminta toisiinsa sopivien sääntöjen, aksioomien, avulla Otetaan esimerkiksi kokonaislukupinon algebrallinen määritys: type IntStack; functions Create : IntStack Push : IntStack Int IntStack Pop : IntStack IntStack Top : IntStack Int IsEmpty : IntStack Boolean axioms IsEmpty(Create) True IsEmpty(Push(s i)) False Pop(Create) Create Pop(Push(s i)) s Top(Create) 0 Top(Push(s i)) i end IntStack; Ja sitten muutamia huomioita ja kommentteja määrityksen suhteen: Pinon määrityksessä oletetaan, että ADT:t Boolean ja Int ovat jo valmiiksi määriteltyjä ja True ja False ovat Boolean-tyyppisiä vakioita Etsi-ja-korvaamalla pinon tyypin ilmaiseva Int yleiseen muotoon ( T ) tekee rakenteesta tyyppiriippumattoman Operaatioiden määritelmissä vastaa input-parametrilistan pilkkua ja :n jälkeen annetaan output:n tyyppi Pinon aksioomilla, joista jokainen on identiteetti, on seuraavat tulkinnat: 1 Create luo (alustaa) tyhjän pinon 2 pinoon lisääminen (Push) tekee pinosta välttämättä epätyhjän 3 tyhjästä nyhjääminen antaa edelleen tyhjän 4 pinoon lisääminen ja poistaminen antaa alkuperäisen pinon 5 Top täytyy määritellä erikseen tyhjälle pinolle (vrt ekvivalenssiluokat ja niiden rajat) palauttamaan jonkun oikeaa tyyppiä olevan arvon, vaikkapa nollan (tämä ei luonnollisesti riitä määrittämään tyhjää pinoa, koska luku "0"voi olla pinossa muutenkin) 6 pinoon lisäämisen jälkeen sen päällimmäisenä on lisätty luku Kaikkia operaatioita (katso erityisesti Create) on kuvattu niillä olevien ominaisuuksien ("mitä"), ei implementoinnin ("miten") kannalta (vrt mihin testauksella pyritään )
10 Annettu spesifikaatio vastaa hyvin konkreettista implementaatiota, jossa tyyppi IntStack vastaa kokonaislukuosoitinta ja esim Create palauttaa tyhjän osoittimen (siis lista) Toisaalta, aivan yhtä hyvin pino voidaan realisoida samaistamalla IntStack kokonaislukuvektorin kanssa (siis taulukko) Tällöin on luonnollista liittää ADT:hen mukaan tieto pinon koosta ja maksimikoosta, ja käyttää kokomuuttujaa esim tyhjän pinon indikaattorina Kuten jo aikaisemmin mainittiin, ADT:n alkuosa type- ja functions-klausien (avainsanojen) alaisuudessa vastaa suunnilleen normaalin luokan määrittelyä Tästä näkökulmasta aksioomissa esitettyjen ehtojen avulla voidaan luokan toteutusta yksikkötestata Erilaisten aksioomien tunnistaminen ja muodostaminen antaa näin ollen hyvät eväät myös yksikkötestauksen suunnitteluun ja toteutukseen (ilman, että termiä "formaali"tarvitsee edes mainita - ainakaan pomolle ;-) Laajoissa määrityskirjastoissa modulaarista rakennetta voidaan tukea esim seuraavasti: type Stack[Item]; imports True, False from Boolean, = from Item; exports Create, Push, Pop, Top, IsEmpty; Tämä määrittää ADT:n rajapinnan muihin ADT:ihin nähden (vrt esim Javan Interface) Huomaa, että imports- ja exports-listojen kautta kontrolloidaan operaatioita (lue: metodeja), joita toiset ADT:t käyttävät (vrt koostaminen ja yhden ADT:n sisältämien metodien näkyvyyden määrittäminen) Pinon algebrallinen spesifikaatio on loppujen lopuksi kohtuullisen suoraviivaista luettavaa, mutta laajojen tämänmuotoisten tyypinmäärityskirjastojen oikeellisuuden, kattavuuden ja ristiriidattomuuden tutkiminen on melkoisen matemaattista puuhastelua Tämän johdosta tarkastellaan myös jatkossa yksinkertaisiin esimerkkeihin liittyviä asioita Alla onkin annettu luonnollisten lukujen algebrallinen määritys (tämän esittäminen näissä yhteyksissä on lähes de facto -standardi, joka sitten kuitenkin johti lillukanvarsiin ;-): 1 type Nat; 2 functions 3 Null : Nat 4 Succ : Nat Nat 5 Add : Nat Nat Nat 6 axioms 7 Add(i Null) i 8 Add(i Succ(j)) Succ(Add(i j)) 9 end Nat; Ja sitten taas kommentteja määrityksen suhteen, johon rivinumerot on lisätty pelkästään selvyyden vuoksi: Määrityksen perustulkinta on selvä: Null on nolla-alkio, Succ viittaa annettua luonnollista lukua seuraavaan lukuun (Succ(1) 2 Succ(2) 3 jne) ja Add on luonnollisten lukujen yhteenlaskuoperaatio Määritys jakaantuu luonnollisesti kahteen osaan:
11 signature-osassa (allekirjoitus) riveillä 1-5 luetellaan "sortit"(näitä voi olla useampiakin type-avainsanan jälkeen) sekä näihin kohdistuvat funktiot tyyppeineen (Null on tyyppiä Nat oleva vakio, funktio Succ ottaa inputiksi ja myös palauttaa tyyppiä Nat olevan alkion, Add kohdistuu kahteen tyyppiä Nat olevaan alkioon ja palauttaa yhden samantyyppisen elementin) Esitysjärjestys määräytyy yleensä lähtöjoukon laajuuden mukaan equation-osassa (identiteetit) riveillä 6-8 listataan allekirjoituksessa esitettyjä vakioita ja funktioita sitovat ja yhdistävät päättelysäännöt, joiden täytyy olla voimassa tyypin varsinaisessa implementaatiossa Annetuissa esimerkeissä on rajoituttu pelkästään identiteetteihin, mutta yleensä aksioomissa voidaan käyttää myös epäyhtälöitä ja ehto-lauseita Allekirjoitus voidaan nähdä kontekstittomana (määrittely-ympäristöstään riippumattomana) kielioppina lausekkeille, jotka sen avulla määritellään Esimerkiksi luonnollisten lukujen määrittely sallii syntaksia Null Succ(Succ(Add(Succ(Null) Succ(Null)))) Add(Succ(Null) Succ(Succ(Null))) i Add(Succ(i) j) olevien lausekkeiden esittämisen Näistä kolmen ensimmäisen sanotaan olevan suljettuja (closed), koske ne sisältävät pelkästään vakioita (Null) ja funktioita Muuttujia i ja j sisältävien kahden viimeisen lausekkeen sanotaan olevan avoimia (Pilkuntarkasti: syntaksin oikeellisuuden tarkistamiseksi meidän tulisi tietää myös, mitkä ovat avoimissa lausekkeissa käytettäville muuttujille sallitut merkinnät) Täsmällisesti ilmaistuna allekirjoitus annetulle tyypille T määrittelee sallittujen lausekkeiden joukon seuraavien sääntöjen mukaan: 1 Tyyppiä T olevat vakiot ja muuttujat ovat tyypin peruslausekkeita 2 Jos l 1 l n ovat tyyppiä t 1 t n olevia lausekkeita ja f on funktio tyyppiä t 1 t n olevian muuttujien joukosta tyyppiä T olevien muuttujien joukkoon, niin f (l 1 l n ) on tyyppiä T oleva lauseke Tämä tekee algebrallisesta spesifikaatiosta täysin formaalin systeemin, jonka muutokset perustuvat identiteetti-osassa annettujen päättelysääntöjen käyttämiseen uusien lausekkeiden muodostamiseksi "Sortin"Nat määritelmän perusteella esimerkiksi seuraavanlainen päättelyketju on täysin sallittu (ja todistaa aukottomasti, että 1+2=3 on validi testitapaus ;-): Add(Succ(Null) Succ(Succ(Null))) (sääntö rivillä 8) Succ(Add(Succ(Null) Succ(Null))) (sääntö rivillä 8) Succ(Succ(Add(Succ(Null) Null))) (sääntö rivillä 7) Succ(Succ(Succ(Null)))
12 Kuinka rakentaa algebrallinen ADT? ADT:n määräämisen suurin hankaluus on jo edeltä käynyt selväksi: kuinka löytää rakenteelle sopiva tulkinta eli sopiva semantiikka eli sopiva joukko rakennetta sitovia päättelysääntöjä? (Vertaapa tätä kattavan mutta minimimääräisen testitapausten joukon muodostamisen vaikeuteen) Käydään seuraavassa läpi jotain yleisiä suuntaviivoja tutunoloisen esimerkin valossa type IntStack; functions Create : IntStack Push : IntStack Int IntStack Pop : IntStack IntStack Top : IntStack Int Size : IntStack Int IsEmpty : IntStack Boolean Tässä uusi muuttuja Size kertoo pinon kyseisellä hetkellä sisältämien kokonaislukujen määrän eli pinon koon Annetut funktiot voidaan jakaa 2*2 = neljään eri luokkaan: 1 Konstruktorit (constructors): Funktiot, joiden arvojoukkona (f : X Y :lle X on lähtö- eli määrittelyjoukko ja Y on tulo- eli arvojoukko) on määriteltävänä oleva tyyppi, esimerkissä IntStack 11 Peruskonstruktorien avulla muodostetaan kaikki ADT:n määrittämät tietorakenteet Esimerkissä peruskonstruktoreja ovat Create ja Push, joiden avulla voidaan rakentaa mikä tahansa pino puhtaalta pöydältä 12 Ylimääräisten konstruktorien avulla voidaan muuttaa määritettävää rakennetta; esimerkissä Pop 2 Havainnoijat (observers): Funktioita, jotka kohdistuvat johonkin muuhun tyyppiin kuin määriteltävään rakenteeseen 21 Perushavainnoijat ovat primitiivisiä rakenteen "tutkijoita", joita ei voida ilmaista muiden havainnoijien avulla Esimerkissä Top ja Size ovat perushavainnoijia, sillä IsEmpty(s) on ekvivalentti (= tarkoittaa samaa eli sillä on sama tulkinta) Size(x) 0 :n kanssa 22 Ylimääräiset havainnoijat ovat havainnoijia, jotka eivät ole perushavainnoijia; esimerkissä siis IsEmpty Jotta algebrallisesti määritellyllä ADT:llä olisi halutut ominaisuudet, täytyy spesifikaation olla tarpeeksi kattava Esitetään lopuksi heuristiikka, joka (yleensä) johtaa tarpeeksi kattavaan joukkoon funktioita ja niitä sitovia aksioomia: 1 Määritä peruskonstruktorit; esimerkissä Create ja Push 2 Määritä ylimääräiset konstruktorit, jotka siis käytännössä "vähentävät"rakennetta - Pop Lisää jokaiselle ylimääräiselle konstruktorille sen kaikkiin peruskonstruktoreihin liittämä, muotoa Pop(Create)
13 ja Pop(Push(s i)) oleva aksiooma Identiteettien oikea puoli täytyy itse osata kehittää semanttisesti järkeväksi Tarkasti tämä vaatii aksiooman todistamisen oikeaksi jo muodostettujen aksioomien suhteen edellä luonnollisille luvuille esitetyn päättelyketjun mukaisesti, mutta meille riittää hakea täsmällisessä esitysmuodossa vastaukset kysymyksiin Pop(Create) "Mitä tapahtuu, kun tyhjästä pinosta yritetään napata alkio ja muistetaan, että operaation tuloksen tyypin pitää myös olla pino?" ja Pop(Push(s i)) "Mitä tapahtuu, kun pinoon lisätään ja poistetaan alkio?" 3 Myös jokaiseen perushavainnoijaan liitetään aksioomat, jotka liittävät ne peruskonstruktoreihin: Top(Create) Top(Push(s i)) Size(Create) Size(Push(s i)) "Mikä alkio saadaan nyhjäistyä tyhjän pinon päältä?" "Mikä alkio löytyy pinon päältä, kun sinne on lisätty alkio i?" "Minkä kokoinen on tyhjä pino?" "Mitä tapahtuu pinon koolle, kun sinne lisätään alkio i?" 4 Lopuksi jokainen ylimääräinen havainnoija liitetään sopivan aksiooman avulla perushavainnoijiin: IsEmpty(s) "Mikä ehto pinon koon suhteen kuvaa tyhjää pinoa?" Näin muodostetun aksioomajärjestelmän "riittävyys"on siis vaikea kysymys (Gödel) Yleensä on syytä tarkastella myös niitä tyyppiyhteensopivia tapauksia, joissa muodostettu aksiooma voidaan esittää myös käänteisessä järjestyksessä tyyliin Push(s Pop(s)), Push(s Top(s)) jne
Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!
Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita! eli... Hyvä kaava sanoo enemmän kuin,... tuhat riviä koodia!... sata riviä tekstiä!... kymmenen diagrammia! YLEISTÄ FORMAALEISTA
LisätiedotA274101 TIETORAKENTEET JA ALGORITMIT
A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen
LisätiedotFORMAALI SYSTEEMI (in Nutshell): aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus
FORMAALI SYSTEEMI (in Nutshell): Formaali kieli: aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus esim. SSM:n tai EBNF:n avulla Semantiikka:
LisätiedotTietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
LisätiedotTestausdokumentti. Kivireki. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Testausdokumentti Kivireki Helsinki 17.12.2007 Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Kurssi 581260 Ohjelmistotuotantoprojekti (6 ov) Projektiryhmä Anu Kontio Ilmari
Lisätiedot7/20: Paketti kasassa ensimmäistä kertaa
Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007
LisätiedotOhjelmiston testaus ja laatu. Ohjelmistotekniikka elinkaarimallit
Ohjelmiston testaus ja laatu Ohjelmistotekniikka elinkaarimallit Vesiputousmalli - 1 Esitutkimus Määrittely mikä on ongelma, onko valmista ratkaisua, kustannukset, reunaehdot millainen järjestelmä täyttää
Lisätiedot13. Loogiset operaatiot 13.1
13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.
Lisätiedottään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla
2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella
LisätiedotAlgebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005
Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...
LisätiedotTaulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
LisätiedotTieto- ja tallennusrakenteet
Tieto- ja tallennusrakenteet Sisältö Tyyppi, abstrakti tietotyyppi, abstraktin tietotyypin toteutus Tallennusrakenteet Taulukko Linkitetty rakenne Abstraktit tietotyypit Lista (Puu) (Viimeisellä viikolla)
LisätiedotAlgoritmit 1. Luento 3 Ti Timo Männikkö
Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien
LisätiedotTodistusmenetelmiä Miksi pitää todistaa?
Todistusmenetelmiä Miksi pitää todistaa? LUKUTEORIA JA TO- DISTAMINEN, MAA11 Todistus on looginen päättelyketju, jossa oletuksista, määritelmistä, aksioomeista sekä aiemmin todistetuista tuloksista lähtien
LisätiedotInformaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006
TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa
LisätiedotOhjelmistojen mallintaminen, mallintaminen ja UML
582104 Ohjelmistojen mallintaminen, mallintaminen ja UML 1 Mallintaminen ja UML Ohjelmistojen mallintamisesta ja kuvaamisesta Oliomallinnus ja UML Käyttötapauskaaviot Luokkakaaviot Sekvenssikaaviot 2 Yleisesti
LisätiedotOhjelmistojen mallintaminen. Luento 11, 7.12.
Ohjelmistojen mallintaminen Luento 11, 7.12. Viime viikolla... Oliosuunnittelun yleiset periaatteet Single responsibility eli luokilla vain yksi vastuu Program to an interface, not to concrete implementation,
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
LisätiedotTietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Pino Pinon määritelmä Pinon sovelluksia Järjestyksen kääntäminen Palindromiprobleema Postfix-lausekkeen laskenta Infix-lausekkeen muunto postfix-lausekkeeksi Sisäkkäiset funktiokutsut
LisätiedotITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat
LisätiedotUML-kielen formalisointi Object-Z:lla
UML-kielen formalisointi Object-Z:lla Kalvot ja seminaarityö WWW:ssä: http://users.jyu.fi/~minurmin/opiskelu/form/ UML UML == Unified Modelling Language. OMG:n standardoima kieli ohjelmistojärjestelmien,
LisätiedotAlgoritmit 1. Luento 4 Ke Timo Männikkö
Algoritmit 1 Luento 4 Ke 18.1.2017 Timo Männikkö Luento 4 Tietorakenteet Pino Pinon toteutus Jono Jonon toteutus Lista Listaoperaatiot Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 2/29 Pino Pino, stack,
Lisätiedot18. Abstraktit tietotyypit 18.1
18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
LisätiedotOhjelmointiharjoituksia Arduino-ympäristössä
Ohjelmointiharjoituksia Arduino-ympäristössä Yleistä Arduino-sovelluksen rakenne Syntaksi ja käytännöt Esimerkki ohjelman rakenteesta Muuttujat ja tietotyypit Tietotyypit Esimerkkejä tietotyypeistä Ehtolauseet
LisätiedotELM GROUP 04. Teemu Laakso Henrik Talarmo
ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................
LisätiedotTietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
LisätiedotAlkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)
Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,
LisätiedotOhjelmoinnin jatkokurssi, kurssikoe 28.4.2014
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.
LisätiedotList-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen
1 List-luokan soveltamista List-luokan metodeja Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen 1 List-luokan metodeja List-luokan
LisätiedotCopyright by Haikala. Ohjelmistotuotannon osa-alueet
Copyright by Haikala Ohjelmistotuotannon osa-alueet Ohjelmiston elinkaari 1. Esitutkimus, tarvekartoitus, kokonaissuunnittelu, järjestelmäsuunnittelu (feasibility study, requirement study, preliminary
LisätiedotTestaaminen ohjelmiston kehitysprosessin aikana
Testaaminen ohjelmiston kehitysprosessin aikana 04.02.2004 http://cs.joensuu.fi/tsoft/ Sisällys 1. Johdanto 2. Yksikkö- ja integrointitestaus 3. Järjestelmätestaus 4. Hyväksymistestaus http://cs.joensuu.fi/tsoft/
LisätiedotJohdanto II. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.
TIE303 Formaalit menetelmät, kevät 2005 Johdanto II Antti-Juhani Kaijanaho antkaij@mit.jyu.fi Jyväskylän yliopisto Tietotekniikan laitos TIE303 Formaalit mentetelmät, 2005-01-20 p. 1/21 Luento2Luentomoniste
LisätiedotPino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:
Pino (stack) Pino: viimeisenä sisään, ensimmäisenä ulos (LIFO, Last In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys pinon päälle (push), ja päällimmäisen alkion poisto (pop) Push(alkio)
LisätiedotRekursiiviset tyypit
Rekursiiviset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 20. helmikuuta 2007 Hiloista Kiintopisteet (Ko)rekursio Rekursiiviset
LisätiedotRekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä
Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,
LisätiedotKääreluokat (oppikirjan luku 9.4) (Wrapper-classes)
Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi
LisätiedotMatematiikan tukikurssi, kurssikerta 1
Matematiikan tukikurssi, kurssikerta 1 1 Joukko-oppia Matematiikassa joukko on mikä tahansa kokoelma objekteja. Esimerkiksi joukkoa A, jonka jäseniä ovat numerot 1, 2 ja 5 merkitään A = {1, 2, 5}. Joukon
LisätiedotKäyttötapausanalyysi ja testaus tsoft
Käyttötapausanalyysi ja testaus tsoft 15.09.2004 http://cs.joensuu.fi/tsoft/ Johdanto Use Case analyysi (käyttötapausanalyysi) on yleisesti käytetty järjestelmälle asetettujen toiminnallisten vaatimusten
LisätiedotVerifioinnin ja validoinnin ero. 7. Verifiointi ja validointi. Verifiointi- ja validointitekniikat. Verifiointi- ja validointitekniikat II
7. Verifiointi ja validointi Verifiointi ja validointi (V&V) on ohjelmistotuotannon työvaihe, missä varmistetaan, että ohjelmisto täyttää sille asetetut implisiittiset ja eksplisiittiset vaatimukset ja
LisätiedotHarjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
LisätiedotSisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto
Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
LisätiedotJohdatus rakenteisiin dokumentteihin
-RKGDWXVUDNHQWHLVLLQGRNXPHQWWHLKLQ 5DNHQWHLQHQGRNXPHQWWL= rakenteellinen dokumentti dokumentti, jossa erotetaan toisistaan dokumentin 1)VLVlOW, 2) UDNHQQHja 3) XONRDVX(tai esitystapa) jotakin systemaattista
LisätiedotUCOT-Sovellusprojekti. Testausraportti
UCOT-Sovellusprojekti Testausraportti Ilari Liukko Tuomo Pieniluoma Vesa Pikki Panu Suominen Versio: 0.02 Julkinen 11. lokakuuta 2006 Jyväskylän yliopisto Tietotekniikan laitos Jyväskylä Hyväksyjä Päivämäärä
LisätiedotJAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?
JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
LisätiedotOhjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka
LisätiedotAbstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005
Abstraktit tietotyypit TIEA341 Funktio ohjelmointi 1 Syksy 2005 Data abstraktio Abstraktio on ohjelmoinnin tärkein väline Data abstraktio abstrahoi dataa Abstrakti tietotyyppi Koostuu kolmesta asiasta:
LisätiedotSisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä
Lisätiedot812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton
2015 syksy 2. vsk IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Sisältö 1. Johdanto luontimalleihin 2. Proxy 3. Factory Method 4. Prototype 5. Singleton Suunnittelumallit Proxy et.
LisätiedotTietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
LisätiedotTietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:
LisätiedotSuunnitteluvaihe prosessissa
Suunnittelu Suunnitteluvaihe prosessissa Silta analyysin ja toteutuksen välillä (raja usein hämärä kumpaankin suuntaan) Asteittain tarkentuva Analyysi -Korkea abstraktiotaso -Sovellusläheiset käsitteet
LisätiedotOpintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja
LisätiedotTIETORAKENTEET JA ALGORITMIT
TIETORAKENTEET JA ALGORITMIT Timo Harju 1999-2004 1 typedef link List; /* Vaihtoehtoisia nimiä */ typedef link Stack; /* nodepointterille */ typedef link Queue typedef struct node Node; /* itse nodelle
LisätiedotJohdantoluento. Ohjelmien ylläpito
Johdantoluento Ylläpito-termin termin määrittely Ylläpito ohjelmistotuotannon vaiheena Evoluutio-termin määrittely Muita kurssin aiheeseen liittyviä termejä TTY Ohjelmistotekniikka 1 Ohjelmien ylläpito
LisätiedotMatematiikan tukikurssi
Matematiikan tukikurssi Kurssikerta 4 Jatkuvuus Jatkuvan funktion määritelmä Tarkastellaan funktiota f x) jossakin tietyssä pisteessä x 0. Tämä funktio on tässä pisteessä joko jatkuva tai epäjatkuva. Jatkuvuuden
Lisätiedot13. Loogiset operaatiot 13.1
13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.
LisätiedotLuonnollisten lukujen ja kokonaislukujen määritteleminen
Luonnollisten lukujen ja kokonaislukujen määritteleminen LuK-tutkielma Jussi Piippo Matemaattisten tieteiden yksikkö Oulun yliopisto Kevät 2017 Sisältö 1 Johdanto 2 2 Esitietoja 3 2.1 Joukko-opin perusaksioomat...................
LisätiedotLuku 3. Listankäsittelyä. 3.1 Listat
Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat
LisätiedotSisältö. 22. Taulukot. Yleistä. Yleistä
Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä
LisätiedotSEPA diary. Dokumentti: SEPA_diary_PK_HS.doc Päiväys: Projekti: AgileElephant Versio: V0.3
AgilElephant SEPA Diary Petri Kalsi 55347A Heikki Salminen 51137K Tekijä: Petri Kalsi Omistaja: ElectricSeven Aihe: PK&HS Sivu 1 / 7 Dokumenttihistoria Revisiohistoria Revision päiväys: 29.11.2004 Seuraavan
LisätiedotOhjelmointi 2 / 2010 Välikoe / 26.3
Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään
LisätiedotUudelleenkäytön jako kahteen
Uudelleenkäyttö Yleistä On pyritty pääsemään vakiokomponenttien käyttöön Kuitenkin vakiokomponentit yleistyneet vain rajallisilla osa-alueilla (esim. windows-käyttöliittymä) On arvioitu, että 60-80% ohjelmistosta
Lisätiedot2. Olio-ohjelmoinista lyhyesti 2.1
2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin
LisätiedotAlgoritmit 2. Luento 2 To Timo Männikkö
Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento
LisätiedotTietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Merkintöjen tulkintoja *++Pstack->top = item *Pstack->top++ = item (*Pstack->top)++ *(Pstack++)->top = item *(++Pstack)->top = item Lisää pinon toteutuksia Dynaaminen taulukko
LisätiedotHarjoitustyön testaus. Juha Taina
Harjoitustyön testaus Juha Taina 1. Johdanto Ohjelman teko on muutakin kuin koodausta. Oleellinen osa on selvittää, että ohjelma toimii oikein. Tätä sanotaan ohjelman validoinniksi. Eräs keino validoida
Lisätiedot811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2016-2017 4. Joukot, relaatiot ja funktiot Osa 3: Funktiot 4.3 Funktiot Olkoot A ja B joukkoja. Funktio joukosta A joukkoon B on sääntö, joka liittää yksikäsitteisesti määrätyn
LisätiedotLogiikka 1/5 Sisältö ESITIEDOT:
Logiikka 1/5 Sisältö Formaali logiikka Luonnollinen logiikka muodostaa perustan arkielämän päättelyille. Sen käyttö on intuitiivista ja usein tiedostamatonta. Mikäli logiikka halutaan täsmällistää esimerkiksi
LisätiedotTestausraportti. Orava. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Testausraportti Orava Helsinki 5.5.2005 Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Kurssi 581260 Ohjelmistotuotantoprojekti (6 ov) Projektiryhmä Juhani Bergström Peter
LisätiedotReaalilukuvälit, leikkaus ja unioni (1/2)
Luvut Luonnolliset luvut N = {0, 1, 2, 3,... } Kokonaisluvut Z = {..., 2, 1, 0, 1, 2,... } Rationaaliluvut (jaksolliset desimaaliluvut) Q = {m/n m, n Z, n 0} Irrationaaliluvut eli jaksottomat desimaaliluvut
LisätiedotAlityypitys. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos
Alityypitys TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 5. maaliskuuta 2007 Muistatko tietueet? {I 1 = E 1,..., I n = E n } : {I
LisätiedotYleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.
2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä
LisätiedotOhjelmoinnin perusteet, syksy 2006
Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava
LisätiedotGeneeriset tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos
Geneeriset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 6. maaliskuuta 2007 Kysymys Mitä yhteistä on seuraavilla funktioilla?
LisätiedotApprobatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.
Approbatur 3, demo 1, ratkaisut 1.1. A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat. Käydään kaikki vaihtoehdot läpi. Jos A on rehti, niin B on retku, koska muuten
LisätiedotYksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }
Yksikkötestauksella tarkoitetaan lähdekoodiin kuuluvien yksittäisten osien testaamista. Termi yksikkö viittaa ohjelman pienimpiin mahdollisiin testattaviin toiminnallisuuksiin, kuten olion tarjoamiin metodeihin.
LisätiedotAlgoritmit 2. Luento 2 Ke Timo Männikkö
Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento
LisätiedotMatematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista
Matematiikan johdantokurssi, syksy 06 Harjoitus, ratkaisuista. Valitse seuraaville säännöille mahdollisimman laajat lähtöjoukot ja sopivat maalijoukot niin, että syntyy kahden muuttujan funktiot (ks. monisteen
LisätiedotOhjelmistojen mallintaminen
Ohjelmistojen mallintaminen - Mallit - Ohjelmiston kuvaaminen malleilla 31.10.2008 Harri Laine 1 Malli: abstraktio jostain kohteesta Abstrahointi: asian ilmaiseminen tavalla, joka tuo esiin tietystä näkökulmasta
LisätiedotTestiautomaatio tietovarastossa. Automaattisen regressiotestauksen periaate ja hyödyt
Testiautomaatio tietovarastossa Automaattisen regressiotestauksen periaate ja hyödyt Sisältö 2 Testaus kiinteänä osana DW-toteutusta Regressiotestauksen merkitys Robot Framework Automatisoitu DW:n regressiotestaus:
LisätiedotAutomaattinen yksikkötestaus
Teknillinen Korkeakoulu T-76.115 Tietojenkäsittelyopin ohjelmatyö Lineaaristen rajoitteiden tyydyttämistehtävän ratkaisija L models Automaattinen yksikkötestaus Ryhmä Rajoitteiset Versio Päivämäärä Tekijä
LisätiedotTietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla
Tietojen syöttäminen ohjelmalle Tähän mennessä on käsitelty Javan tulostuslauseet System.out.print ja System.out.println sekä ohjelman perusrakenneosat (muuttujat, vakiot, lauseet). Jotta päästään tekemään
LisätiedotJava-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
LisätiedotAlgoritmit 1. Demot Timo Männikkö
Algoritmit 1 Demot 2 1.-2.2.2017 Timo Männikkö Tehtävä 1 (a) Ei-rekursiivinen algoritmi: laskesumma(t, n) sum = t[0]; for (i = 1; i < n; i++) sum = sum + t[i]; return sum; Silmukka suoritetaan n 1 kertaa
LisätiedotTäydentäviä muistiinpanoja laskennan rajoista
Täydentäviä muistiinpanoja laskennan rajoista Antti-Juhani Kaijanaho 10. joulukuuta 2015 1 Diagonaalikieli Diagonaalikieli on D = { k {0, 1} k L(M k ) }. Lause 1. Päätösongelma Onko k {0, 1} sellaisen
LisätiedotSisäänrakennettu tietosuoja ja ohjelmistokehitys
Sisäänrakennettu tietosuoja ja ohjelmistokehitys Petri Strandén 8. kesäkuuta, 2018 Agenda Ohjelmistokehitys Ohjelmistokehitys vs. konsultointi Vaatimukset Tietosuoja Tietosuoja ohjelmistokehityksessä kiteytettynä
LisätiedotTietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Kurssin sisältö pääpiirteittäin Tarvittavat pohjatiedot Avainsanat Abstraktio Esimerkkiohjelman tehtäväkuvaus Abstraktion käyttö tehtävässä Abstrakti tietotyyppi Hyötyjä ADT:n
LisätiedotTIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 5 Ympärysmitta. Puut. Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 CASE: YMPÄRYSMITTA Lasketaan kuvioiden ympärysmittoja
LisätiedotITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat
LisätiedotTT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD)
TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) Ohjelmointikäytännöt 21/3/11 Mikko Vuorinen Metropolia Ammattikorkeakoulu 1 Sisältö 1) Mitä on hyvä koodi? 2) Ohjelmointikäytäntöjen merkitys? 3) Koodin asettelu
LisätiedotOsoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
LisätiedotOnnistunut Vaatimuspohjainen Testaus
Onnistunut Vaatimuspohjainen Testaus Kari Alho Solution Architect Nohau Solutions, Finland Sisältö Mitä on vaatimuspohjainen testaus? Vaatimusten ymmärtämisen haasteet Testitapausten generointi Työkalujen
LisätiedotOhjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1
3. Komponentit ja rajapinnat 3.1 Komponenttien idea: ohjelmistotuotannon rationalisointi 3.2 Mikä on ohjelmistokomponentti? 3.3 Komponentit ohjelmistoyksikköinä 3.4 Rajapinnat 3.6 Komponenttien räätälöinti
LisätiedotAlgoritmit 1. Luento 10 Ke Timo Männikkö
Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot
LisätiedotSisäänrakennettu tietosuoja ja ohjelmistokehitys
Sisäänrakennettu tietosuoja ja ohjelmistokehitys Petri Strandén 14. kesäkuuta, 2018 Petri Strandén Manager Cyber Security Services Application Technologies Petri.stranden@kpmg.fi Petri vastaa KPMG:n Technology
LisätiedotSoveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen
Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen ohjelmointiin Jukka Talvitie Valvoja: Professori Jorma Jormakka Paikka: TietoEnator oyj Ongelma Ideologia Lifebelt
LisätiedotOhjelmointi 1 Taulukot ja merkkijonot
Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko
LisätiedotThe OWL-S are not what they seem
The OWL-S are not what they seem...vai ovatko? Verkkopalveluiden koostamisen ontologia OWL-S Seminaariesitelmä 15.4.2013 Emilia Hjelm Internet on hankala Nykyinternet on dokumenttien verkko Asiat, joita
LisätiedotDatatähti 2019 alku. task type time limit memory limit. A Kolikot standard 1.00 s 512 MB. B Leimasin standard 1.00 s 512 MB
Datatähti 2019 alku task type time limit memory limit A Kolikot standard 1.00 s 512 MB B Leimasin standard 1.00 s 512 MB C Taulukko standard 1.00 s 512 MB D Ruudukko standard 1.00 s 512 MB E Sanalista
Lisätiedot