Tietorakenteet¶
Tietorakenteet
MPU Data Logger (1p)¶
Tehtävänäsi on käsitellä ja tulostaa kiihtyvyysanturitietoja MPU:sta (Motion Processing Unit). MPU tallentaa useita tietoja, mukaan lukien kiihtyvyys, gyroskoopin lukemat ja tilatiedot. Tila voi osoittaa, ovatko tiedot kelvollisia, onko MPU matalaenergiatilassa vai onko tapahtunut virhe.
Tiedot annetaan rakenteiden taulukkona
mpu_sample_t
, jossa kukin näyte sisältää:struct accelerometer_t {
float ax, ay, az;
};
struct gyroscope_t {
float gx, gy, gz;
};
struct mpu_status_t {
int status_code; // MPU:n tila
int battery_level; // Akun varausprosentti
};
struct mpu_sample_t {
uint32_t timestamp;
struct accelerometer_t accel; // Kiihtyvyysanturin tiedot (ax, ay, az)
struct gyroscope_t gyro; // Gyroskoopin tiedot (gx, gy, gz)
struct mpu_status_t status; // Tilatiedot
};
Missä
-
-
-
ax
, ay
ja az
edustavat kiihtyvyysanturin tietoja, gx
, gy
ja gz
edustavat gyroskoopin tietoja, ja status_code
edustaa MPU:n nykyistä tilaa:-
DATA_VALID
= 2-
LOW_ENERGY
= 1-
DATA_ERROR
= 0Funktiosi ei palauta mitään arvoa, mutta tulostaa timestamp-, ax-, ay- ja az-arvot, kun
status_code
on DATA_VALID
.Tulostusformaatti on seuraava:
timestamp,ax,ay,az
Timestamp
tulostetaan pitkänä kokonaislukuna, kun taas ax, ay, az
tulostetaan kahden desimaalin tarkkuudella olevana liukulukunana.Funktioproto on:
void printcsv(struct mpu_sample_t *samples, int size);
Funktio tulostaa tiedot näytteistä, joissa
status_code
on DATA_VALID
, eli arvon on oltava 2.Esimerkki syötetaulukosta:
struct mpu_sample_t samples[5] = {
{1695046347, {0.98, -0.43, 0.12}, {0.01, 0.02, 0.03}, {2, 85}},
{1695046350, {1.02, -0.45, 0.14}, {0.02, 0.03, 0.04}, {1, 90}},
{1695046353, {0.99, -0.40, 0.13}, {0.03, 0.04, 0.05}, {2, 75}},
{1695046356, {1.01, -0.42, 0.15}, {0.05, 0.06, 0.07}, {0, 50}},
{1695046359, {1.03, -0.41, 0.16}, {0.07, 0.08, 0.09}, {1, 60}}
};
Tämän taulukon tuloste olisi:
1695046347,0.98,-0.43,0.12 1695046353,0.99,-0.40,0.13
Vihje. Kiinnitä huomiota rakenteiden ja taulukoiden käsittelyyn C:ssä. Tulosta tiedot vain näytteistä, joissa
status_code
on DATA_VALID
.
Vihjeet
Viestit
Polkulaskuri (2p)¶
Laske pisteiden kautta matkustavan olion matka.
Pisteet ja polku annetaan tietorakenteina
piste
ja polku
. Nyt *pisteet
on osoitin yhteen suuntaan linkitettyyn listaan, eli jokainen struct piste
osoittaa seuraavaan pisteeseen ja listan loppua merkitsee NULL
osoittimen arvona.
struct piste {
int koordinaatit[3];
struct piste *seuraava;
};
struct polku {
double matka;
struct piste *pisteet;
};
Olio kulkee suoria pitkin ideaalisessa Euklidisessa avaruudessa, eli pisteiden välisten etäisyyksien laskemiseen käytetään Euklidista etäisyyttä. Kaikki pisteet esitetään kolmiulotteisina vektoreina.
Esimerkki polun pituuden laskemisesta:
\text{Olkoon pisteet}
a_1 = (1, 2, 3), a_2 = (3, 4, 6)\;\text{ja}\;a_3 = (4, 4, 4).
\text{Lasketaan peräkkäisten pisteiden etäisyys:}
\begin{aligned}
d(a_1, a_2) &= \sqrt{(a_{11} - a_{21})^2 + (a_{12} - a_{22})^2 + (a_{13} - a_{23})^2}\\
&= \sqrt{(1 - 3)^2 + (2 - 4)^2 + (3 - 6)^2} = \sqrt{4 + 4 + 9} = \sqrt{17}
\end{aligned}
\begin{aligned}
d(a_2, a_3) &= \sqrt{(a_{21} - a_{31})^2 + (a_{22} - a_{32})^2 + (a_{23} - a_{33})^2}\\
&= \sqrt{(3 - 4)^2 + (4 - 4)^2 + (6 - 4)^2} = \sqrt{1 + 0 + 4} = \sqrt{5}
\end{aligned}
\text{Tällöin polun }a_1 \rightarrow a_2 \rightarrow a_3 \text{ pituus on}
d(a_1, a_2) + d(a_2, a_3) = \sqrt{17} + \sqrt{5}.
Käytä funktiolle prototyyppiä
void laske_kuljettu_matka(struct polku *polku);
ja tallenna tulos tietorakenteen polku
jäseneen matka
.Vinkki. Nyt argumentti on osoitin (ei taulukko), joten kertaa luentomateriaalista miten sellaisen tietorakenteen jäseniin osoitetaan.
Vinkki.
Vinkki.
math.h
-kirjastosta löytyy funktio sqrt(), jolla voi laskea neliöjuuria.
Vihjeet
Viestit

Koitko tämän tehtävän hyödylliseksi oppimisen kannalta?
Kommentteja tehtävästä?
Anna palautetta
Kommentteja tehtävästä?