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.

182 lines
4.2 KiB

4 years ago
  1. ## 4 Erilaisten kuvioiden piirtäminen
  2. **Tehtävä:**
  3. Luvun viimeisessä tehtävässä sinun tulee laatia funktio "TulostaKuviot", joka saa parametrina osoitintaulukon edellisistä tehtävistä tuttuun Kuvio-luokkaan. Taulukko sisältää Kuvio-luokasta periytettyjä oliota, jotka on muodostettu luokista Nelio ja Nelikulmio.
  4. Funktion tulee tulostaa taulukon sisältämät oliot (yhteensä 3 oliota) esimerkkitulosteen mukaisesti hyödyntäen Nelio- ja Nelikulmio-luokkien yliluokassa (Kuvio) määriteltyä "Piirra" funktiota. Piirra-funktio ei saa parametreja, eikä se palauta arvoa.
  5. Laatimasi funktion prototyyppi on kirjoitettu valmiiksi: `void TulostaKuviot(Kuvio* kuviotaulukko[3]);`
  6. Huomaa, että ohjelman eri ajokerroilla taulukon sisältämät oliot ja niiden määrittelyluokat vaihtelevat. Polymorfismin ansiosta tällä ei ole kuitenkaan vaikutusta sinun funktiosi toteutuksessa.
  7. Example output:
  8. ```
  9. Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 2
  10. Anna muodostettavan nelikulmion sivun korkeus: 3
  11. Anna muodostettavan nelikulmion sivun leveys: 4
  12. Syötä merkki, jota käytetään nelikulmion tekstuurina: %
  13. Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 1
  14. Anna muodostettavan neliön sivun pituus: 2
  15. Syötä merkki, jota käytetään neliön tekstuurina: E
  16. Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): 1
  17. Anna muodostettavan neliön sivun pituus: 6
  18. Syötä merkki, jota käytetään neliön tekstuurina: &
  19. Muodostetut kuviot piirrettynä:
  20. %%%%
  21. %%%%
  22. %%%%
  23. EE
  24. EE
  25. &&&&&&
  26. &&&&&&
  27. &&&&&&
  28. &&&&&&
  29. &&&&&&
  30. &&&&&&
  31. ```
  32. **Vastaus:**
  33. ```
  34. //** Pre-defined code in the assignment **//
  35. #include<iostream>
  36. using namespace std;
  37. class Kuvio
  38. {
  39. public:
  40. Kuvio(char tekstuuri);
  41. char PalautaTekstuuri();
  42. virtual void Piirra() = 0;
  43. private:
  44. char tekstuuri_;
  45. };
  46. Kuvio::Kuvio(char tekstuuri) : tekstuuri_(tekstuuri)
  47. {
  48. }
  49. char Kuvio::PalautaTekstuuri()
  50. {
  51. return tekstuuri_;
  52. }
  53. class Nelio : public Kuvio
  54. {
  55. public:
  56. Nelio(char tekstuuri, int sivun_pituus);
  57. void Piirra();
  58. private:
  59. int sivun_pituus_;
  60. };
  61. Nelio::Nelio(char tekstuuri, int sivun_pituus) : Kuvio(tekstuuri),
  62. sivun_pituus_(sivun_pituus)
  63. {
  64. }
  65. void Nelio::Piirra()
  66. {
  67. int i, j;
  68. for (i=0; i<sivun_pituus_; i++)
  69. {
  70. for(j=0; j<sivun_pituus_; j++)
  71. {
  72. if(j == sivun_pituus_ - 1) {
  73. cout << PalautaTekstuuri() << endl;
  74. }
  75. else
  76. {
  77. cout << PalautaTekstuuri();
  78. }
  79. }
  80. }
  81. }
  82. class Nelikulmio : public Kuvio
  83. {
  84. public:
  85. Nelikulmio(char tekstuuri, int korkeus_, int leveys_);
  86. void Piirra();
  87. private:
  88. int korkeus_;
  89. int leveys_;
  90. };
  91. Nelikulmio::Nelikulmio(char tekstuuri, int korkeus, int leveys) :
  92. Kuvio(tekstuuri), korkeus_(korkeus), leveys_(leveys)
  93. {
  94. }
  95. void Nelikulmio::Piirra()
  96. {
  97. int i, j;
  98. for (i=0; i<korkeus_; i++)
  99. {
  100. for(j=0; j<leveys_; j++)
  101. {
  102. if (j == leveys_ - 1)
  103. {
  104. cout << PalautaTekstuuri() << endl;
  105. }
  106. else
  107. {
  108. cout << PalautaTekstuuri();
  109. }
  110. }
  111. }
  112. }
  113. void TulostaKuviot(Kuvio* kuviotaulukko[3]);
  114. int main()
  115. {
  116. int sivun_leveys, sivun_korkeus, i, valinta;
  117. char tekstuuri;
  118. Kuvio* kuviot[3];
  119. for(i=0; i<3; i++)
  120. {
  121. cout << "Muodostetaanko neliö (syötä 1) vai nelikulmio (syötä muu luku): ";
  122. cin >> valinta;
  123. if (valinta == 1)
  124. {
  125. cout << "Anna muodostettavan neliön sivun pituus: ";
  126. cin >> sivun_leveys;
  127. cout << "Syötä merkki, jota käytetään neliön tekstuurina: ";
  128. cin >> tekstuuri;
  129. kuviot[i] = new Nelio(tekstuuri, sivun_leveys);
  130. }
  131. else
  132. {
  133. cout << "Anna muodostettavan nelikulmion sivun korkeus: ";
  134. cin >> sivun_korkeus;
  135. cout << "Anna muodostettavan nelikulmion sivun leveys: ";
  136. cin >> sivun_leveys;
  137. cout << "Syötä merkki, jota käytetään nelikulmion tekstuurina: ";
  138. cin >> tekstuuri;
  139. kuviot[i] = new Nelikulmio(tekstuuri, sivun_korkeus, sivun_leveys);
  140. }
  141. }
  142. cout << endl << "Muodostetut kuviot piirrettynä:" << endl << endl;
  143. TulostaKuviot(kuviot);
  144. return 0;
  145. }
  146. //** ---------- ---------- ---------- **//
  147. void TulostaKuviot(Kuvio* kuviotaulukko[3]) {
  148. for (int i = 0; i < 3; i++) {
  149. kuviotaulukko[i]->Piirra();
  150. cout << endl;
  151. }
  152. }
  153. ```