/* ITKA203 Käyttöjärjestelmät kesä 2007 * Malliharjoitustyö * * Oletettu tehtävänanto: * * Noudata harjoitustyöohjetta ja tuota sen mukainen palautus. * C-ohjelmointivaiheessa toteuta aliohjelma, joka: * * - kääntää 64-bittisiä kokonaislukuja sisältävän taulukon * alkiot käänteiseen järjestykseen, esimerkiksi taulukosta * {45, -4, 56, 57, -4, 9} pitäisi tulla {9, -4, 57, 56, -4, 45}. * * - kertoo, montako kertaa vaihdettiin sama luku itsensä kanssa; * koska em. esimerkissä -4 oli sekä toinen että toiseksi * viimeinen alkio, pitäisi paluuarvoksi tulla ykkönen. */ /* * Oletettu toimintamallini, jos en vielä olisi kovin kokenut ohjelmoija: * * 1. miettisin tehtävässä määriteltyä tavoitetta, ensin suomen * kielellä miettien ja konkreettisia apuvälineitä, kuten kynää ja * ruutupaperia, käyttäen. Hahmottelisin siihen ratkaisua: mitä * toimenpiteitä tarvitaan, että lähtötilanteesta päästään * tavoitetilanteeseen. * * 2. tarkentaisin hahmotelmaani toimenpiteistä: mitä algoritmillisia * rakenteita tarvitsen: tarvitsenko muuttujia, millaisia ja mitä * tarkoituksia varten; tarvitsenko toistorakenteita, ehtorakenteita, * muuttujasijoituksia? * * 3. jossain vaiheessa tarttuisin koodaukseen, ja kirjaisin * algoritmi-ideani lähdekoodiksi: * * - Tekisin ensin testiohjelman, joka haluaisi käyttää tuotettavaa * aliohjelmaa eli siinä olisi aliohjelmakutsu; * samalla määrittäisin rajapinnan: mitkä * parametrit ja millainen paluuarvo (okei, sovitaan, että * meidän harjoitustöissä paluuarvon tulee aina olla * 64-bittinen kokonaisluku; yleisesti ottaen ohjelmoidessa * miettisin tätäkin osaa rajapinnasta). Jos en muistaisi, * miten C-kielessä ajatellaan tarvittavat tietorakenteet, * tarkistaisin asian jostain lähteestä ja noudattaisin * työkalun mukaisia pelisääntöjä ohjelman määrittelyissä. * * Jättäisin itse aliohjelman vielä toteuttamatta ja * palauttamaan aina vaikkapa nollan. * * - Kääntäisin rungon ja kokeilisin ajaa sitä; jos olisi * syntaksivirheitä, korjaisin ne, kunnes lopulta minulla * olisi toimiva koodi (vaikkei se vielä toteuta varsinaista * tavoitetta). Tästä on hyvä jatkaa. * * - Sitten lähtisin toteuttamaan aiemmin paperilla * keksimääni algoritmia C-kielellä. Kuvaisin * suoritusjärjestyksen ja muuttujien käytön C-kielen * syntaksilla. Saattaisin kokeilla kääntää ja ajaa ohjelmaa * aina pienen muutoksen jälkeen; koko ajan ymmärtäisin, * minkälaisen (vielä puolivalmiin) algoritmin ohjelmani * toteuttaa, ja näkemäni testiohjelmatulosteet * vahvistaisivat koko ajan käsitykseni. Ohjelmointi olisi * jatkuvasti mukavaa, koska olisin tilanteen tasalla. * * 4. LOPULTA olisin vakuuttunut, että ohjelmani toimii niin * kuin alkuperäinen tavoite oli. Jotain seuraavankaltaista * siitä olisi varmaankin tullut. */ #include /* Varsinainen algoritmitoteutus. */ long long int kaanna_taulukko(long long int taulu[], long long int koko){ long long int ioikea, ivasen; long long int lkm_samoja = 0; long long int tmp; ivasen=0; for(ioikea=koko-1; ioikea>ivasen; ioikea--){ if (taulu[ivasen] == taulu[ioikea]){ lkm_samoja++; } else { /* vaihto */ tmp = taulu[ivasen]; taulu[ivasen] = taulu[ioikea]; taulu[ioikea] = tmp; } ivasen++; } return lkm_samoja; } /* Testiä varten tein pienen tulostuskoodin. */ void tulosta_taulukko(long long int taulu[], long long int koko){ int i; for(i=0; i