(N) Osoittimia vektorissa

Tavoite: Opin käyttämään osoittimia sekä nullptr-arvoa esittämään puuttuvaa tietoa. Ymmärrän myös, mitä eroa on sillä, että kaksi osoitinta osoittaa samaan kohteeseen tai että kaksi osoitinta osoittaa kahteen samanlaiseen kohteeseen.

Ohjeita: Hae ohjelmakoodipohja: templates/05/pointers/ -> student/05/pointers/. Koodipohjan main-funktio on ympäröity kääntäjän ohjauksilla:

// Don't remove! Needed for tests.
#ifndef POINTERS_TEST
#define POINTERS_TEST
// Don't remove! Needed for tests.

// Main function (an example test case)
int main()
{
    // main-funktion koodi
}

// Don't remove! Needed for tests.
#endif //POINTERS_TEST
// Don't remove! Needed for tests.

Nämä kääntäjänohjaukset liittyvät automaattitesteihin. Niistä ei tarvitse välittää, eikä niitä saa poistaa tai muuttaa. Kääntäjän ohjausten pitää pysyä main-funktion ympärillä, kirjoita siis lisättävät funktiot yllä näytettyjen rivien yläpuolelle.

Tehdään ohjelma, jossa esiintyy opiskelijoita ja kursseja. Opiskelija on yksinkertaisuuden vuoksi esitetty tietueena (struct), mutta osoittimet toimisivat samalla tavalla, jos tietueen sijasta olisi käytetty luokkaa. Kurssi on esitetty vektorina, joka sisältää osoittimia opiskelijatietueisiin. Toisin sanoen kurssivektori sisältää osoittimet niihin opiskelijoihin, jotka ovat kyseisellä kurssilla.

Luonnollisesti sama opiskelija voi olla usealla eri kurssilla. Ohjelma sallisi myös opiskelijan olevan useaan kertaan samalla kurssilla. Annetussa pääohjelmassa näin ei tapahdu, mutta se olisi mahdollista. Tällaisesta mahdollisuudesta ei tarvitse välittää, eikä sitä tarvitse käsitellä tai tarkistaa ohjelmassa.

Toteuta ohjelmaan seuraavat funktiot:

  • find_first_occurrence: Palauttaa annetusta vektorista ensimmäisen sopivan opiskelijan, jolla on sama nimi ja syntymäpäivä kuin annettiin parametreina. Jos yhtään sopivaa opiskelijaa ei löydy, palauttaa arvon nullptr.

  • find_same: Tulostaa niiden opiskelijoiden tiedot, jotka ovat kummallakin annetulla kurssilla (tulostustiedot näkyvät alla olevassa esimerkkiajossa).

  • find_identical: Tulostaa niiden opiskelijoiden tiedot, jotka ovat annetulla kurssilla ja joilla on keskenään sama nimi ja sama syntymäpäivä mutta jotka kuitenkin ovat eri opiskelijoita (tulostustiedot näkyvät alla olevassa esimerkkiajossa).

Tulostusfunktio (print) on toteutettu valmiiksi.

Kun olet toteuttanut funktiot, annettu pääohjelma toimii seuraavasti:

Seaching for same students from two different courses
* Same student in two courses: Mortti --- 2001-01-01
* Same student in two courses: Vertti --- 2002-02-02

Searching for identical students from a course
* Identical students in a course: Mortti --- 2001-01-01

Searching for a certain student from a course
* Mortti --- 2001-01-01
* None

Testaa ohjelmaa myös muilla tapauksilla tekemällä sopivia muutoksia pääohjelmaan.

Vinkkejä tehtävän tekemiseen:

  • Student-tietueella on kentät name_ ja birth_day_. Kun sinulla on osoitin tällaiseen tietueeseen:

    Student* student;
    

    niin voit viitata kenttiin esimerkiksi näin:

    student->name_
    

    Tällaisissa viittauksissa pidä huolta siitä, että osoitin todella osoittaa johonkin, sillä jos sen arvo on nullptr (eli se ei osoita mihinkään), niin ohjelma kaatuu yllä olevan tyylisiin viittauksiin.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.