C++ fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.8 KiB

4 years ago
  1. ## 2 Auto-Henkilo -assosiaatio
  2. **Tehtävä:**
  3. Tässä tehtävässä on valmiiksi kirjoitettu luokka Auto, joka sisältää kaksi jäsenmuuttujaa. Ensimmäinen on string-tyypin muuttuja merkki_, joka kuvaa auton merkkiä. Toinen muuttujista on ajetut_km_, joka kuvaa autolla ajettujen kilometrien määrää.
  4. Edellisten lisäksi Auto-luokassa on:
  5. - Parametrillinen muodostin, joka välittää muodostettavalle auto-oliolle merkin ja ajettujen kilometrien määrän annetussa järjestyksessä.
  6. - Funktio Liiku, joka ottaa vastaa kokonaislukutyypin arvon, jolla imaistaan liikuttavien kilometrien määrää. Funktio lisää vastaanotetun arvon muuttujaan ajetut_km_ ja tulostaa esimerkkitulosteen mukaisen tekstin näytölle.
  7. - Funktio KerroAjetutKm, joka sitä kutsuttaessa tulostaa autolla ajettujen kilometrien määrän.
  8. Sinun tehtävänäsi on muodostaa Henkilo-luokka, jolla on osoittimen avulla toteutettu assosiaatiosuhde Auto-luokkaan. Henkilo-luokka tarvitsee kaksi jäsenmuuttujaa: henkilön nimen (string) ja osoittimen Auto-luokan olioihin. Edellisten jäsenmuuttujien lisäksi Henkilo-luokkaan pitää määritellä ja toteuttaa seuraavat palvelut:
  9. - Parametrillinen muodostin, joka muodostaa uuden henkilön ja sijoittaa olion jäsenmuuttujiin parametrina saadut nimen ja osoittimen tiettyyn auto-olioon.
  10. - Funktio AjaAutoa, joka saa kokonaislukutyypin parametrin, jolla ilmaistaan ajettavien kilometrien määrän. AjaAutoa-funktion tehtävänä on kutsua Auto-luokan Liiku funktiota, jolle ajettavien kilometrien lukumäärä välitetään.
  11. - Funktio VaihdaAutoa, joka saa parametrina osoittimen uuteen auto-olioon ja jonka funktio vaihtaa entisen auton tilalle. Huomaa, että vanhaa auto ei tarvitse, eikä pidä tuhota.
  12. Pääohjelma, jossa vastaustasi testataan, muodostaa kaksi autoa ja yhden henkilön. Henkilö ajaa ensin toista autoa, vaihtaa autoa ja ajaa uudella autolla. Lisäksi auto-oliota pyydetään tulostamaan ajettuja kilometrejä luokkien välisen assosiaation toimimisen toteamiseksi.
  13. Example output:
  14. ```
  15. Toyota Corolla DX merkkisellä autolla on ajettu 25000 km
  16. Wrooom...1000 kilometriä ajettu.
  17. Toyota Corolla DX merkkisellä autolla on ajettu 26000 km
  18. Ferrari F50 merkkisellä autolla on ajettu 1500 km
  19. Wrooom...20000 kilometriä ajettu.
  20. Ferrari F50 merkkisellä autolla on ajettu 21500 km
  21. ```
  22. **Vastaus:**
  23. ```
  24. //** Pre-defined code in the assignment **//
  25. #include<iostream>
  26. using namespace std;
  27. class Auto
  28. {
  29. public:
  30. void Liiku(int km);
  31. void KerroAjetutKm();
  32. Auto(string merkki, int ajetut_km);
  33. private:
  34. string merkki_;
  35. int ajetut_km_;
  36. };
  37. Auto::Auto(string merkki, int ajetut_km) : merkki_(merkki), ajetut_km_(ajetut_km)
  38. {
  39. }
  40. void Auto::Liiku(int km)
  41. {
  42. ajetut_km_ = ajetut_km_ + km;
  43. cout << "Wrooom..." << km << " kilometriä ajettu." << endl;
  44. }
  45. void Auto::KerroAjetutKm()
  46. {
  47. cout << merkki_ << " merkkisellä autolla on ajettu " << ajetut_km_ << " km" << endl;
  48. }
  49. //** ---------- ---------- ---------- **//
  50. class Henkilo
  51. {
  52. public:
  53. Henkilo(string nimi, Auto* car);
  54. void AjaAutoa(int km);
  55. void VaihdaAutoa(Auto* car);
  56. private:
  57. string nimi_;
  58. Auto* car_;
  59. };
  60. Henkilo::Henkilo(string nimi, Auto* car) : nimi_(nimi), car_(car)
  61. {
  62. Auto* car_ = car;
  63. nimi_ = nimi;
  64. }
  65. void Henkilo::AjaAutoa(int km)
  66. {
  67. car_->Liiku(km);
  68. }
  69. void Henkilo::VaihdaAutoa(Auto* car)
  70. {
  71. car_ = car;
  72. }
  73. //** Pre-defined code in the assignment **//
  74. int main()
  75. {
  76. Auto* deksteri = new Auto("Toyota Corolla DX", 25000);
  77. Auto* ferrari = new Auto("Ferrari F50", 1500);
  78. Henkilo* autoilija = new Henkilo("James", deksteri);
  79. deksteri->KerroAjetutKm();
  80. autoilija->AjaAutoa(1000);
  81. deksteri->KerroAjetutKm();
  82. ferrari->KerroAjetutKm();
  83. autoilija->VaihdaAutoa(ferrari);
  84. autoilija->AjaAutoa(20000);
  85. ferrari->KerroAjetutKm();
  86. return 0;
  87. }
  88. //** ---------- ---------- ---------- **//
  89. ```