Ohjausrakenteet C:ssä¶
Kertoma (1p)¶
Laadi funktio, joka palauttaa annetun luvun kertoman. Maksimiarvo luvulle on 20. Jos funktiota kutsutaan suuremmalla arvolla kuin 20, se palauttaa arvon -1.
Käytä funktiolle prototyyppiä
int64_t laske_kertoma(int8_t n);
Vinkki. Kun testaat koodiasi, huomaa että 64-bittisen luvun tulostukseen arkkitehtuurista ja kääntäjästä riippuen saatetaan tarvita
%lld
muotoilumääre, jos %ld
ei riitä.
Vihjeet
Viestit
Anna palautetta
Koitko tämän tehtävän hyödylliseksi oppimisen kannalta?
Sekoitetaan pakkaa (2p)¶
..tai oikeastaan taulukkoa käyttäen Fisher-Yatesin algoritmin kynä ja paperi -versiota (Hox! ei siis sitä wikipediassa mainittua modernia toteutusta).
Laadi funktio, joka tekee Fisher-Yates-sekoituksen satunnaisen kokoiselle taulukolle (16-bittisen lukualueen rajoissa), joka sisältää satunnaisia arvoja (8-bittisen lukualueen rajoissa) perustuen allaolevaan prototyyppiin. Ideana siis on, että sekoitus tehdään annettuun taulukkoon
list
itseensä.void shuffle(uint8_t *list, uint16_t list_size);
C-kielessä satunnaislukuja voidaan luoda
stdlib.h
-kirjaston funktiolla rand(). Huomaa webbisivun esimerkistä, että (pseudo)satunnaislukugeneraattori pitää ensin alustaa funktiolla srand
, siemenlukuna (engl. seed) voit käyttää vaikka funktiota time(NULL)
. Alusta satunnaislukugeneraattori main-funktiossa testatessasi shuffle
-funktion toimintaa, älä siis jätä vastaukseesi funktion sisälle srand-kutsua. Katso esimerkki funktion toiminnasta yo. wikipedian sivuilta. Esimerkiksi voisi käydä näin..
..
// satunnainen taulukko (heh heh)
uint8_t list[8] = { 1,2,3,4,5,6,7,8};
..
// sekoitus
shuffle(list,8);
..
// taulukon sisältö sekoituksen jälkeen
list[8] = { 2,5,3,1,8,6,7,4};
Vinkki. Tehtävässä voi tallentaa poimitut numerot välitulostaulukkoon tai siirtää alkioita, niin että poistaa välistä poimitut arvot.
Vinkki 2. Muista ottaa käyttöön time.h-kirjasto.
Vinkki 2. Muista ottaa käyttöön time.h-kirjasto.
Vihjeet
Viestit
Anna palautetta
Koitko tämän tehtävän hyödylliseksi oppimisen kannalta?
Kommentteja tehtävästä?
Liukuva keskiarvo (2p)¶
Menemättä syvemmälle digitaalisen signaalinkäsittelyn (tässä anturidatan käsittelyn) salaisuuksiin, todetaan että liukuva keskiarvo on hyvin yleinen menetelmä suodattaa (lue siistiä) mitattavaa signaalia. Siistiminen tässä tarkoittaa esimerkiksi kohinan poistamista datasta, jotta suodatettu data kuvaisi paremmin mitattavan ilmiön käyttäytymistä esimerkiksi aikasarjana.
Tehtävässä toteutetaan funktio, joka laskee ja tulostaa yksinkertaisen liukuvan keskiarvon (Wikipedian sivulla Simple Moving Average, SMA) taulukkona annetulle datalle annetun kokoista ikkunaa käyttäen. Funktion prototyyppi on muotoa:
void movavg(float *array, uint8_t array_size, uint8_t window_size);
Tässä argumenttina annetaan funktiolle satunnaisen mittainen liukulukutaulukko osoittimen kautta, jolloin funktion kutsu on allaolevan kaltainen, eli argumentiksi taulukon nimi. Lisäargumetteina taulukon koko (tässä 5 alkiota) ja liukuvan ikkunan koko (tässä 3 alkiota).
...
float data[5] = { 1.0, 2.0, 4.0, 6.0, 9.0 };
movavg(data, 5, 3);
Tällöin laskettaisiin siis keskiarvo ensimmäsellä iteraatiolla arvoista
1.0, 2.0 , 4.0
, seuraavalla iteraatiolla arvoista 2.0, 4.0, 6.0
ja viimeisellä iteraatiolla 4.0, 6.0, 9.0
. Keskiarvon laskenta siis kirjaimellisesti liukuu taulukon läpi..Tällöin funktio siis tulostaisi liukuvaa keskiarvoa kuvaavat liukuluvut kahden desimaalin tarkkuudella. Hox! Pilkun käyttö erottimena vanhaan kunnon CSV-tyyliin.
2.33,4.00,6.33
Vihjeet
Viestit
Anna palautetta
Koitko tämän tehtävän hyödylliseksi oppimisen kannalta?
Kommentteja tehtävästä?
Ristinolla (3p)¶
Toteuta funktio, joka tarkastaa ristinollapelin lopputuloksen.
Käytä prototyyppiä
int8_t tictactoe_check(int8_t * gameboard, int win_len);
Parametreina ovat osoitin taulukkoon ja voittoon vaadittava suoran pituus (pystyyn, vaakaan tai vinottain).Pelialue on 10x10 ruudukko, mutta se kuvataan 100:n
int8_t
-muuttujan taulukkona. Taulukossa kaikki rivit on kirjoitettu yhteen pötköön, eli esimerkiksi taulukon indeksi 42 kuvaa ruudukon viidennen rivin kolmatta ruutua.Taulukossa olevat luvut kuvaavat kyseisten ruutujen merkkejä. 1 kuvaa ristiä, 2 nollaa ja 0 tyhjää ruutua.
Funktion on palautettava pelin voittaja. Paluuarvo 1 ristin voittaessa, 2 nollan voittaessa, 0 jos kumpikaan ei voittanut. Jos molemmat pelaajat täyttävät voittoehdon, on peli mahdoton ja funktion on palautettava nolla.
Vinkki. Ehkäpä tarvitsee käsitellä vain ne ruudut, missä on pelimerkkejä.
Vihjeet
Viestit
Anna palautetta
Kommentteja tehtävästä?