Osoittimet¶
Tärkeä huomautus edistyneille käyttäjille:
malloc
, calloc
ja free
-operaatioita ei sallita koodissa.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 3: Kun testaat koodiasi, käytä kiinteää taulukon kokoa. Kokeile testata eri kiinteillä kokoarvoilla. Muista, että muuttujan perusteella määritetyt taulukot (eli taulukot, joiden koko asetetaan muuttujan, ei vakion, avulla) eivät välttämättä ole tuettu kaikilla arkkitehtuureilla tai kääntäjillä.
Vinkki 2. Muista ottaa käyttöön time.h-kirjasto.
Vinkki 3: Kun testaat koodiasi, käytä kiinteää taulukon kokoa. Kokeile testata eri kiinteillä kokoarvoilla. Muista, että muuttujan perusteella määritetyt taulukot (eli taulukot, joiden koko asetetaan muuttujan, ei vakion, avulla) eivät välttämättä ole tuettu kaikilla arkkitehtuureilla tai kääntäjillä.
Vihjeet
Viestit

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 (Simple Moving Average, SMA in the English Wikipedia) 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);
Huom! Tässä tapauksessa haluamme vain tulostaa funktion näytölle. Ei tarvitse lisätä sitä uudelleen taulukkoon.
Tässä argumenttina annetaan funktiolle satunnaisen mittainen liukulukutaulukko osoittimen kautta. 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

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ä?