TAMPEREEN TEKNILLINEN YLIOPISTO

Samankaltaiset tiedostot
TAMPEREEN TEKNILLINEN YLIOPISTO

ITKP102 Ohjelmointi 1 (6 op)

Harjoitustyön testaus. Juha Taina

TIE Tietorakenteet ja algoritmit 25

Algoritmit 2. Luento 2 To Timo Männikkö

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Tietorakenteet ja algoritmit

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Toinen harjoitustyö. ASCII-grafiikkaa 2017

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Luento 5. Timo Savola. 28. huhtikuuta 2006

Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 13 Ti Timo Männikkö

Kielioppia: toisin kuin Javassa

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

ITKP102 Ohjelmointi 1 (6 op)

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

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op)

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

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

1. Mitä tehdään ensiksi?

Laskennan teoria (kevät 2006) Harjoitus 3, ratkaisuja

Algoritmit 1. Luento 11 Ti Timo Männikkö

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Harjoitus 4 (viikko 47)

Luento 4 Aliohjelmien toteutus

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Olio-ohjelmointi Syntaksikokoelma

Jakso 4 Aliohjelmien toteutus

Algoritmit 1. Luento 12 Ti Timo Männikkö

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Algoritmit 1. Luento 12 Ke Timo Männikkö

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

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

Algoritmit 1. Luento 3 Ti Timo Männikkö

Makrojen mystinen maailma lyhyt oppimäärä

Testausdokumentti. Kivireki. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

4 Tehokkuus ja algoritmien suunnittelu

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

13. Loogiset operaatiot 13.1

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

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmiston testaus ja laatu. Testausmenetelmiä

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Ohjelmoinnin perusteet Y Python

Program matopeli; uses graph,grafiikka,crt; VAR. merkkiluettu,herkkutarkistettu : boolean;

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin perusteet Y Python

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ensikosketus ohjelmointiin

Algoritmit 1. Luento 7 Ti Timo Männikkö

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Taulukot. Jukka Harju, Jukka Juslin

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

end; end else begin if aani=true then begin sound(247); delay(100); sound(220); delay(200); nosound; end; end;

Harjoitus 5 (viikko 48)

Toinen harjoitustyö. ASCII-grafiikkaa

Algoritmit 2. Luento 6 To Timo Männikkö

TIETORAKENTEET JA ALGORITMIT

A TIETORAKENTEET JA ALGORITMIT

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin peruskurssi Y1

13. Loogiset operaatiot 13.1

ITKP102 Ohjelmointi 1 (6 op)

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Taulukoiden käsittely Javalla

Luento 4 Aliohjelmien toteutus

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

4. Luokan testaus ja käyttö olion kautta 4.1

Harjoitustyö: virtuaalikone

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

Ohjelmoinnin peruskurssi Y1

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ohjelmoinnin peruskurssi Y1

5. HelloWorld-ohjelma 5.1

Transkriptio:

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 06.09.2005 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3

1. TEHTÄVÄ Tehtävä oli tehdä MIPS assembly kielellä aliohjelma, joka järjestää annetun merkkijonon aakkosjärjestykseen. Tehtävässä on käytetty quick sort -algoritmia [1]. Ohjelmaa kutsutaan seuraavan C-kielisen syntaksin mukaisesti. void qsort(char *left, char *right) Parametrit left ja right ovat osoittimia merkkijonon ensimmäiseen ja viimeiseen merkkiin. Ohjelma järjestää osoittimien left ja right välissä olevat merkit ASCII -koodien mukaiseen järjestykseen. Kutsujan on huolehdittava siitä, että merkkijonon viimeisenä olevaa nollaa ei sisällytetä järjestettävään merkkijonoon. 2. ALGORITMI Kuvassa 1. on Pascal -kielinen toteutus quick sort -algoritmista. Aakkostettava merkkijono on taulukossa a. Jotta algoritmi toimisi oikein kaikissa tilanteissa, taulukon ensimmäinen alkio on aina nolla. Itse merkkijono alkaa indeksistä 1. procedure quicksort; var t, i, l, r: integer; begin if r > l then end end; begin v := a[r]; i := l - 1; j := r; repeat repeat i := i + 1 until a[i] >= v; repeat j := j - 1 until a[j] <= v; t := a[i]; a[i] := a[j]; a[j] := t; until j <= i; a[j] := a[i]; a[i] := a[r]; a[r] := t; quicksort(l, i-1); quicksort(i+1, r); Kuva 1.Quick sort -algoritmi.

Quick sort -algoritmi on rekursiivinen eli se kutsuu itse itseään. Periaatteena on valita jokin alkio ns. partitioalkioksi, jolle etsitään oikea paikka. Kaikki partitioalkiota pienemmät alkiot siirretään tämän vasemmalle puolelle ja vastaavasti suuremmat oikealle puolelle. Algoritmia toistetaan vasemmalle ja oikealle puolelle erikseen kunnes taulukon koko on nolla. Kuvan 1 algoritmissa partitioalkioksi valitaan kaikkein suurin indeksisin alkio, joka sijoitetaan muuttujaan v. Sisimmäisissä repeat silmukoissa etsitään alusta alkaen partitioalkiota suurempi alkio ja lopusta alkaen pienempi alkio, jotka vaihdetaan keskenään. Tätä toistetaan kunnes indeksit (ija j) kohtaavat. Tällöin on löydetty partitioalkiolle oikea paikka, sekä pienimmät alkiot ovat partitioalkion vasemmalla puolella ja suuremmat vastaavasti oikealla. Algoritmia kutsutaan erikseen vasemmalle ja oikealle puoliskolle. Nykyistä partitioalkiota ei tarvitse sisällyttää kutsuihin, koska se jo on oikealla paikallaan. Rekursio päättyy, kun järjestettävä taulukko on tyhjä. 3. TOTEUTUS Liitteessä 1 on MIPS assemblykielellä koodattu toteutus kuvan 1 quick sort -algoritmissa. Kuvan 1 algoritmia on muutettu siten, että indeksien sijasta käytetään osoitteita (lue oppikirjan kappale 3.11). 3.1. Rekisterin käyttö Taulukko 1. Rekisterien käyttö Rekisteri $a0 $a1 $t0 $t1 $t2 $t3 $t4 Käyttö TÄHÄN REKISTERIEN KÄYTTÖKUVAUS Parametrit välitetään rekistereissä $a0 ja $a1. qsort aliohjelma ei palauta mitään arvoa kutsuvalle ohjelmalle. Rekisterissä $t0

säilytetään partitioalkiota (v). Rekisterissä $t1 on indeksiä i vastaavan alkion osoite ja rekisterissä $t2 on indeksiä j vastaava osoite. Rekistereitä $t3 ja $t4 käytetään apurekistereinä alkioiden vaihdoissa. 3.2. Toiminnan kuvaus Tarkempi kuvaus ohjelman toiminnasta. Kuinka ohjelma on käytännössä toteutettu, teittekö esim. jotain erilailla kuin algoritmissa. Ei mielellään viittauksia suoraan koodiriveille. Esimerkiksi numeroitu lista ohjelman suorituksesta, kuvaus, mitä tehdään missäkin ohjelmalohkossa. Eli mitä esimerkiksi tehdään, kun hypätään symboliin.loop yms. 4. TESTAUS Jotta ohjelman toimivuus voidaan varmistaa, kannattaa miettiä miten ohjelma testataan jo ennen koodausta. Tällöin ohjelmasta voidaan tehdä helposti testattava esimerkiksi lisäämällä erilaisia testitoimintoja. Kohdat 5, 30, 40 ja 60 on lisätty pääohjelmaan helpottamaan testausta ja ne voidaan poistaa, kun ohjelman toimivuus on varmistettu. Testitapausten avulla pyritään varmistetaan, että ohjelma toimii kaikissa mahdollisissa tilanteissa. Esimerkiksi ohjelman saadessa virheelliset parametrit ohjelma ei saa seota, vaan se palauttaa kutsuvalle ohjelmalle virhekoodin. Jotta suurissa ohjelmissa testitapausten määrä ei räjähdä käsiin, kannattaa miettiä edeltä käsin mitkä testitapaukset ovat mahdollisimman kattavia. Ohjelmaa kannattaa testata ns. normaaleilla syötteillä, toiminta poikkeuksellisissa tilanteissa, virheellisillä parametreilla ym.

4.1. Testitapaukset 4.1.1. Testitapaus 1 Tässä kappaleessa on listattu testitapaukset, joilla qsort aliohjelma on testattu. Testitapaukset on pyritty laatimaan siten, että testit ovat mahdollisimman kattavat tapausten määrän kuitenkin pysyessä siedettävänä. Kustakin testitapauksesta on script komennolla otettu loki liitteessä 2. Tämä on ns. normaali tapaus, jossa merkit ovat 'satunnaisessa' järjestyksessä. Tuloksena on aakkosjärjestyksessä (ASCII koodien mukaisessa) oleva merkkijono. 4.1.2. Testitapaus 2 Merkkijono on jo valmiiksi aakkosjärjestyksessä. Tarkoituksena varmistaa, että sisäkkäisten repeat-silmukoiden vertailut toimivat. Algoritmi ei saa muuttaa merkkijonon järjestystä. 4.1.3. Testitapaus 3 4.1.4. Testitapaus 4 Merkkijono on käänteisessä aakkosjärjestyksessä. Tarkoituksena on varmistaa, että sisäkkäisten repeat-silmukoiden vertailut toimivat. Huomaa, että tässä tapauksessa algoritmi sekoaa, jos taulukon alussa ei ole nollaa (.stopper) Qsort aliohjelman jälkeen merkkijono on aakkosjärjestyksessä. Kaikki merkkijonon merkit ovat samoja. Ohjelma ei muuta merkkijonoa. 4.1.5. Testitapaus 5 Merkkijonon pituus on yksi.

Ohjelma ei muuta merkkijonoa. 4.1.6. Testitapaus 6 Merkkijonossa ei ole yhtään merkkiä, eli ohjelmaa kutsutaan parametreilla, jossa $a0 ja $ a1 ovat samoja. Ohjelma palaa välittömästi tekemättä mitään. 4.1.7. Testitapaus 7 Alku- ja loppuosoite ovat vaihtaneet keskenään paikkoja. Ohjelma palaa välittömästi tekemättä mitään. 5. VIITTEET [1] Sedgewick, R. Algorithms. 2. painos. 1988. Addison-Wesley Publishing Company, Inc. 657 s.

LIITE 1 Ohjelma järjestää merkkijonon alkiot aakkosjärjestykseen quick sort algoritmilla. Argumenttina annetaan osoitin merkkijonon alkuun ja loppuun. Ohjelman C-prototyyppi on seuraavanlainen: void qsort(char *first, char *last); Ohjelman palattua annettu merkkijono on aakkojärjestyksessä. Main program for testing quick sort <tähän oma koodi kokonaisuudessaan>

LIITE 2 Testitapaukset: Script started on Wed Aug 30 15:40:24 1995 naakka ~/tktekn 53 % spim SPIM Version 5.4 of Jan. 17, 1994 Copyright 1990-1994 by James R. Larus (larus@cs.wisc.edu). All Rights Reserved. See the file README a full copyright notice. Loaded: /home/korppi-a/karju/spim/lib/trap.handler (spim) load "qsort.s" (spim) run this is a test string for quick sort algorithm aacefgghhiiiiiklmnoooqrrrrsssssttttttu Test 1 passed abcdefghijklmonpqrstuw abcdefghijklmnopqrstuw Test 2 passed wutsrqponmlkjihgfedcba abcdefghijklmnopqrstuw Test 3 passed aaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaa Test 4 passed a a Test 5 passed

Test 6 passed This is a test string for quick sort algorithm Program did not do anything. Test 7 passed. (spim) quit naakka ~/tktekn 53 % exit exit script done on Wed Aug 30 15:52:11 1995