Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Periytymistehtävä

Ben [23.05.2009 17:44:37]

#

Tehtävä:

tehtävä kirjoitti:

Tässä tehtävässä sinun tulee toteuttaa luokka öAutoö, joka periytyy öAjoneuvoö luokasta. Luokan öAjoneuvoö määrittely on seuraava:

class Ajoneuvo
{
public:
  Ajoneuvo(int ajetut, int paino, string merkki, string malli);

protected:
  void Liikuta(int km);
  int PalautaAjetut();
  int PalautaPaino();
  string PalautaMerkki();
  string PalautaMalli();

private:
  int ajetut_;
  int paino_;
  string merkki_;
  string malli_;
};

Ajoneuvo-luokka on melko yksinkertainen. Funktio öLiikutaö saa parametrina kilometrimäärän, jonka mukaisella määrällä kasvatetaan jäsenmuuttujan öajetut_ö arvoa.

Funktiot öPalautaXö palauttavat nimensä mukaiset arvot funktiota kutsuvalle ohjelman osalle. Huomaa, että luokan kaikki funktiot on määritelty öprotectedö määreellä, joten niiden palveluja voidaan hyödyntää vain Ajoneuvo-luokan aliluokissa.

Sinun tehtävänäsi on laatia luokan määrittely ja jäsenfunktioden toteutus luokkaan öAutoö, joka perii luokan öAjoneuvoö. Auto-luokka sisältää kaksi autolle ominaista jäsenmuuttujaa: string-tyypin örekisteri_nro_ö ja int-tyypin ömatkustajat_max_ö, joka kuvaa autolle suurinta sallittua matkustajamäärää.

Auto-luokkaan on tehtävä parametrillinen muodostin, jolle välitetään auton muodostamiseen tarvittavat tiedot (ajetut_, paino_, merkki_, malli_, rekisteri_nro_ ja matkustajat_max_). Osa parametreista välitetään Auto-luokan muodostajassa Ajoneuvo-luokan muodostajalle. Sinun tulisi kyetä päättelemään, mitkä.

Muodostimen lisäksi Auto-luokkaan kirjoitetaan kaksi funktiota, joista ensimmäinen on öTulostaAutonTiedot()ö, joka tulostaa auton tiedot mukaan lukien sen yläluokassa olevat tiedot. Funktio ei palauta arvoa, eikä ota vastaan arvoja. Tulostuksen muoto ilmenee esimerkkitulosteesta.

Toinen varsinainen funktio Auto-luokassa on öAjaAutoa(km)ö, jonka tehtävänä on käyttää yliluokan palvelua öLiikuta()ö ajettujen kilometrien kirjaamiseksi. Lisäksi funktio öAjaAutoa()ö tulostaa näytölle ajettujen kilometrien määrän.

Toteuttamaasi periytettyä luokkaa testataan seuraavalla pääohjelmalla (älä kopioi pääohjelmaa vastaukseesi):

int main()
{
  Auto pirssi(250000, 1700, "Toyota", "Carina II", "TFM-257", 5);
  pirssi.TulostaAutonTiedot();
  pirssi.AjaAutoa(25000);
  pirssi.TulostaAutonTiedot();
  return 0;
}

Esimerkkitulostus

Merkki: Toyota
Malli: Carina II
Paino: 1700
Ajetut kilometrit: 250000
Rekisterinumero: TFM-257
Maksimi matkustajien määrä: 5

Autolla ajettu 25000 kilometriä.

Merkki: Toyota
Malli: Carina II
Paino: 1700
Ajetut kilometrit: 275000
Rekisterinumero: TFM-257
Maksimi matkustajien määrä: 5

Ja koodi:

class Auto : private Ajoneuvo
{
public:

Auto(int ajetut_, int paino_, string merkki_, string malli_, string rekisteri_nro_, int matkustajat_max_);
void TulostaAutonTiedot();
void AjaAutoa(int km);

private:

   int ajetut_;
   int paino_;
   string merkki_;
   string malli_;
   string rekisteri_nro_;
   int matkustajat_max_;
};

Auto::Auto(int ajetut_, int paino_, string merkki_, string malli_, string rekisteri_nro_, int matkustajat_max_) : Ajoneuvo( ajetut_,  paino_,  merkki_,  malli_)
{
}


void Auto::TulostaAutonTiedot()
{
cout << "Merkki: " << PalautaMerkki() << "\n" ;
cout << "Malli: " << PalautaMalli() << "\n" ;
cout << "Paino: " << PalautaPaino()  << "\n";
cout << "Ajetut kilometrit:: " << PalautaAjetut()<< "\n";
cout << "Rekisterinumero: "<< << "\n";

cout << "Maksimi matkustajien määrä: " <<   << "\n\n";
}
void Auto::AjaAutoa(int km)
{
 cout << "Autolla ajettu 25000 kilometriä. " << PalautaAjetut() << "\n\n" ;
}

Kysymys Mikä funktio tulostaa Rekisterinumero ja maksimi matkustejien määrä?

Mod. lisäsi kooditagit ja lainausmerkinnän, viitsitkö jatkossa lisätä itse?

Sami [23.05.2009 17:52:46]

#

Ne mitkä oletettavasti sinun pitäisi tehdä tuossa tehtävässä siihen periytettyyn luokkaan.

Edit. Tai sitten vaan tuossa tulostuksessa laitat sinne coutiin ne tarvittavat arvot.

Metabolix [23.05.2009 19:04:44]

#

Voisit aina hieman tarkemmin selittää, mikä on ongelmasi. Kun noin suoraan kopioit tehtäviä tänne, on vaikea sieltä bongata, mikä kysymyksistä on se itse kirjoittamasi. Lisäksi voisit yrittää karsia turhat tiedot pois; tuonkin tilanteen voisi selittää parilla rivillä:

Kysymys kirjoitti:

Luokka Ajoneuvo sisältää yksityiset muuttujat a, b ja c sekä suojatut funktiot näiden hakemiseen. Auto periytyy tästä (class Auto: private Ajoneuvo) ja sisältää lisäksi muuttujat x ja y. Miten saan tulostettua muuttujan x arvon jäsenfunktiossa Auto::TulostaAutonTiedot?

Ja tiivis vastaus tiiviiseen kysymykseen:

void Auto::TulostaAutonTiedot() {
  std::cout << "Auton jäsen x = " << x << std::endl;
}

Kun nyt kerran koko koodin laitoit, niin kommentoinpa muutamaa asiaa, joiden pitäisi kyllä selvitä kurssimateriaalistasikin:

Ajoneuvo-luokan sisältämiä muuttujia ei kuulu määritellä uudestaan. Auto-luokassa kuuluu siis olla vain rekisterinumero ja henkilöiden määrä, joita ei ennestään vielä ole. Niitä ei myöskään tarvitse hakea funktioilla, vaan voit käyttää ihan suoraan kyseistä jäsenmuuttujaa. (Tämän näet jo tiiviistä vastauksesta.)

AjaAutoa on selvästi väärin toteutettu, senhän kuuluisi tulostaa vain, paljonko autolla nyt ajetaan eikä lainkaan aiempia tietoja. Et myöskään ole toteuttanut tämän funktion muuta toiminnallisuutta:

tehtävä kirjoitti:

öAjaAutoa(km)ö, jonka tehtävänä on käyttää yliluokan palvelua öLiikuta()ö ajettujen kilometrien kirjaamiseksi.

Auton kannattaisi ehkä olla protected Ajoneuvo eikä private Ajoneuvo, koska jos periytät autosta vaikka kuorma-auton, haluat ehkä edelleen päästä käsiksi Ajoneuvolta perittyihin jäseniin.

Teuro [23.05.2009 20:02:05]

#

Pääluokan metodeita voi lisäksi kutsua aliluokasta aivan normaalisti, kunhan näkyvyysalueet on määritelty oikein. Alla olevassa esimerkissä on kantaLuokanMetodi(int x) ja peritynLuokanMetodi(int x).

void perittyLuokka::peritynLuokanMetodi(int x){
	this->kantaLuokanMetodi(x);
}

Mikäli tämä oli selvää, kuten olettaa kaiketi sopii, niin lopun tehtävästä tulisi olla aika lailla mekaanista koodaamista. Omasta ratkaisustani tuli lopulta 90 rivin pituinen.

amph [26.05.2009 00:53:10]

#

Metabolix kirjoitti:

Voisit aina hieman tarkemmin selittää, mikä on ongelmasi. Kun noin suoraan kopioit tehtäviä tänne, on vaikea sieltä bongata, mikä kysymyksistä on se itse kirjoittamasi. Lisäksi voisit yrittää karsia turhat tiedot pois; tuonkin tilanteen voisi selittää parilla rivillä

Suora kopiointi josta mainitset, on mielestäni kovinkin hyödyllinen varsinkin näin alottelevalle 'ohjelmoijalle' kuin minä, luultavasti moni muukin etsii juuri tällaisia tehtäviä. Se ettei vastausta edes ole tässä tapauksessa saatavilla, laittaa todella yrittämään ja etsimään itse tietoa miten saada oikea vastaus, ja miten kenties parannella sitä.

Jos tämä suora kopio on jostain sivulta, vaadin linkin sivulle ;)

Itse aiheeseen en vielä uskalla sanoa ohjeitani :D

Teuro [26.05.2009 12:07:15]

#

amph kirjoitti:

Suora kopiointi josta mainitset, on mielestäni kovinkin hyödyllinen varsinkin näin alottelevalle 'ohjelmoijalle' kuin minä, luultavasti moni muukin etsii juuri tällaisia tehtäviä. Se ettei vastausta edes ole tässä tapauksessa saatavilla, laittaa todella yrittämään ja etsimään itse tietoa miten saada oikea vastaus, ja miten kenties parannella sitä.

Tässä tapauksessa kysymys, joka tosin jäi hiukan epäselväksi, oli esitetty niin hankalassa muodossa, että vastauksen antaminen ei ollut helppoa. Tämä kyseinen tehtävä itsessään on varsin helppo toteuttaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta